继承
上一篇说到了有很多相似代码:
我们发现狗和猫都属于动物,他们相同的特点有很多,它们都属于哺乳动物,也有其他的,都是胎生,四条腿等等。那么狗和猫也都继承了哺乳动物的特性:
继承是什么呢?继承就是A具有B的特性,但是A也可以有B没有的特性。
继承者对被继承者的特殊化。举个栗子说:猫是喵喵叫,狗是汪汪叫,但是他们都属于哺乳动物。但它们也都有自己的个性。
继承的工作方式是,定义了父类和子类,或叫做基类和派生类,其中子类继承了父类的所有特性。子类不但继承了父类的所有属性还具有自己的特性。
继承需要记住:
(1)子类继承父类所有非private修饰的属性和方法。
(2)子类具有自己的属性和方法,也就是子类可以扩展父类没有的属性和方法
(3)子类还可以重写父类
那么问题来了,什么是非private修饰呢?
上面讲了,private和public修饰词,这里还有protected修饰词
这个修饰词修饰的时候,表示子类可以完全访问父类,但是其他类不可以获取。
知道以上内容了,我们来修改一下代码:
package demo;
public class Animal {
protected String name;
protected int shoutNum;
public Animal() {
this.name = "没想好";
}
public Animal(String name) {
this.name = name;
}
public int getShoutNum() {
return shoutNum;
}
public void setShoutNum(int shoutNum) {
if (shoutNum > 10)
this.shoutNum = 10;
else
this.shoutNum = shoutNum;
}
}
抽取出共有的方法,并声明属性为protected修饰,只允许子类访问
package demo;
public class CatShout {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog("wang");
cat.setShoutNum(3);
dog.setShoutNum(10);
System.out.println(cat.shout());
System.out.println(dog.shout());
}
}
Cat类:
public class Cat extends Animal{
public Cat() {
super();
}
public String shout(){
for(int i =0;i<shoutNum;i++){
System.out.println("喵");
}
return "我的名字是"+name;
}
}
Dog类:
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
public String shout() {
for (int i = 0; i < shoutNum; i++) {
System.out.println("汪");
}
return "我的名字是" + name;
}
}
此处的super是父类的构造函数,构造函数只能用在子类的构造函数中。