Java的继承、封装和多态
- 一、封装
- 1、概念:
- 2、好处:
- 3、封装的实现步骤
- 二、继承
- 1、概念:
- 2、继承的好处:
- 3、语法规则:
- (1)方法的重写
- (2)final关键字:
- (3)super关键字
- (4)Object类
- 三、多态
- 1.引用多态
- 2.方法多态
- A.引用类型转换
- B.抽象类
- C.接口
一、封装
1、概念:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
2、好处:
- 实现了专业的分工
- 良好的封装能够减少耦合
- 类内部的结构能够自由修改
- 可以对成员进行更精确的控制
- 隐藏信息,实现细节
3、封装的实现步骤
1)将属性私有化,设为private类型
2)对所有私有属性创建Getters和Setters方法
public class Circle {
private double radius;
public final double getRadius() {
return radius;
}
public final void setRadius(double radius) {
this.radius = radius;
}
}
二、继承
1、概念:
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,父类是子类的一般化,子类是父类的特殊化(具体化)。
2、继承的好处:
子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用。
3、语法规则:
只要在子类加上extends关键字继承相应的父类就可以了:
子类 extends 父类;
(1)方法的重写
子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
重写要注意:
a、返回值类型
b、方法名
c、参数类型及个数
都要与父类继承的方法相同,才叫方法的重写。
重载和重写的区别:
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
(2)final关键字:
使用final关键字做标识有“最终的”含义。
a. final 修饰类,则该类不允许被继承。
b. final 修饰方法,则该方法不允许被覆盖(重写)。
c. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。
d. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
(3)super关键字
在对象的内部使用,可以代表父类对象。
a、访问父类的属性:super.age
b、访问父类的方法:super.eat()
(4)Object类
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。
Object类中的方法(可重写)
1、toString()
在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)。
2、equals()
equals()----返回值是布尔类型
3、getClass()
可以得到类对象,判断类型是否一样
4.hashCode()
计算对象的存储位置
三、多态
1.引用多态
父类的引用可以指向本类的对象; Animal an = new Animal();
父类的引用可以指向子类的对象; Animal an = new Dog();
2.方法多态
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!
注意: 继承是多态的基础。
A.引用类型转换
- 向上类型转换(隐式/自动类型转换),是小类型转换到大类型
2).向下类型转换(强制类型转换),是大类型转换到小类型(有风险,可能出现数据溢出)。
3)instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。
它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据
总结:在写程序的时候,如果要进行类型转换,
我们最好使用instanceof运算符来判断它左边的对象是否是它右边的类的实例,
再进行强制转换。
B.抽象类
定义:抽象类前使用abstract关键字修饰,则该类为抽象类。
1)抽象类是约束子类必须有什么方法,而并不关注子类如何实现这些方法
2) 抽象类应用场景:
a. 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法(可实现动态多态)。
b. 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免子类设计的随意性。
3) 抽象类定义抽象方法,只有声明,不需要实现。抽象方法没有方法体以分号结束,抽象方法必须用abstract关键字来修饰。
4)包含抽象方法的类是抽象类。抽象类中可以包含普通的方法,也可以没有抽象方法。
5)抽象类不能直接创建,可以定义引用变量来指向子类对象,来实现抽象方法。
C.接口
1、概念
接口可以理解为一种特殊的类,由全局常量和公共的抽象方法所组成。也可理解为一个特殊的抽象类,因为它含有抽象方法。
2、接口定义的基本语法
[修饰符] [abstract] interface 接口名 [extends父接口1,2…](多继承){
0…n常量 (public static final)
0…n 抽象方法(public abstract)
}
其中[ ]里的内容表示可选项,可以写也可以不写;接口中的属性都是常量,即使定义时不添加public static final 修饰符,系统也会自动加上;接口中的方法都是抽象方法,即使定义时不添加public abstract修饰符,系统也会自动加上。
3.使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以补充。
继承父类实现接口的语法为:
[修饰符] class 类名 extends 父类 implements 接口1,接口2…{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法
}
注意:如果要继承父类,继承父类必须在实现接口之前,即extends关键字必须在implements关键字前
4.接口和匿名内部类配合使用
接口在使用过程中还经常和匿名内部类配合使用。匿名内部类就是没有没名字的内部类,多用于关注实现而不关注实现类的名称。