继承
继承是面对对象的三大特征之一,也是软件实现重复的重要手段,java的继承具有单继承的特点,每个子类只有一个直接父类。
什么时候选择继承
1.子类需要额外添加成员变量
2.子类需要添加自己独有的行为方式
Java里面可以继承多个类,但只能直接继承于一个类
可以继承父类的属性和方法,但是不能继承父类的构造方法
super表示调用父类的属性或者方法
super() 表示调用父类的构造方法
this 表示访问当前类或者对象的属性或者方法
构造方法的执行顺序:父类A -> 子类B -> 子类C
子类不能继承父类private修饰的属性或方法
子类继承父类的方法(public protected修饰的方法)
如果子类需要在父类的基础之上重新实现分类的方法,子类必须重写这个方法,这个过程称为重写或者覆盖
如果子类重写了父类的方法,那么不会去调用父类的方法了
如果没有重写,先从当前类里面查找这个方法,如果没有,从父类去查找,如果父类里都没有,那么直接报错
重载和重写的区别
重载:同一个类里面 方法名相同 参数不同
重写:两同,方法名和参数相同。
一大,子类的修饰符范围要比父类更大或者相同
两小,子类的返回值必须比父类的要小或者相同 子类抛出的异常必须比父类的小
继承的优点:复用性更强
继承的缺点:耦合性大(耦合为两个类之间的关系,耦合性强的话移植性降低)
安全性降低
建议:
1.尽量让属性的修饰符为private
2.尽量让父类方法的修饰符为private 或者 final
3.尽量不要在父类的构造方法里面调用可能被子类重写的方法
多态
编译和运行时是两个东西 不同对象
编译和运行时的对象是有继承关系的 BMW -> Car Audi -> Car
只能子类对象传给父类对象
子类可以向父类转换
在使用的时候,如果需要使用子类的方法或者属性,必须强制转化为对应的子类对象
MyClass.java
public class MyClass {
public static void main(String[] args){
Audi ad = new Audi(wheels: 4, feeling: "good");
ad.drive();
Person p = new Person();
BMW bmw = new BMW(wheels: 4);
Audi audi = new Audi(wheels: 4, feeling: "well");
p.goToWork(bmw);
p.goToWork(audi);
}
}
Car.java
public class Car {
public int wheels;
public String color;
public String brand;
public Car(int wheels){
this.wheels = wheels;
System.out.println("Car类 构造方法")
//drive();
}
public void drive(){
//System.out.println("汽车可以开");
System.out.println("color:" + color);
}
}
Audi.java
public class Audi extends Car{
public String feeling;
public Audi(int wheels, String feeling) {
super(wheels);
this.feeling = feeling;
System.out.println("Audi的构造方法")
}
public void test1(){
System.out.println("德味儿");
}
}
BMW.java
public class BMW extends Car {
public BMW(int wheels) {
super(wheels);
}
public void drive() {
System.out.println("舒适");
}
}
Person.java
public class Person {
//多态
pubic void goToWork(Car){
car.drive;
}
//instanceof:判断某个对象是不是某个类的对象
if (car instanceof Audi)[
Audi audi = (Audi)car;
audi.testAudi();
}
// public void goToWork(Audi audi){
// audi.drive();
// }
//
// public void goToWork(BMW bmw){
// bmw.drive();
// }
}