您的位置:首页 > 其它

3 :面向对象初级

2015-10-26 16:22 155 查看
类和面向对象特点:1,面向对象就是一种常见的思想。符合人们的思考习惯。2,面向对象的出现,将复杂的问题简单化。3,面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。




成员变量和局部变量类其实就是在定义类中的成员。成员:成员变量<-->属性,成员函数<-->行为。成员变量和局部变量的区别:1,成员变量定义在类中,整个类中都可以访问。局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。2,成员变量存在于堆内存的对象中。局部变量存在于栈内存的方法中。3,成员变量随着对象的创建而存在,随着对象的消失而消失。局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。4,成员变量都有默认初始化值。局部变量没有默认初始化值。


基本:string、int、char之类的引用:数组、对象、接口基本数据和引用数据类型是如何传递的?

类类型的变量参数传递,提高代码复用性



封装和隐藏private:私有,是一个权限修饰符。用于修饰成员(变量和函数)。通过getxx和setxx方法访问,对xx进行了封装,不是直接对xx操作私有的内容只在本类中有效。注意:私有仅仅是封装的一种体现而已。但封装不是私有。
this当成员变量和局部变量重名,可以用关键字this来区分。this:代表对象。代表哪个对象呢?当前对象。this就是所在函数所属对象的引用。简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
this也可以用于在构造函数中调用其他构造函数。注意:只能定义在构造函数的第一行。因为初始化动作要先执行。





构造器
构造函数:构建创造对象时调用的函数。作用:可以给对象进行初始化。创建对象都必须要通过构造函数初始化。
一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。重载了
一般函数和构造函数什么区别呢?构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。一般函数:对象创建后,需要函数功能时才调用。
构造函数:对象创建时,会调用只调用一次。一般函数:对象创建后,可以被调用多次。

什么时候定义构造函数呢?在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。构造函数可以有多个,用于对不同的对象进行针对性的初始化.多个构造函数在类中是以重载的形式来体现的。


细节:1,构造函数如果完成了set功能。set方法是否需要。2,一般函数不能直接调用构造函数。3,构造函数如果前面加了void就变成了一般函数。4,构造函数中是有return语句的。只不过是隐藏不写了构造函数图解

构造函数间调用



staticStringname;//成员变量,实例变量staticStringcountry="CN";//静态变量。类变量
static的特点:1,static是一个修饰符,用于修饰成员。2,static修饰的成员被所有的对象所共享。3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。4,static修饰的成员多了一种调用方式,就可以直接被类名所调用。类名.静态成员。5,static修饰的数据是共享数据,对象中的存储的是特有数据。
成员变量和静态变量的区别?1,两个变量的生命周期不同。成员变量随着对象的创建而存在,随着对象的被回收而释放。静态变量随着类的加载而存在,随着类的消失而消失。生命周期长2,调用方式不同。成员变量只能被对象调用。静态变量可以被对象调用,还可以被类名调用。3,别名不同。成员变量也称为实例变量。静态变量称为类变量。4,数据存储位置不同。成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.

静态使用的注意事项:1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)2,静态方法中不可以使用this或者super关键字。3,主函数是静态的。
主函数主函数特殊之处:1,格式是固定的。2,被jvm所识别和调用。public:因为权限必须是最大的。static:不需要对象的,直接用主函数所属类名调用即可。

void:主函数没有具体的返回值。main:函数名,不是关键字,只是一个jvm识别的固定的名字。String[]args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。

静态什么时候用?1,静态变量。当分析对象中所具备的成员变量的值都是相同的。这时这个成员就可以被静态修饰。只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。2,静态函数。函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用,而仅创建对象调用非静态的没有访问特有数据的方法,该对象的创建是没有意义。浪费空间,静态的话是存在静态区的





