Java面向对象之继承、super关键字、方法重写
原创
©著作权归作者所有:来自51CTO博客作者mb62e7593c01ba5的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、继承
1、简单说明
- 子类可以拥有父类中除了私有变量/函数外的所有的内容,当出现x是y的一种什么的时候可以使用继承,x继承于y,x是y的儿子,x子类是对y父类的扩展。
- 反映的是一种特殊关系,如动物->哺乳动物->蓝鲸
- 关键字 extends: 只支持单继承(一个继承另一个),不支持多继承(c#同样不允许,c++却允许)。
- 作用:简化代码,提高代码重用率。
2、继承练习
(1)动物类(爷爷类)
public class Test04_Animal{
public String name = "蓝鲸";
public int age = 23;
}
(2)哺乳动物类(父亲类)
public class Test04_Mammal extends Test04_Animal{ //继承动物类
public int size = 50; //多加了一个变量
}
(3)蓝鲸类(儿子类)
public class Test04_Whale extends Test04_Mammal{ //继承哺乳类
//定义一个说话的方法
public void speek(){
System.out.println("我是" + this.age + "大" + this.size + "米长的" + this.name);
} //父类中的公有变量也可以使用this进行访问
public static void main(String[] args){
Test04_Whale tw = new Test04_Whale(); //创建对象
tw.speek(); //调用鲸鱼说话的方法
}
}
3、继承关系
二、super关键字
1、简单说明
(1)super表示父类中的内容,当父类和子类有同名变量时,使用this是访问子类的,而使用super就是访问父类的public或protected方法。
(2)只能在子类中的构造方法中使用,用于初始化继承自父类的属性,并且需要父类中已经定义了相应签名的构造方法。
(3)可以使用super()调用父类的构造方法,并且只能放在子类构造方法的第一行,且只能调用一次super方法。
2、测试练习
(1)父类
public class Test04_Mammal extends Test04_Animal{ //继承动物类
public int size = 50; //多加了一个变量
protected String addr; //保护变量,子类继承中可以继承保护变量和公有变量
//定义父类的构造方法
public Test04_Mammal(String addr){
this.addr = addr;
}
}
(2)子类
public class Test04_Whale extends Test04_Mammal{ //继承哺乳类
//定义一个说话的方法
public void speek(){
System.out.println("我是" + this.age + "大" + this.size + "米长的" + this.name);
} //父类中的公有变量也可以使用this进行访问
//定义子类的构造方法
public Test04_Whale(){
super("太平洋"); //调用父类的构造方法,传入参数
System.out.println("我住在" + super.addr);
}
//定义主方法
public static void main(String[] args){
Test04_Whale tw = new Test04_Whale(); //创建对象,调用子类构造方法
tw.speek(); //调用鲸鱼说话的方法
}
}
三、方法的重写
1、简单说明
(1)就是子类对父类中的方法进行重新定义,子类和父类中的方法声明完全一致(毕竟重写肯定是写同一个方法)。
(2)常用于子类对父类的方法不满意,想要更新或者拓展父类的方法。
(3)子类继承的方法的权限,不应比继承自父类的方法更严格(为了保证多态都能实现)。
(4)返回值不能作为重载的条件,因为子类中有了两个同名同参但不同返回值的方法。
2、测试练习
(1)父类
public class Test04_Mammal extends Test04_Animal{ //继承动物类
public int size = 50; //多加了一个变量
protected String addr; //保护变量,子类继承中可以继承保护变量和公有变量
//定义父类的构造方法
public Test04_Mammal(String addr){
this.addr = addr;
}
//父类中定义一个说话的方法
public void speek(){
System.out.println("我是" + this.age + "大" + this.size + "米长的" + this.name);
}
}
(2)子类
public class Test04_Whale extends Test04_Mammal{ //继承哺乳类
//定义子类的构造方法
public Test04_Whale(){
super("太平洋"); //调用父类的构造方法,传入参数
}
//定义对父类的speek方法的重写:半盖法
public void speek(){
//但重写时又调用了一次父类的speek方法,这样就可以不用担心父类的方法丢失了(半盖法)
super.speek();
//此外,重写时又添加了一条地址语句的输出
System.out.println("I am in " + super.addr);
}
//定义主方法
public static void main(String[] args){
Test04_Whale tw = new Test04_Whale(); //创建对象,调用子类构造方法
tw.speek(); //调用鲸鱼说话的方法
}
}