继承
1.继承的概念
子类与父类是is-a关系
继承是Java中实现代码重用的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类
2.代码实现
将子类中共有的信息编写在父类中,子类独有的信息编写在子类中,子类通过extends关键字继承父类
package com.qfedu.test1;
/**
* Pet类 宠物父类 将宠物共有的信息书写在父类中 独有的信息保留在子类中
* @author WHD
*
*/
public class Pet {
private String name;
private int health;
private int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的名字是:" + name + ",健康值 是:" + health + ",亲密值是:" + love );
}
}
package com.qfedu.test1;
/**
* Dog类
* 名字
* 健康值
* 爱心值
* 品种
*
* print() 打印狗狗信息
* @author WHD
*
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {}
}
package com.qfedu.test1;
/**
* Penguin类
* 名字
* 健康值
* 亲密值
* 性别
*
* print() 打印企鹅信息
* @author WHD
*
*/
public class Penguin extends Pet{
private String sex;
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public Penguin() {}
}
package com.qfedu.test1;
/**
* 宠物测试类
* @author WHD
*
*/
public class TestPet {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大黄");
dog.setHealth(100);
dog.setLove(100);
dog.setStrain("拉布拉多");
dog.print();
System.out.println("---------------------------------------");
// 以上代码执行打印信息有两个小问题:
// 1.宠物身份描述不准确
// 2.宠物信息描述不全面
Penguin penguin = new Penguin();
penguin.setName("大白");
penguin.setHealth(100);
penguin.setLove(100);
penguin.setSex("雌性");
penguin.print();
}
}
3. super关键字
super关键字:表示父类对象,可以访问父类访问权限允许的属性、方法、构造方法
3.1 访问属性
通过super.父类属性名实现访问
package com.qfedu.test2;
/**
* Pet类 宠物父类
* 名字
* 健康值
* 爱心值
* @author WHD
*
*/
public class Pet {
protected String name;
protected int health;
protected int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的名字是:" + name + ",健康值 是:" + health + ",亲密值是:" + love );
}
}
package com.qfedu.test2;
/**
* Dog类
* 品种
*
* print() 打印狗狗信息
* @author WHD
*
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {}
public Dog(String strain,String name,int health,int love) {
this.strain = strain;
super.name = name;
super.health = health;
super.love = love;
}
}
package com.qfedu.test2;
/**
* Penguin类
*
* 性别
*
* print() 打印企鹅信息
* @author WHD
*
*/
public class Penguin extends Pet{
private String sex;
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public Penguin() {}
public Penguin(String sex,String name,int health,int love) {
this.sex = sex;
super.name = name;
super.health = health;
super.love = love;
}
}
package com.qfedu.test2;
import com.qfedu.test3.Cat;
/**
* 宠物测试类
*
* super关键字:表示父类对象,可以访问父类访问权限允许的属性、方法、构造方法
* @author WHD
*
*/
public class TestPet {
public static void main(String[] args) {
Dog dog = new Dog("金毛", "大黄", 100, 100);
dog.print();
System.out.println("-------------------------");
Penguin penguin = new Penguin("雌性", "大白", 100, 100);
penguin.print();
System.out.println("-------------------------");
Cat cat = new Cat("绿色", "小黑", 100, 100);
cat.print();
}
}
package com.qfedu.test3;
import com.qfedu.test2.Pet;
public class Cat extends Pet{
private String furColor;
public String getFurColor() {
return furColor;
}
public void setFurColor(String furColor) {
this.furColor = furColor;
}
public Cat() {}
public Cat(String furColor,String name,int health,int love) {
this.furColor = furColor;
super.name = name;
super.health = health;
super.love = love;
}
}
3.2 访问方法
使用super关键访问父类的方法,解决问题"宠物信息显示不全面"
package com.qfedu.test4;
/**
* Pet类 宠物父类
* 名字
* 健康值
* 爱心值
* @author WHD
*
*/
public class Pet {
protected String name;
protected int health;
protected int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的名字是:" + name + ",健康值 是:" + health + ",亲密值是:" + love );
}
}
package com.qfedu.test4;
/**
* Dog类
* 品种
*
* print() 打印狗狗信息
* @author WHD
*
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {}
public void printDog() {
super.print();
System.out.println("狗狗的品种是:" + strain);
}
}
package com.qfedu.test4;
/**
* Penguin类
*
* 性别
*
* print() 打印企鹅信息
* @author WHD
*
*/
public class Penguin extends Pet{
private String sex;
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public Penguin() {}
public void printPenguin() {
super.print();
System.out.println("企鹅的性别是:" + sex);
}
}
package com.qfedu.test4;
public class Cat extends Pet{
private String furColor;
public String getFurColor() {
return furColor;
}
public void setFurColor(String furColor) {
this.furColor = furColor;
}
public Cat() {}
public void printCat() {
super.print();
this.print();
print();
// 以上三种方式都可以调用父类的方法
System.out.println("猫咪的毛发颜色是:" + furColor);
}
}
package com.qfedu.test4;
/**
* 宠物测试类
* 使用super关键访问父类的方法,解决问题"宠物信息显示不全面"
* @author WHD
*
*/
public class TestPet {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大黄");
dog.setHealth(100);
dog.setLove(100);
dog.setStrain("哈士奇");
dog.printDog();
System.out.println("------------------------");
Penguin penguin = new Penguin();
penguin.setName("大白");
penguin.setHealth(100);
penguin.setLove(100);
penguin.setSex("雌性");
penguin.printPenguin();
}
}
3.3 访问构造
super关键字来访问父类的成员
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类的private成员
super关键字访问父类构造方法:
1.子类构造默认调用父类的无参构造方法
2.除非显式调用父类的有参构造方法
3.this和super访问子类和父类的构造方法都要求在第一句 所以不能同时使用访问构造
子类构造方法中必须调用父类的无参或者有参构造其中一个
package com.qfedu.test5;
/**
* Pet类 宠物父类
* 名字
* 健康值
* 爱心值
* @author WHD
*
*/
public class Pet {
protected String name;
protected int health;
protected int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的名字是:" + name + ",健康值 是:" + health + ",亲密值是:" + love );
}
public Pet() {}
public Pet(String name,int health,int love) {
this.name = name;
this.health = health;
this.love = love;
}
}
package com.qfedu.test5;
/**
* Dog类
* 品种
*
* print() 打印狗狗信息
* @author WHD
*
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {
System.out.println("Dog类无参构造方法执行了");
}
public Dog(String strain,String name,int health,int love) {
super(name, health, love);
this.strain = strain;
}
public void printDog() {
super.print();
System.out.println("狗狗的品种是:" + strain);
}
}
package com.qfedu.test5;
/**
* Penguin类
*
* 性别
*
* print() 打印企鹅信息
* @author WHD
*
*/
public class Penguin extends Pet{
private String sex;
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public Penguin() {}
public void printPenguin() {
super.print();
System.out.println("企鹅的性别是:" + sex);
}
}
package com.qfedu.test5;
/**
* 宠物测试类
* super关键字访问父类构造方法:
* 1.子类构造默认调用父类的无参构造方法
* 2.除非显式调用父类的有参构造方法
* 子类构造方法中必须调用父类的无参或者有参构造其中一个
* @author WHD
*
*/
public class TestPet {
public static void main(String[] args) {
Dog dog1 = new Dog();
System.out.println("------------------");
Dog dog2 = new Dog("金毛", "拉布拉多", 100, 100);
}
}
4. 子类继承父类哪些内容
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
private修饰的属性和方法不能被继承
5.子类不能继承父类哪些内容
private成员
子类与父类不在同包,使用默认访问权限的成员
构造方法(用于给子类访问不能继承)