java面向对象之继承
面向对象的三大特性之二 继承
继承的由来
当程序中写入了多个类时,通常会发现类中有很多重复、相似的代码,所以可以考虑将这些类中重复的、相似的代码单独拿出来存放到一个类(这个类称为父类)中,由其他的类(这种类称为是子类)遗传父类中的属性和行为方法,就像人的基因遗传一样,子类中单独写父类中没有的特性,这个过程称为是继承。
如何实现继承?
编写父类
[访问修饰符] class 父类名称{
//公共属性
//公共行为方法
}
编写子类,继承父类
[访问修饰符] class 子类名称 extends 父类名称{
//子类中特有的属性
//子类中特有的行为方法
}
定义一个宠物类pet作为父类
package cn.zhz.Inherit;
public class Pet {
public String name = "无名氏";
public int health = 100;
public int love = 0;
}
定义一个狗狗类,狗狗类作为Pet宠物类的子类,继承了宠物类中的属性和方法
package cn.zhz.Inherit;
/*
宠物狗狗类
*/
public class Dog extends Pet {
public String strain = "聪明的拉布拉多犬";
/*
输出狗狗的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是一只" + this.strain + ".");
}
}
定义一个猫类,猫类作为Pet宠物类的子类,继承了宠物类中的属性和方法
package cn.zhz.Inherit;
public class Cat extends Pet {
public String sex = "加菲猫";
/*
输出猫的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是的性别是" + this.sex + ".");
}
}
定义一个企鹅类,企鹅类作为Pet宠物类的子类,继承了宠物类中的属性和方法
package cn.zhz.Inherit;
/*
企鹅类
*/
public class Penguin extends Pet {
public String sex = "Q仔";
/*
输出企鹅的相关信息
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name + "\n健康值是"
+ this.health + "\n和主人的亲密度是" + this.love + "\n我是的性别是" + this.sex + ".");
}
}
编写一个测试类,测试类中创建了Cat、Dog、Penguin的实例,并输出详细信息
package cn.zhz.Inherit;
public class Test {
public static void main(String[] args) {
//狗
Dog dog = new Dog();
dog.health = 60;
dog.love = 3;
dog.name = "多多";
dog.strain = "吉娃娃";
dog.print();
//企鹅
Penguin penguin = new Penguin();
penguin.health = 78;
penguin.love = 3;
penguin.name = "Q仔";
penguin.sex = "女";
penguin.print();
//猫
Cat cat = new Cat();
cat.health = 80;
cat.love = 5;
cat.name = "喵喵";
cat.sex = "女";
cat.print();
}
}
在java中继承只可以支持单根继承,也就是多个子类只有一个直接父类,就像我们生活中只有一个父亲是一样的。
继承很大的程度上减少了代码量,实现了代码的重用,同时也方便修改代码。
继承注意事项
子类继承父类时,也不是所有的属性和行为方法都是可以继承的。就像作为几个孩子的父亲一样也有自己的小秘密和小行为,这些都是存在的。
那么子类中可以继承父类的哪些,又不可以继承父类的哪些呢?
创建一个Person类,在Person类中的属性和行为方法钱加上各种访问修饰符
package cn.zhz.Inherit01.dh;
public class Person {
protected String name;
public char sex;
private int age;
public String address;
}
创建一个学生类,在学生类中尝试访问Person父类
package cn.zhz.Inherit01.dh;
public class Student extends Person {
public void m1() {
//子类中可以访问父类中的protected的属性和行为方法
System.out.println(name);
//子类中可以访问父类中的public的属性和行为方法
System.out.println(address);
//子类中不可以访问父类中的private的属性和行为方法
// System.out.println(age);
}
}
由上面的代码可知
子类中可以访问父类中的protected的属性和行为方法
子类中可以访问父类中的public的属性和行为方法
子类中不可以访问父类中的private的属性和行为方法
子类中不可以继承父类的构造方法,但是可以调用父类的构造方法
注意:特别的如果属性和行为方法前使用的是默认的访问修饰符,在同一个包中子类可以访问父类中的属性和行为方法,在不同包中子类不可以访问父类中的属性和行为方法。
java方法重写