继承
继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
格式:public class 子类名 extends 父类名{}
继承好处:
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码要修改,修改一处即可)
继承弊端:
让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时,子类实现也不得不跟着变化,削弱了子类的独立性
在子类方法中访问一个变量:
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲)
super:
package learn;
public class Fu {
public int age=40;
}
package learn;
public class Zi extends Fu{
public int age=20;
public void show(){
int age=18;
System.out.println(age);
System.out.println(this.age);
System.out.println(super.age);
}
}
package learn;
public class Main{
public static void main(String[] args) {
Zi z=new Zi();
z.show();
/*输出:
18
20
40
*/
}
}
继承中构造方法的访问特点:
子类中所有的构造方法默认都会访问父类中的无参构造方法
(每一个子类构造方法的第一条语句默认为:super())
如果父类中没有无参构造方法,只有带参构造方法
通过使用super关键字去显示的调用父类的带参构造方法
在父类中自己提供一个无参构造方法(推荐)
继承中成员方法的访问特点:
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲)
方法重写:子类中出现了和父类中一模一样的方法声明
应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。
注解:@override (可以帮助我们检查重写方法的方法声明的正确性)
方法重写的注意事项:
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能比父类中低(public>默认>私有)
继承中的注意事项:
案例:
动物类:
package learn;
public class Animal {
private String name;
private int age;
//无参构造方法
public Animal(){
}
//带参构造方法
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
猫类:
package learn;
public class Cat extends Animal{
//无参构造方法
public Cat(){
}
//带参构造方法
public Cat(String name,int age){
super(name,age);//调用父类中的带参构造方法
}
public void catchmouse(){
System.out.println("猫抓老鼠");
}
}
测试:
package learn;
public class TestDemo {
public static void main(String[] args){
Cat c1=new Cat();
c1.setName("加菲猫");
c1.setAge(5);
System.out.println(c1.getName()+","+c1.getAge());
c1.catchmouse();
Cat c2=new Cat("加菲猫",5);
System.out.println(c2.getName()+","+c2.getAge());
c2.catchmouse();
}
}
输出:
加菲猫,5
猫抓老鼠
加菲猫,5
猫抓老鼠