继承
Java中, 类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
继承关键字:extends意为扩展,继承就是子类对父类在原有基础上的扩展
A继承了B,那么A就包含了B中的所有的属性和方法
下面用代码实现了解一下继承
父类
public class Animal {
String color;
public String type;
public void eat() {
System.out.println("会吃的就是动物");
}
public static void haha() {
}
}
子类
public class Dog extends Animal {
public String name;
public void jiao() {
}
//重写,要想让子类实现的方案跟父类的不一样,就必须要重写。
@Override //这是一个注解
public void eat() {
System.out.println("狗吃肉");
}
}
子类的子类
public class ZHTYQ extends Dog {
public int price;
public void eat() {
System.out.println("中华田园犬食物链很杂!");
}
public void work() {
}
}
场景类
public class Foo {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
animal.eat();//输出:会吃的就是动物
dog.eat();//输出:狗吃肉
ZHTYQ zhtyq = new ZHTYQ();
zhtyq.haha(); //可以调用,但这个haha()不是被继承的,
// 如果是继承那么这个方法就是你的,而这个方法是大家的,
// 所有人都是从元数据区拿的
zhtyq.eat();//输出:中华田园犬食物链很杂!
Animal animal = new ZHTYQ();//animal声明的类型是动物,但是给过来的东西是中华田园犬,
//不能把animal当成中华田园犬用,应该把他当作动物用,
//动物具有的属性方法才能用
animal.eat(); //打印出狗吃肉,这是因为这个方法是动态方法,对象去执行这个方法,
//对象是中华田园犬
//animal只是入口在栈里,ZHTYQ在堆里,栈的吃方法在堆里执行,栈只是告诉你能指进去
//那么为什么不能调用堆里ZHTYQ里的work方法呢,这是因为栈找不到区堆里work方法的路
//如果这里还不理解可以看下面的内存分析
}
}
对Animal animal = new ZHTYQ();的一个解释
私有属性能不能被继承?(争论)
两个观点:
1.不能。子类中不能调用父类中继承过来的私有属性
class Human {
private int a = 1;
public void print() {
System.out.println("你好!");
}
public void foo() {
this.print();
}
}
class Man1 extends Human {
public void print() {
System.out.println("我好!");
}
}
public class Mian1 {
public static void main(String[] args) {
//System.out.println(new Man1().a); 报错
new Man1().foo();//如果父类print是私有的,子类没有重写它,this调用的还是原来父类的print,输出你好!,如果父类的print是公共的,则被重写,输出我好!
}
}
私有的不能被继承,因为继承了就一定能重写,而这里父类的print方法私有化后不能被子类重写
2.能。私有属性可以继承,可以在公开方法对私有属性的赋值,并且可以将其拿出。能继承但是不能在子类中直接调用
构造方法能被继承吗?
一般方法可以继承重写
构造方法不能被继承,因为构造方法的方法名必须和类名保持一致,不一致的就不是构造方法
如果构造方法能继承,但他的方法名跟类名不一样,所以他就不是构造方法,所以构造方法不能被继承
super与this
Java的类范畴继承是单继承(一个子类只能继承一个父类)
super代表当前类的父类对象
链式继承,super()向上一个父类找,如果找不到就往上上个父类找直到找到为止
this指代本类对象,
super总结
1.super 可以调用父类的构造方法,格式为 super()。Java 会根据 super() 括号内的参数个数和参数类型调用相应的父类构造方法。
2.super 可以调用父类的属性和方法。
3.即使子类构造方法中未使用 super调用父类的构造方法,Java 仍然会在子类的构造方法中隐式地添加 super()。
4.子类对象创建之前必须先创建父类对象 (子类对象是对父类对象的扩展)。因为需要先创建父类对象,所以super()必须写在第一行
这里写的比较凌乱,主要需要通过代码实现来理解,大家可以在阅读一下以下三篇文章具体学习继承
https://blog.csdn.net/qq_38182125/article/details/84961649
https://blog.csdn.net/qq_38182125/article/details/84961649
https://www.baidu.com/link?url=gO7UsA_Q5oAGHPW8WiI5Dx2voKO8xI8QVpdIZ2Uyu76KEb97iVn87GlDcQdbpfSDalvroXO4BkeLRk-q-DavJa&wd=&eqid=cef13ff8003056b0000000035dd3ca09