继承
继承最主要的作用是减少代码冗余(少写很多重复的代码),实现代码的复用性
子类只能继承父类的非私有变量和方法
父类的构造方法不能被继承但能被调用
编写父类
class Pet {
//公共的属性和方法
}
编写子类来继承父类
//Dog类继承于Pet类
class Dog extends Pet {
//子类特有的属性和方法
}
子类访问父类成员
访问父类构造方法: super()
或 super(param)
;访问父类成员: super.param
举个例子
创建一个父类Pet
public class Pet {
private String name = "无名氏";
private int love = 0;// 亲密度
private int health = 100;// 健康值
public Pet() {
this.health = 95;
System.out.println("执行宠物的无参构造方法");
}
public Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public void print() {
System.out.println("我的名字叫" + this.name + ",我的健康值是" + this.health+ ",与主人的亲密度是" + this.love);
}
}
创建Dog子类来继承Pet父类
public class Dog extends Pet {
private String strain;
public Dog(String name, String strain) {
super(name);
this.strain = strain;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
}
创建主类
public class ExtDemo {
public static void main (String[] args) {
Dog dog = new Dog("二哈", "哈士奇");
dog.print();
}
}
运行结果: 我的名字叫二哈,我的健康值是100,与主人的亲密度是0
分析一下代码
private String name = "无名氏";
private int love = 0;// 亲密度
private int health = 100;// 健康值
先在父类Pet中定义了三个私有变量,使得这三个变量只在本类中可以被访问。
public Pet() {
this.health = 95;
System.out.println("执行宠物的无参构造方法");
}
public Pet(String name) {
this.name = name;
}
为父类定义了构造方法,其中无参的构造方法里 this.health = 95
把95赋值给了本类的 health
,而在有参的构造方法里传入了一个字符串,通过 this.name = name
把传入的字符串赋给本类的 name
。这两个不同的构造方法在调用时将会得到不同的运行结果。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
之后就是定义get方法和set方法,来实现其他类对父类私有变量的访问。
public class Dog extends Pet
创建Dog类来继承Pet类,即Dog类是Pet类的子类, extends
关键字表示继承。
private String strain
用来定义狗狗的品种。
public Dog(String name, String strain) {
super(name);
this.strain = strain;
}
在构造方法中传入了两个变量,name 和 strain。 super(name)
的作用是引用父类的有参构造方法,父类的有参构造里写的是 this.name = name
,则在这里的用途是把Dog类的构造方法传入的 name 赋给了父类的 name 变量,而 this.strain = strain
是把传入的 strain 赋给当前本类的 strain 变量。接着再分别定义 getStrain()
和 setStrain()
方法来获得和设置 strain 的值。
本例中并没有实际用到 strain 这个变量, getStrain()
和 setStrain()
这两个方法也并未使用过。
Dog dog = new Dog("二哈", "哈士奇");
dog.print();
最后在主类中实例化Dog类的对象,使用有参的构造方法 public Dog(String name, String strain)
传入 name = "二哈"
strain = "哈士奇"
,调用 print()
方法,这个方法在Dog类里并不存在,而是从它的父类Pet类继承而来。
public void print() {
System.out.println("我的名字叫" + this.name + ",我的健康值是" + this.health+ ",与主人的亲密度是" + this.love);
}
这样就得到了运行结果 我的名字叫二哈,我的健康值是100,与主人的亲密度是0
。