构造函数
特点:
1,函数名与类名相同
2,不能定义返回值类型
3,没有具体的返回值。
作用:给对象进行初始化
特点:对象创建时就运行。可以理解为构造对象时调用的函数
如果一个类中没有定义过构造函数,那么该类有个隐式的空构造函数,如果定义了构造函数,那么这个隐式的构造函数就没有了。
一般函数和构造函数的区别
构造函数:对象创建时,就会被调用,对对象进行特定的初始化
一般函数:在对象创建后,需要该功能时才被调用
构造函数:对象创建时调用,只能调用一次
一般函数:对象创建后可以调用多次
什么时候定义构造函数
在描述事物时,该事物一存在就具备的一些内容,就定义在构造函数中。
构造函数可以有多个,针对不同对象进行初始化,这些构造函数在类中是以重载的形式存在的。
注意:
1,构造函数如果完成了set功能,还是需要set方法。(初始化后需要对属性进行操作)
2,一般函数不能调用构造函数,构造函数能够调用一般函数。
3,构造函数前如果加了void就变成了一般函数。
4,构造函数中有隐式的return语句。(用于结束函数)
This关键字
当成员变量和局部变量重名时,可以用关键字this来区分
This就是所在函数所属对象的引用,代表对象,储存的是地址值。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
This(参数),构造函数调用构造函数用this语句。对当前对象进行初始化过程中,再进行一次其它初始化
注意:this语句只能定义在构造函数第一行
比如,类中有一个比较方法,需要比较对象的属性,由于该对象还没有建立不能直接应用,可以用this代表以后调用这个比较方法的对象。
Static关键字
static修饰成员。
用static修饰的成员是对象都能共享的数据,被静态修饰的数据不仅能被对象使用,还能被类直接调用。
Static的特点:
1.static是一个修饰符,用于修饰成员
2,static修饰的成员被所有的对象共享。
3,static修饰的成员能够被类名直接调用
4,static优先于对象存在,因为static的成员随着类的加载而加载
5,static修饰的数据时共享数据,对象中储存的数据时特有数据
成员变量和静态变量的区别:
1,两者的生命周期不一样,成员变量随着对象的建立而存在,随着对象的回收而释放,静态变量随着类的加载而加载,随着类的消失而消失。
2,两者的调用方式不一样。成员变量必须被对象调用,静态变量不仅能被对象调用,还能被类名直接调用。
3,别名不同。成员变量也叫实例变量,静态变量也叫类变量。
4,储存的位置不同。成员变量储存在堆内存中,静态变量储存在方法区的静态区中。
静态使用的注意事项:
1,静态方法只能访问静态成员,非静态方法既能访问静态成员,也能访问非静态成员
2,静态方法中不可以使用this和super关键字。
3,主函数是静态的。
主函数字面分析
主函数的格式是固定的,能被jvm识别并调用。
Public需要足够大的权限。Static 静态的 能够被类名直接调用。 Void 没有具体返回值。Main 能够被jvm识别。String[]args 传入的参数。
静态什么时候用
1,静态变量
当分析对象所具备的成员变量都相等,这个成员就可以被静态修饰。如果在对象中的数据时不同的,那就是特有数据,不能被静态修饰。
2,静态函数
如果该函数没有访问对象的特有数据,那么他可以被静态修饰。因为调用此方法跟对象没有关系,建议使用静态修饰,方便类名直接调用。
静态代码块
随着类的加载而执行,而且只执行一次。
作用:用于给类进行初始化。
定义在类中的代码块
构造代码块,直接被类名调用静态函数时,构造代码块不运行
只有在对象创建时才运行,用于给对象进行初始化。
构造函数是对对象进行针对性的初始化。构造代码块是给所有对象进行初始化。局部代码块是限定局部变量的存在周期。静态代码块给类进行初始化
将构造函数私有化
一个类中的方法都是静态的,该类是不需要创建对象的,为了保证不被创建该类对象,对构造函数进行私有化
单利设计模式
解决的问题:就是可以保证一个类在内存中对象的唯一性。
如何保证唯一性
1,不允许其它程序用new来创建该类对象。
2,在该类中创建一个本类实例。
3,对给提供一个方法能够给让其它程序获得该类对象
步骤
1,私有化该类的构造函数
2,通过new来创建一个本类对象
3,定义一个共有方法,返回该对象。
方法要么被对象调用,要么被类名调用
提供一个共有方法,使其能够被类名调用而不用创建对象,那么所返回的对象变量也需要被静态修饰,因为静态方法不能访问非静态成员。
继承
多个类中存在相同的属性和行为,将这些内容抽取到单独的一个类中,那么这些类就不用再定义这些内容,继承抽取出的类即可。
继承的好处
1,提高了代码的复用性
2,让类与类之间产生了关系,是多态的前提
单继承:一个子类只能有一个直接父类
多继承:一个子类可以有多个直接父类
当要使用一个继承体系时
1,要查看该体系中的顶层类,了解其基本功能和属性
2,创建该体系中最子类对象,完成功能的使用
什么时候定义继承
当类与类之间存在着所属关系时。
当本类中的成员和局部变量同名时用this区分,
当子父类中的成员变量同名时,用super区分
没有创建父类实例,父类的成员变量存在在子类的对象当中
子类不能直接访问父类中的私有内容。
函数的两个特性:1 重载 2覆盖
覆盖注意事项:
1,子类方法覆盖父类方法,子类方法的权限要大于父类方法的权限(当父类的方法是私有时,子类不能访问父类的方法,这个不叫覆盖)
2,静态只能覆盖静态,或者被静态覆盖。
什么时候使用覆盖操作
当对一个类进行子类扩展时,子类需要保留父类中的功能声明,但是子类中需要自己的特有内容,就需要覆盖。
覆盖只发生在函数上,成员变量没有覆盖
子类在创建对象时,父类中的私有成员也放入到了子类的对象中,只是子类不能直接访问
子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。子类继承父类之后,具有了父类的内容和行为,需要对其进行初始化。
如果父类中没有定义空参数构造函数,那么子类的构造函数中必须使用super来明确指向父类中的哪个构造函数。如果子类构造函数中使用this调用了本类的构造函数,那么这个构造函数的super就没有了,最后一个调用构造函数中肯定会指向父类中的一个构造函数。
注意:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
一个对象实例化过程:
Personp = new Person()
1,jvm会去读取指定路径下的Person.class文件,并加载进内存,并会先加载Person的父类。
2,在堆内存中开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先调用父类中的构造函数进行初始化。
6,父类初始化完毕后,再对子类的属性进行显示初始化。
7,再进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量。
Final关键字
Final可以修饰类,方法,变量。
Final修饰的类不可以被继承。
Final修饰的方法不可以被覆盖。
Final修饰的变量是一个常量。只能被赋值一次。
继承弊端:打破了封装性。
抽象类
抽象就从多个事物中将共性的,本质的东西抽离出来。
抽象类的特点
1,方法只有声明没有实现时,该方法就是抽象方法,被abstract修饰,抽象方法必须定义在抽象类中。
2,抽象方法不可以被实例化,因为抽象方法没有意义
3,抽象类必须由其子类覆盖了所有的抽象方法后,该子类才能被实例化,否则,这个子类还是抽象类。
抽象类和一般类的区别
相同点:抽象类和一般类都是用来描述事物,在内部定义了成员
不同
1,一般类有足够的信息描述事物。
抽象类描述事物的信息不足
2,一般类中不能定义抽象方法
抽象类中可以定义抽象方法,也可以定义非抽象方法
3,一般类可以被实例化
抽象类不可以被实例化
接口 interface
当以个抽象类的方法都是抽象方法时,这个类的另一个表现形式就是接口。
接口中的成员都有固定的修饰符
1,全局常量public static final
2,抽象方法public abstract
如果没有写时,系统会自己添加
一个类如果没有覆盖接口中的全部方法,那么这个类是一个抽象类
接口不可以被实例化
打印全局常量时,要使用子类或者接口名调用,不能直接打印
在java中不支持多继承,因为会出现调用的不确定性,一个类可以实现多个接口
不可以出现同名函数,不同返回值类型
一个类在继承另一个类的同时,可以实现多接口
接口的出现避免了单继承的局限性
接口与接口之间是继承关系,而且接口可以多继承
接口的特点
是对外暴露的规则
提高了程序的扩展性
降低了耦合性
接口与抽象类
相同点,都是不断向上抽取而来的
不同点:
1,抽象类需要被继承,而且只能单继承,接口需要被实现,可以多·实现
2,抽象类可以定义抽象方法和非抽象方法,接口中只能定义抽象方法
3,抽象类的继承是is a关系,子类属于父类,接口的实现时like a关系,继承了额外功能
多态
某一类事物的多种存在形式
父类的对象创建了子类(父类类型变量指向了子类实体)
简单说:就是一个对象对应着不同类型
多态在代码中的体现:父类或者接口的引用指向了子类实体。
多态的好处:
提高了代码的扩展性,前行定义的功能能够调用后期的内容。
弊端:前期定义的内容不能调用后期子类中的特有内容
多态的前提:
1,必须有继承或者实现关系
2,要有覆盖
用父类类型创建了子类对象,限制对子类特有功能的访问
向下转型的目的是为了使用子类中的特有方法
向下转型的子类可以再次向上转型,与用父类类型创建子类对象的效果一致
注意:对于转型,自始自终都是子类对象在进行转变。
Instanceof判断类型是否相同
多态成员的特点:
1,成员变量
编译时,参考引用变量所属的类中是否有调用的成员变量,有则通过,没有报错
运行时,运行参考引用变量所属类中的成员
2,成员函数
父类中如果没有这个方法,编译失败,如果有运行时运行子类中相同方法。
3,静态函数,运行参考引用变量所属类中的静态函数,对于静态方法,与对象无关,静态方法不涉及多态性
内部类
将一个类定义在另一个类的里面,对里面那个类就称为内部类
内部类访问特点:
1,内部类可以直接访问外部类中的成员。
2,外部类要访问内部类,必须建立内部类的对象。
内部类的形成
分析事物时,发现该事物描述中还有事物,而且这个事物还在访问外部事物的内容,这时就把内部事物定义成内部类
内部类在外部类的成员位置上,能被成员修饰符修饰
Outer.Inner a = newOuter().new Inner();
内部类是静态的
Outer.Inner a = newOuter.Inner();
内部类成员都是静态的
Outer.Inner.show();
内部类如果内部定义了静态成员,那么这个类就要被静态修饰
内部类可以放在局部位置上
匿名内部类
必须有前提:内部类必须继承或者实现一个外部类或者接口
匿名内部类:其实就是一个匿名子类对象,。
通常使用场景之一:当函数参数是接口类型时,而且接口中的方法不超过三个(不包含三),可以用匿名内部类做为参数进行实际操作
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima