继承是一种由已有类创建新类的机制,子类可以让我们不必一切从头做起
子类可以继承父类的属性和行为,同时又可以增添子类独有的数据和数据上的操作
- 子类继承的方法只能操作子类继承和隐藏的成员变量
- 子类重写或新增的方法可以操作子类继承和新声明的成员变量,不能直接操作隐藏的成员变量(super)
- 子类继承的变量和方法,就好像它们在子类中直接声明一样,可以被子类自己声明的任何实例方法访问
一、继承的意义
继承关系,is-a
,苹果是水果,子类可以被当作父类看待
@Override注解,推荐写上,可以校验方法重写,提高程序可读性
设计原则:对于已经投入使用的类,尽量不要进行修改
推荐定义一个新类继承旧类,重复利用共性内容,并且添加改动新内容
// 父类
public class Phone {
public void call(){
System.out.println("打电话");
}
public void send(){
System.out.println("发短信");
}
public void show(){
System.out.println("显示号码");
}
}
// 子类
public class NewPhone extends Phone {
@Override
public void show() {
super.show(); // 复用父类show()方法
System.out.println("显示姓名"); // 子类新增更多内容
System.out.println("显示头像");
}
}
二、子类的继承性
- 父类、子类同包中:子类可以继承父类public、protected、友好的成员
- 父类、子类不同包:子类只能继承父类public、protected的成员
三、子类对象的特点
用子类创建对象时,父类的成员变量也都分配了内存空间
只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量
例如,父类的private成员变量尽管分配了内存空间,也不作为子类对象的变量
当然也不是父类某个对象的变量,因为根本没有使用父类创建任何对象
子类创建对象时似乎浪费了一些内存,实际情况并非如此,子类从父类继承的方法可以操作未继承的变量
// 父类 People
public class People {
private int averHeight = 166; // private修饰
public int getAverHeight() {
return averHeight;
}
}
// 子类 ChinaPeople
public class ChinaPeople extends People {
int height;
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
// 测试类 Test
public class Test {
public static void main(String[] args) {
ChinaPeople chinaPeople = new ChinaPeople();
// 父类私有的averHeight
System.out.println(chinaPeople.getAverHeight()); // 166
// 子类独有的height
chinaPeople.setHeight(180);
System.out.println(chinaPeople.getHeight()); // 180
}
}