继承:继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
继承的优点:避免了代码的重复,也方便日后的代码修改
Dog类和Penguin类
dog类和Penguin都有相同的属性和方法所以把相同的属性和方法提到一个Pet类中
Java继承的语法:
修饰符 SubClass extends SuperClass{ //类定义部分 }
其中SubClass 为子类,SuperClass为父类
继承是面向对象的三大特性之一,是Java中实现代码重用的重要手段之一。Java中只支持单继承,即每个类只能有一个直接父类,继承表达式是is a 的关系
在Java中,所有Java类都直接或间接继承java.lang.Object类。Object类是所有Java类的祖先
访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
重写和继承关系中的构造方法
子类重写父类方法
在子类中可以根据要求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖(overriding)
重写的要求:
1.重写方法和被重写方法必须具有相同的方法名
2.重写方法和被重写方法必须具有相同的参数列表
3.重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类
4.重写方法不能缩小被重写方法的访问权限
Dog类重写父类Print()方法
/** * 狗狗类,宠物的子类 */ Public class Dog extends Pet{ Private String strain; //品种 /** * 有参构造 * @param name 昵称 * @param strain 品种 */ public Dog(String name,String strain){ super(name); this.strain=strain; } public String getStrain(){ return strain; } /** * 重写父类的方法 */ Public void print(){ super.print(); System.out.print("我是一只"+this.strain+"。"); } }
在Penguin类中重写父类print()方法
/** * 企鹅类,宠物的子类 */ Public class Dog extends Pet{ Private String sex; //品种 /** * 有参构造 * @param name 昵称 * @param strain 品种 */ public Dog(String name,String sex){ super(name); this.sex=sex; } public String getStrain(){ return sex; } /** * 重写父类的方法 */ Public void print(){ super.print(); System.out.print("我是一只"+this.sex+"。"); } }
如果在子类中想调用父类的被重写的方法,可以在子类的方法中通过“super.方法名”
super代表对当前对象的直接父类对象的默认引用,在子类中可以通过super关键字来访问父类的成员
super必须出现在子类(子类的方法和构造方法)中,而不是其他位置
可以访问父类的成员,如父类的属性、方法、构造方法
注意访问权限的限制,如无法通过super访问private成员
继承关系中的构造方法
Dog类中的构造方法:
public Dog(String name,String strain){ super(name); this.strain=strain; }
继承条件下构造方法的调用规则:
1.如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造。在这种情况下,有没有“super();”语句,效果是一样的
2.如果子类的方法中通过super显式调用父类中的无参构造方法,则执行父类相应的构造方法,而不会执行父类的无参构造方法
3.如果子类的构造方法中通过this显式调用自身的其他构造方法,则在相应构造方法中应用以上两条规则
4.特别注意的是,如果存在多级继承的关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行父类object类的无参构造方法为止
抽象类
修饰符 abstract class Pet{ }
抽象类和抽象方法的特点:
1.抽象类和抽象方法都通过abstract关键字来修饰
2.抽象类不能实例化,抽象类中可以没有、一个或多个抽象方法,基本全部方法都可以是抽象方法
3.抽象方法只能方法声明,没有方法实现。有抽象方法的类必须声明抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类
抽象类中的方法未必是抽象方法
抽象方法必须在抽象类中
抽象方法没有方法体,直接以;结束
抽象类中可以有构造方法,其构造方法可以被本类的其他构造方法调用
public abstract void print();
final修饰符
用final修饰的类,不能再被继承
用final修饰的方法不能被子类重写
用final修饰的变量(包括成员变量和局部变量)将变成常量,只能在初始化时进行赋值,并且不能在其他地方修改