一、继承
1、定义: 继承是类与类之间的一种关系,是一种” is a” 的关系
例如 : 狗是动物 ,我们就理解成狗类继承动物类。继承的类称为子类,被继承的类称为父类。
2、Java是单继承: 一个类最多只能有一个父类。
Java 支持多层次继承,也就是说,C继承B,B继承A,C也是A的子类。
注意: 同时,一个类可以有多个子类。(多态)
3、继承的优点
1) 子类拥有父类的所有属性和方法
备注: 如果父类的方法和属性由private修饰符修饰,则子类无法继承。换个说话,子类无法方位到该属性和方法
2)实现代码的复用
4、继承的语法
class 子类名 extends 父类名 {
}
二、操作说明
我们创建Animal 类,定义如下:
public class Animal {
//声明如下两个属性
public String name;
private int age;
//定义一个行为
public void eat(){
System.out.println("动物具有吃东西的能力");
}
}
定义一个Dog类,继承Animal类,我们看下如何操作
点击Browse
确定后点击finsh
继续创建个类,并勾选main函数
public static void main(String[] args) {
//创建dog对象
Dog dog = new Dog(); //或者 Animal dog = new Dog();
//访问dog对象的name属性
dog.name = "rose";
//访问dog对象的age属性(父类Animal的age属性是用private修饰,Dog并没有继承age这一属性)
//dog.age = 15;
//访问dog对象的eat()方法
dog.eat();
}
输出结果:
动物具有吃东西的能力
三、方法重写
如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时,会优先调用子类的方法。
语法规则 : 返回值类型、方法名、参数类型和参数个数都要与父类继承的方法相同
例如,我们在Dog类重写eat()方法如下,其他代码保持不变化,我们继续看下输出结果
public class Dog extends Animal {
//重写父类的eat()方法
public void eat(){
//super.eat();如果作为扩展,狗除了吃,还可以喝。就可以直接这么做。注意,这里的super不能省略,否则就递归了。
System.out.println("狗具有吃东西的能力");
}
}
输出结果:
狗具有吃东西的能力
注意 : Java 方法的重写要遵循 “两同两小一大”原则(作为了解吧,记住一模一样即可) :
1 > 两同 : 方法名 和 形参列表相同
2 > 两小 :
子类方法返回值类型应比父类的返回值类型更小或者相等
子类方法声明抛出的异常类比父类方法声明抛出的异常类更小或相等,当父类抛出多个异常,子类方法只能是其子集、
3> 一大 : 子类方法的访问权限应比父类方法更大或相等
特别注意 : 覆盖方法和被覆盖方法 要么都是 类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
四、组合优先继承
继承是实现类重用的重要手段,但是继承会破坏封装性。相比之下,在Java中通过组合也可以实现类重用,而采用组合方式来实现重用能提高更好的封装性。
如果需要复用一个类,除了把这个类当成基类来继承之外,还可以把该类当成另外一个类的组成部分,从而允许新类直接复用该类的public方法。不管是继承还是组合,都允许在新类(对于继承来说是子类)中复用旧类方法。对于继承来说,子类可以直接获取父类的public方法,当程序在使用子类的时候,可以直接访问该子类从父类那继承到的方法,而组合能够把旧对象作为新类的属性嵌入,用于实现新类功能。我们看到的只是新类的方法,而不能看到嵌入在对象中的方法。因此,通常需要在新类里使用private来修饰嵌入的旧类对象。
五、重写三条规则
1、方法重写是建立在继承的继承上,没有继承关系为前提,就不存在方法重写一说
2、当父类方法的修饰符为private,在其子类是不能被重写的
3、子类重写父类的方法时,子类方法的访问修饰符权限要大于等于父类方法的访问修饰符