一、继承
继承是面向对象的一种强大的机制,可以实现代码的复用,通过extends
关键字实现
class Person{
}
class Student extends Person{
}
ps:子类会自动获得父类的所以字段,不能在子类中再去定义和父类字段相同的字段
扩展:在OOP的术语中,把Person
称为超类(super class),父类(parent class),基类(base class),把Student
称为子类(subclass),扩展类(extended class)
1、继承树
-
没有写extends关键字,默认继承Object类
-
java只允许一个类继承自一个类,也就是每个类只有一个父类,Object比较特殊,它没有父类
protected
子类无法访问父类中的private字段和private方法,修改父类中的字段为protected属性,可以让子类成功访问
原因:protected让字段和方法的访问控制在继承树的内部
super 父类
-
子类访问父类中的name字段
super.name
、this.name
和name
效果一样 -
子类不会继承父类的构造方法,子类默认的构造方法都是编译器自动生成的,如果父类没有默认的构造方法,需要调用
super()
让编译器自动匹配父类中的构造方法
阻止继承
-
如果没有用
final
关键字,任何类都可以继承 -
sealed
关键字修饰,限定能够继承的类,permits
明确哪些类能继承public sealed class Person permits Xiaoming, Lihua{ …… }
向上转型和向下转型
-
向上转型(upcasting)就是把子类类型安全地转为父类类型
例如继承树为
Student -> Person -> Object
,可以把Student类转化成Person类,甚至Object类 -
向下转型(downcasting)把父类类型转为子类类型
这样做可能出错,因为父类的方法比子类少,可能转化不成功,通过
isinstance()
先判断再转换
2、继承与组合
继承是is的关系,组合是has的关系
class Book{
...
}
class Person{
...
}
class Student extends Person{
private Book book;
}
二、多态
- override(覆写),覆写体现的是子类和父类之间的多态性,
运行时的多态
- overload(重载),重载体现的是类中方法的多态性,
编译时的多态
ps:方法名相同,方法参数相同,但方法返回值不同,也是不同的方法
1、多态的形式
/*
父类 对象名称 = new 子类名称
接口 对象名称 = new 实现类构造器
*/
- 方法调用:编译看左,运行看右
- 变量调用:编译看左,运行看右
2、覆写Obejct方法
- toString()方法,将实例输出为字符串类型
- equals()方法,判断两个实例是否相等
- hashcode()方法,计算hash值
super
可以实现在子类覆写的方法中调用父类被覆写的方法
3、final的作用
-
final修饰的类不允许被继承
-
final修饰的方法不允许被重写
-
final修饰的字段在创建对象时初始化完,之后不允许被修改
4、学后一题
建立一个汽车Auto类 包括轮胎个数 汽车颜色 车身重量、速度等成员变量。并通过不同的构造方法创建实例。至少要求 汽车能够加速 减速 停车。 再定义一个小汽车类Car 继承Auto 并添加空调、CD等成员变量 覆盖加速 减速的方法。
Auto.java
package Object;
/**
* @className:Auto;
* @time:2022-04-18-11:09;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class Auto {
public int tire;
public String color;
public int weight;
public int speed;
public Auto(){
}
public Auto(int tire, String color, int weight, int speed){
this.tire = tire;
this.color = color;
this.weight = weight;
this.speed = speed;
}
public void speedup(int i){
System.out.printf("the speed in auoto is %d", i);
this.speed += i;
}
public void speeddown(int i){
this.speed -= i;
}
}
Car.java
package Object;
/**
* @className:Car;
* @time:2022-04-18-11:23;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class Car extends Auto {
private String condition;
private String CD;
public Car(int tire, String color, int weight, int speed, String condition, String CD){
super(tire, color, weight, speed);
this.condition = condition;
this.CD = CD;
}
public void speedup(int i){
System.out.printf("the i in class Car is %d\n", i);
this.speed *= i;
System.out.printf("the current speed in class Car is %d\n", this.speed);
}
public void speeddown(int i){
this.speed -= 2 * i;
}
}
Test_Auto.java
package Object;
import Object.Car;
import Object.Auto;
/**
* @className:Test_Auto;
* @time:2022-04-18-11:31;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class Test_Auto {
public static void main(String[] args) {
Auto benchi = new Car(4, "Black", 200, 70, "geli", "2s");
System.out.printf("Start speed is %d\n", benchi.speed);
benchi.speedup(10);
System.out.printf("stop speed is %d\n", benchi.speed);
}
}