代码块静态代码块。随着类的加载而执行。而且只执行一次。静态成员是是随着类的加载就存在于静态区作用:用于给类进行初始化。直接intnum=3也可以初始化,但是静态代码块可以在里边运算变值
classStaticCode{

staticintnum;

static

{

num=10;

//	num*=3;

System.out.println("hahahah");

}

StaticCode(){}

staticvoidshow(){

System.out.println(num);

}

[/code]
构造代码块
classPerson{

privateStringname;

{//构造代码块。可以给所有对象进行初始化的。

System.out.println("constructorcode");

//	cry();

}


static{

System.out.println("staticcode");

}


Person()//是给对应的对象进行针对性的初始化。{

name="baby";

//	cry();用构造代码块替代,提高代码服用性

}

Person(Stringname){

this.name=name;

//	cry();

}

publicvoidcry(){

System.out.println("哇哇");

}

[/code]局部代码块
publicvoidspeak()

{

System.out.println("name:"+name);

{}//限定局部变量的生命周期

}

[/code]如果都有,先执行静态代码块,如果有对象构造代码块先执行,然后局部代码块


继承继承的好处:1,提高了代码的复用性。2,让类与类之间产生了关系,给第三个特征多态提供了前提.
单继承:一个子类只能有一个直接父类。多继承:一个子类可以有多个直接父类(java中不允许,但进行了改良)不直接支持,因为多个父类中有相同成员,会产生调用不确定性。在java中是通过"多实现"的方式来体现。

java支持多层(多重)继承。C继承B,B继承A。就会出现继承体系。当要使用一个继承体系时,1,查看该体系中的顶层类,了解该体系的基本功能。2,创建体系中的最子类对象,完成功能的使用。
什么时候定义继承呢?当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种。xxxextendsyyy所属关系:isa关系。
在子父类中,成员的特点体现。1,成员变量。2,成员函数。3,构造函数。子类不能继承父类中私有的成员变量和方法
1,成员变量。当本类的成员和局部变量同名用this区分。当子父类中的成员变量同名用super区分父类。this和super的用法很相似。this:代表一个本类对象的引用。super:代表一个父类空间。

2,成员函数。当子父类中出现成员函数一模一样的情况,会运行子类的函数。这种现象,称为覆盖操作。这时函数在子父类中的特性。

函数两个特性:1,重载。同一个类中。overload2,覆盖。子类中。覆盖也称为重写,覆写。override覆盖注意事项:1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。2,静态只能覆盖静态,或被静态覆盖。什么时候使用覆盖操作?当对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就使用覆盖操作完成.

3,构造函数子父类中的构造函数的特点。在子类构造对象时,发现,访问子类构造函数时,父类也运行了。为什么呢?原因是:在子类的构造函数中第一行有一个默认的隐式语句。super();子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。为什么子类实例化的时候要访问父类中的构造函数呢?

那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。所以子类在构造对象时,必须访问父类中的构造函数。为什么完成这个必须的动作,就在子类的构造函数中加入了super()语句。如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义第一行。所以只能有一个。但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。


一个对象实例化过程:zip=newzi();1,JVM会读取指定的路径下的zi.class文件,并加载进内存,并会先加载zi的父类(如果有直接的父类的情况下).2,在堆内存中的开辟空间,分配地址。3,并在对象空间中,对对象中的属性进行默认初始化。4,调用对应的构造函数进行初始化。5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。6,父类初始化完毕后,在对子类的属性进行显示初始化。7,在进行子类构造函数的特定初始化。8,初始化完毕后,将地址值赋值给引用变量.


设计模式:对问题行之有效的解决方式。其实它是一种思想。
单例设计模式。解决的问题:就是可以保证一个类在内存中的对象唯一性。
必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性呢?1,不允许其他程序用new创建该类对象。2,在该类创建一个本类实例。3,对外提供一个方法让其他程序可以获取该对象。






饿汉式
classSingle//类一加载,对象就已经存在了

{

privatestaticSingles=newSingle();


privateSingle(){}


publicstaticSinglegetInstance()

{

returns;

}

}

[/code]
懒汉式
classSingle2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象

//延迟加载形式

{

privatestaticSingle2s=null;


privateSingle2(){}


publicstaticSingle2getInstance()

{

if(s==null)

s=newSingle2();

returns;

}

}

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: