java中的继承——父类与子类的关系
转载请声明
java中规定一个父类可以有多个子类,但是一个子类只能有一个父类。
子类可以通过extends关键字来继承父类。
做个比较通俗的比喻,就像一个父亲可以有多个孩子,但是每个孩子只能有一个亲生父亲。
定义:
一. 子类引用指向自身对象时
- 若子类覆盖了某方法,则子类引用调用子类重新定义的新方法
- 若子类未覆盖某方法,则子类引用调用父类本身的旧方法
- 若子类覆盖了某属性,则子类引用调用子类重新定义的新属性
- 若子类未覆盖某属性,则子类引用调用父类本身的旧属性
- 子类引用可以访问子类新定义的方法
总结:当子类引用自身的对象时:
当子类覆盖了某方法或者某属性则子类调用的是子类重新新定义的新方法或者新属性。
二. 父类引用指向子类对象时
属性不具有多态性
所以若子类覆盖了父类的某属性,但父类引用仍调用父类本身的旧属性
- 若子类覆盖了某方法,则父类引用调用子类重新定义的新方法
- 若子类未覆盖某方法,则父类引用调用父类本身的旧方法
- 若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性
- 若子类未覆盖某属性,则父类引用调用父类本身的旧属性
- 父类引用访问子类新定义的方法时需要向下转型
总结一句话:当父类引用自类的对象时:
子类覆盖父类的方法或属性后,只有新方法才能被调用,属性则继续调用父类本身的旧属性。
Dog.java
//Dog作为Animal的子类
//Dogt继承Animal
public class Dog extends Animal{
//私有的属性
public Dog(String name, int age, String color, String kind) {
super();
this.name = name;
this.age = age;
this.color = color;
this.kind = kind;
}
//方法的重写
public void sound(){
System.out.println(this.name+"在汪汪叫!");
}
public void run(){
System.out.println("小狗在跑!");
}
Cat.java
//Cat作为Animal的子类
//Cat继承Animal
//私有的东西不能继承
//子类可以继承父类除私有以外的所有东西(方法与属性)
//父类的构造函数不能继承
public class Cat extends Animal{
public Cat(){
super();
}
public Cat(String name, int age, String color, String kind) {
super();
this.name = name;
this.age = age;
this.color = color;
this.kind = kind;
}
}
AnimalMain.java
public class AnimalMain {
public static void main(String[] args) {
Animal animal= new Dog("小青",3,"黄色","小金毛");
animal.sound();
//如果想调用自己子类的方法时需要向下转型
Dog dog = (Dog)animal;
dog.run();
Animal cat =new Cat("喵喵",1,"白色","加菲猫");
cat.sound();
}
}
父类引用子类的方法时需要向下转型
方法的向下转型Dog dog = (Dog)animal;
与字符类型类似
byte向上转型不需要特别标注
byte b=100;
int i=b;
int向下转型为byte需要强制转,转byte型要在i前加一个(byte)
byte b1=(byte)i;
Animal.java
//父类
//父类内可以包含子类公有地属性与方法
public class Animal {
protected String name;
protected int age;
protected String color;
protected String kind;
public void eat(String food){
System.out.println(this.name+"吃"+food);
}
public void sound(){
System.out.println(this.name+"欢乐的嘶吼!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
}
运行结果
小青在汪汪叫!
小狗在跑!
喵喵欢乐的嘶吼!
- 怎么判定发生了多态
- 1.继承 子类要去继承父类
- 2.方法重写 子类要去重写父类的方法且方法名一定要相同
- 3.父类的引用指向子类的对象(向上转型)
- 4.当父类调用父类的方法时,实际执行的时子类的方法(表现出子类 的特征)
- 5.只能调用父类现有的方法
- 6.如果父类调用子类自己的方法需要向下转型