Java面向对象的三大特征
特征一:封装(encapsulation)
1、含义:将一条至多条语句封装到一个容器中,封装的内容有属性和方法,这容器被称为类。
2、容器分为三类:属性、方法、类。【个人的理解】
1)对属性信息的封装语法格式
private 数据类型 变量名;
2)对部分代码块的封装:
访问修饰符 返回值类型 方法名() {
一条或者多条代码语句;
}
3)对整体代码块的封装
语法格式:
访问修饰符 class 类名 {
一个属性或者多个属性;
一个方法或者多个方法;
}
3、特点
1)结构化。
2)重用性。
3)安全性。
4)小提示:一个类中只能定义一个public关键字修饰的外部类。
特征二:继承(extends)
1、含义:子承父业,在已存在的基类上去扩展新的类,只支持单继承。
2、语法格式:
class Student extends People {
一个属性或者多个属性;
一个方法或者多个方法;
}
3、继承的两种方式:
1)第一种:链式继承,一对一的关系。
A类继承B类,B类继承C类,C类继承D类,D类继承F,…
如图:
2)第二种:树形继承,一(父类)对多(子类)的关系。
B1类继承A类,B2类继承A类;
C1类继承B1类,C2类继承B1类,C3类继承B1类;
D1类继承B2类,D2类继承B2类,D3类继承B2类。
E1类继承C1类,E2类继承C1类;
F1类继承D3类,F2类继承D3类;
…
如图:
注:越往上层的类级别越高,也代表属性和方法越少。
4、类与类之间的继承特点:
1)只能继承父类的实例属性和实例方法。【对象级别的】
2)带有static、final、private关键字修饰的不会被子类所继承。
3)子类在初始化时,会优先初始化父类,在没有继承的情况下,所有的类默认会继承 Object类,此类在java.lang包下。
4)在没有定义有参构造情况下,系统会自动添加一个隐式的无参构造器。
5)在定义了有参构造器情况下,系统不会添加一个隐式的无参构造器、
6)this代表当前对象,super代表父类对象。
7)this关键字只能在本类作用域有效。
8)this()代表调用子类无参构造方法,super()代表调用父类无参构造方法。
9)子类当中有该调用的方法就调用子类中的方法,若没有则找从父类中去找调用的方法。
10)this()有参或者无参 和 super()有参或者无参 只能出现在构造器中的第一行,并且二者不能同时出现。
11)子类重写父类的方法不能抛出大于父类被重写的方法所抛出的异常。
12)父类不能调用子类特有的方法,而子类可以调用父类的普通方法(实例方法、属性)。
13)提高了代码的重用性。
14)耦合度较高。【类与类之间依赖或者接口与接口之间的依赖】。
15)为多态机制作做了一个铺垫。
5、继承初始化的顺序
第一步:子类的静态代码块
第二步:父类的静态代码块
第三步:父类构造代码块
第四步:父类的构造方法
第五步:子类的构造代码块
第六步:子类的构造方法。
6、方法重载(Overload) 和 方法重写(Overwrite)。
1、方法重载:在同一个类下,功能相似,保持方法名相同。
一个相同:方法名。
四个可不相同:访问修饰符、返回值类型、参数列表、方法体(方法内部的语句)。
1.1、例如:System.out.println(); 输出语句。
1)输出语句中的println()方法可以输出多种类型的数据:、float、double、boolean、Object对象数据。
2)功能:都是输出(打印)数据到控制台。
3)调用多个方法名相同时,此时就如同只在调用一个方法似的。
小提示:重载机制起初是从构造方法开始的。
2、方法重写:在继承情况下,父类已有的需求已经满足不了子类的需求时,此时就等重写父类中的普通方法。
三个相同:返回值类型、方法名、参数列表。
二个可不相同:访问修饰符 和 方法体(方法内部的语句),但访问修饰符不能低于父类的访问权限。
用途:扩大父类不能完成的功能 或者 完成子类特有的功能。【在子类满足不了需求时,才重写的】
7、小提示:
1)在继承之间,需检测以下是否符合:A is a B的逻辑关系。例如:鸟儿类(子类) 是 一个 动物类【属于】(父类)、学生或老师类(子类)是【属于】一个人类(父类)。。
2)接口可以弥补单继承的缺陷,一个类可以实现多个接口,而一个类只能继承一个类,但接口与接口之间也只支持单继承。
3)类与类之间只存在单向继承的关系,而类与接口之间存在多继承(实现)的关系。
4)不存在类与接口之间的继承。
5)类实现接口可以把它看做成类继承接口中的实例方法,需要重写接口中的方法。
6)接口与接口之间的继承类似于类与类之间的继承。
7)常说到的实体类不是抽象类,而指的是一个普通的类。【个人的理解,由于实体类中不能有抽象方法】
特征三:多态(polymorphism)
1、含义:一个方法的多种形态。(某个行为的多种状态)
2、两种多态机制:
第一种:编译时的多态机制,通过重载(override)机制来加以实现。
第二种:运行时的多态机制,通过重写(overwrite)机制来加以实现。
小提示:编译时看等于号左边,运行时看等于号右边,调用编译时和运行时的公共部分的方法。
3、转型语法:
例如:假设 Student类继承了 People 类。
1)向上转型:子类型转父类型。
语法:父类型 变量名 = new 子类型构造器();
People people= new Student();
2)向下转型:父类类型间接转子类型。
语法:子类型 变量名 = (子类型)已向上转型的父类型变量名;
Student xiaoMing = (Student)people;
3)小提示:
提示一:在向上转型的时候,建议 people对象是不是Student类的对象,使用 instancof运算符来判断,返回值类型是boolean类型【true:是;false:不是】。
例如:boolean isStudentObject = people instanceof Student;
提示二、向上转型只能调用父类在子类重写的方法。
提示三、向下转型可以使用子类特有的属性和方法。
4、使用多态机制的前提下需满足以下三点:
1)类之间有继承关系或者类实现了接口。
2)子类需要重写子类的方法,实现类需要实现接口中的方法。
3)父类引用指向子类对象。
5、小提示:
1)定义抽象方法而不在实体类中重写则毫无意义的存在,没有任何存在的价值。
2)在API帮助文档当中,有些抽象方法或者protected修饰的方法需要程序员继承该类并进行手动重写。
3)带有protected关键字修饰的属性和方法只能在同包或者不同子类下才能使用。
补充点:匿名类对象
匿名类对象:创建一个不带变量名的对象,只能使用一次。在学习中可以会遇到 new抽象名、new接口名情况。
1、new抽象名
1)定义了一个抽象类:abstract class A {}
2)new接口名
new A(){
重写抽象A类中所有的的抽象方法;【有就重写,没有就无需重写】
};
2、new接口名
1)定义了一个接口:interface B{}
2)new了一个匿名对象:
new B(){
重写接口中所有的抽象方法;【有就重写,没有就无需重写】
};
总结:new抽象名和new接口名其实是new了一个继承/实现它们的子类,继承关系是隐约式的,这个子类由虚拟机自动帮你生成,也是隐约式的,但是你得使用指定的格式并且需要手动重写父类所有的抽象方法。【个人的理解】