7. 类的继承

一、继承的语法及示例

class Fruit
{
	public double weight;
	public void info()
	{
		System.out.println("我是一个水果!重" + weight + "克!");
	}
}

// Java使用extends作为继承的关键字
public class Apple extends Fruit
{
	public static void main(String[] args)
	{
		Apple a = new Apple();
		// Apple类继承了父类的全部成员变量和方法
		a.weight = 56;
		a.info();
	}
}

1. 设计父类应遵循的规则

  • 尽量把父类的所有成员变量都设置成private访问类型,不要让子类直接访问父类的成员变量
  • 父类中那些仅为辅助其他的工具方法,应该使用private访问控制符修饰,让子类无法访问该方法;如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用protected来修饰该方法;如果父类中的方法需要被外部类调用,则必须以public修饰,但又不希望子类重写该方法,可以使用final修饰符来修饰该方法
  • 尽量不要在父类构造器中调用将要被子类重写的方法(创建子类对象时,执行父类构造器时会调用被子类重写后的方法)

 

二、继承的特点

1. 子类获得父类的全部成员变量和方法(除了构造器,即子类不能获得父类的构造器

2. 虽然子类会获得父类的private成员,但是子类无法直接访问它们,可以通过从父类中获得的protected、public方法来访问

3. 无论父类中的成员变量或方法是否被子类覆盖,子类都会保留这些成员变量和方法

4. java.lang.Object类是所有类的父类,如果定义一个Java类时并未指定其父类,则默认它是java.lang.Object的子类

 

三、子类中重写父类的方法

1. “在子类中定义与父类中某方法同名的方法”的现象被称为方法重写,即子类重写了父类的方法,也可以说子类覆盖了父类的方法

2. 方法的重写要遵循“两同两小一大”规则:

  • “两同”:方法名相同、形参列表相同
  • “两小”:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常更小或相等
  • “一大”:子类方法的访问权限应比父类方法的访问权限更大或相等

3. 覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,即不能一个是类方法,另一个是实例方法

4. 当子类覆盖了父类方法后,子类的实例将无法访问父类中被覆盖的方法,但可以在子类的方法中调用父类中被覆盖的方法

  • 如果被覆盖的是实例方法,则可以使用super作为调用者来调用父类中被覆盖的方法
  • 如果被覆盖的是类方法,则可以使用父类类名作为调用者来调用父类中被覆盖的方法

5. 子类中无法重写父类private方法,那么在子类中定义一个与父类private方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法

 

四、子类中重写父类的成员变量

1. “在子类中定义与父类中某成员变量同名的成员变量”这一情况被称为子类隐藏了父类的成员变量

  • 系统在初始化子类及创建子类对象时,依然会为父类中被隐藏的成员变量分配内存空间

2. 当子类覆盖了父类成员变量后,子类的实例将无法访问父类中被覆盖的成员变量,但可以在子类的方法中调用父类中被覆盖的成员变量

  • 如果被覆盖的是实例变量,则可以使用super作为调用者来调用父类中被覆盖的成员变量
  • 如果被覆盖的是类变量,则可以使用父类类名作为调用者来调用父类中被覆盖的类变量

 

posted @ 2019-05-23 23:14  GGBeng  阅读(210)  评论(0编辑  收藏  举报