继承
继承的概念:如果多个类中存在相同属性和行为时,就可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行 为,只要继承那个类即可。
格式:class 子类名 extends 父类名 {}
例:
父类:
public class Animal {
Animal(int age,String name){
this.age=age;
this.name=name;
}
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void run(){
System.out.println("跑步");
}
}
子类:
public class Cat extends Animal {
Cat(int age,String name){
super(age,name);
}
}
子类:
public class Dog extends Animal {
Dog(int age,String name){
super(age,name);
}
}
测试类:
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog(1,"盖伦");
Cat cat = new Cat(4,"剑圣");
System.out.println("狗的名字为"+dog.getName());
System.out.println("狗的年龄为"+dog.getAge());
dog.eat();
System.out.println("---------------------------------");
System.out.println("猫的名字为"+cat.getName());
System.out.println("猫的年龄为"+cat.getAge());
cat.run();
}
}
输出为:
狗的名字为盖伦
狗的年龄为1
跑步
---------------------------------
猫的名字为剑圣
猫的年龄为4
跑步
继承的好处:提高了代码的复用性和维护性,使类与类之间产生关系,是多态的前提。
继承的弊端:类的耦合性提高了。
开发的原则:高内聚,低耦合。
耦合:类与类的关系。
内聚:就是自己完成某件事情的能力。
Java里继承的特点:只支持单继承,不支持多继承,但支持多层继承。
需注意的事项:子类只能继承父类所有非私有的成员;子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构 造方法;不要为了部分功能而去继承。
继承中成员变量/方法的关系:若子类成员变量/方法名与父类相同,则执行以下步骤:在子类的方法的局部范围找,有就使用;在子类的成员范围找,有就使用; 在父类的成员范围找,有就使用;如果还找不到,就报错。
super关键字何时使用:当子类局部范围需要访问父类变量时。
super关键字代表的是父类储存空间的标识。
继承中的构造方法:
子类中所有的构造方法默认都会访问父类中空参数的构造方法。
原因:因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始 化。
注意:若父类中没有无参构造方法,则子类应:1.在父类中添加一个无参的构造方法。
2.子类通过super去显示调用父类其他的带参的构造方法。
3.子类通过this去调用本类的其他构造方法,本类其他构造也必须首先访 问了父类构造。
例:
public class GrandFather { GrandFather(){ } int a1=1; int a2=2; int b1=1; int b2=0; }
public class Father extends GrandFather { Father(){ } public int add(int a1,int a2){ return a1+a2; } public int reduce(int b1,int b2){ return super.b1-super.b2; } }
public class Son extends Father{ public static void main(String[] args) { Son son = new Son(); Son son1 = new Son(); System.out.println(son.add(3,4)); System.out.println(son1.reduce(4,2)); } }
输出结果为:7
1
分析:Father类中的add方法使用的是传入的数据,reduce方法使用的是父类中的参数。
方法重写
何时使用:子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。 这样,即沿袭了父类的功能,又 定义了子类特有的内容。
注意:父类中的私有方法不能被重写;子类若要重写,权限不能比父类低。
例:
public class Animal {
public void eat(){
System.out.println("吃饭");
}
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗吃骨头");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.eat();
cat.eat();
}
}
输出为:狗吃骨头
猫吃鱼
final关键字:
作用:有时候我们不想让子类去重写父类的方法.这时就需要使用 final关键字。
作用范围:可以修饰类,变量,成员方法。
特点:被final修饰的类不能被继承;被修饰的方法不能被重写;被修饰的变量不能被重新赋值。
注意:若修饰的是基本类型,则是数值不变;弱修饰引用类型,则是地址值不变