面向对象的三个特性:封装、继承、多态
第一个特性:封装
一、概念
封装:给类设置一个边界,用以对内部的数据起到一定的保护作用。
封装的实现:①属性私有
private 属性类型 变量名=值;
②对属性提供公开的get、set方法
private 关键字/访问修饰符:私有,代表只能在本类内部使用。
public 关键字/访问修饰符:公开、代表在任何地方都可以使用。
get:获取属性的值
public 返回值类型 getName(){
//返回值类型同属性类型一值,没有参数
return this.name;
}
set:设置/修改 属性的值
public viod setName(Sting name){
//返回值类型viod 参数类型的属性类型
this.name=name;
}
案例:
二、封装的要求
①对所有属性私有化,private修饰。
②对私有化属性提供公开的get/set方法
第二个特性:继承
一、继承
1、继承体现的是类之间的 is-a 关系
A is-a B 关系成立,则称A继承B
A 继承 B
A就是子类 B就是父类
子类 extends 父类
语法:
class 子类 extends 父类{}
2、通过继承机制,子类可以直接使用父类的属性和方法。
3、继承体现了的类之间本身的一种“is-a”关系,不能强制使用继承
二、继承的好处
1、继承体现了代码的可复用性
注意:一个父类可以同时具有多个子类,每一个子类通过继承关系都可以直接使用父类中的属性和方法。
2、继承体现了代码的可扩展性
注意:子类可以定义自身独有的属性和方法
三、方法的覆盖(Override,重写)
1、概念:在子类中定义和父类相同的方法
2、方法覆盖的要求
①子类方法的方法名、形参列表、返回值类型和父类相同
②子类的访问修饰符和父类的相同或是比父类的更宽
3、使用:子类引用 . 方法名(实参);//优先使用子类覆盖的方法
4、注意:
(1)子类中的方法 方法名、形参泪飙和父类相同,但返回值类型不同,则不能构成方法覆盖,编译报错。
(2)子类的方法:方法名、返回值类型和父类形同;但形参列表和父类不同,则不能构成方法覆盖:但是编译能通过,因为构成了昂发的重载,运行是根据给定的
实参来决定调用父类大方法还是子类的方法。
四、父类的来源
1、根据每一个子类定一个共同的类别,决定父类类名
2、父类中的属性和方法抽取每一个子类的共性
3、父类中的信息是一般的、抽象的;子类中的信息是特殊的、具体的。
4、抽取父类时,尽可能的就近提取。
五、Java类之间继承的特点
(1) 继承特点:Java类之间是单继承,即一个类只能有一 个直接父类、但是可以多级继承,即一个类可以有多个 间接父类
(2) Java类之间的单继承体现了Java语言的简单性
六、super的应用
- 第一种应用: super.
- super. 应用在子类的成员方法或是构造方法中, 访问父类的属性或是成员方法
(2) super. 属性名 代表 访问父类的属性 super.成员方法名(实参); 代表访问父类的成员方法 注意:super. 没有位置的要求(应用在子类的方法 中)
- 第二种应用:super()
(1) super() 应用在子类的构造方法中的第一行有效 语句,指示创建子类对象时,jvm默认创建一个父 类对象时,具体利用父类的哪一个构造方法完成父 类对象的创建
(2) super();代表jvm默认创建父类对象时利用无参 数的构造方法完成父类对象的创建 super(实参); 代表jvm默认创建父类对象时利用对应 有参数构造方法完成父类对象的创建
(3) 如果子类的构造方法中没有使用 super()/super(实参),则jvm会默认在子类构造方法 中的第一行添加 super();代表jvm创建父类对象时,默认使用父类的无参数 的构造方法
(4) 一个子类构造方法中不能同时使用 this()/this(实 参) 和 super()/super(实参);而且子类的一个构造 方法第一行一旦使用了this()/this(实参),jvm不会再 添加默认的super()
(5) 如果子类的构造方法的第一行使用了 this()/this(实参),则jvm会放弃在当前构造方法中查 找所需要的super(),根据this()/this(实参)调用的构 造方法中的第一行查找super()
第三个特性:多态
一、多态的概念
1.多态:父类型的应用可以指向不同的子类型的对象
语法:
父类型 引用名 =new 子类名();
Animal a=new Dag();
2.以父类型引用调用属性和方法,只能调用父类中定 义的属性和方法
3.运行的时候,jvm会自动的检测子类是否覆盖父类 中方法,如果覆盖则执行子类覆盖后的方法,否则 直接执行父类中方法
二、引用之间的转换
1、 父类型的引用 赋值 给子类型的引用,需要强制类型 转换 大类型 小类型
语法:子类型类名 引用名 = (子类型类名)父类型 引用名;
Dog d = (Dog)a;
结果:编译一定,运行是需要检测实际存储的对 象类型和要转换的类型是否一致:
a. 实际存储的对象类型 和转换类型 一致,编译通 过,运行也通过 Animal a = new Dog();// 实际存储的对象类型为 Dog Dog d = (Dog)a;// 要转换的类型 也为Dog。
b. 实际存储的对象类型和要转换的类型不一致,编 译通过,但是运行报错,报错的错误为: java.lang.ClassCastException(类型转换异常)
Animal a = new Cat(); // 实际存储的对象类型为Cat
Dog d = (Dog)a; // 要转换的类型为:Dog
2、 子类型的引用 赋值给 父类型的引用 ,直接赋值即 可,体现多态
(小类型) 大类型
(1) 语法:父类类名 引用名 = 子类型的引用;
(2) 案例:Dog d = new Dog(); Animal a = d;
以上两种引用赋值双方存在继承关系
3、 转换的双方没有继承关系,则不能相互转换,强制 类型转换也不可以 Animal a = new Dog(); Person p = (Person)a;
三、instanceof 的应用
1、语法:引用名 instanceof 类名
2、结果:类型为boolean,true或是false
3、含义:将引用名中存储的实际对象 和 instanceof 后 面的类名对应的类型相比,如果实际对类型类型兼
容后面的类型,则结果true;如果不兼容结果为 false
四、多态的开发实际应用
1、 多态应用在数组上,数组的数据类型为父类型:本 类型+所有的子类型的对象都可以作为元素进行存储
2、多态应用在形式参数上,形式参数为父类型:本类 型+所有子类型的对象都可以作为 实际参数进行传 递
3、 多态应用在返回值上,返回值类型为父类型:本类 型+所有子类型的对象都可以作为返回值返回