继承关键字(extends和implements)
继承可以用extends和implements两个关键字实现,若无这两个关键字,则默认继承Object类。
- extends
class A{ } class B extends A{//A为父类,B为子类 }Java中,继承可以多层继承,不能多重继承,只能单一继承,即一个子类只能有一个父类,extends只能继承一个类。
-
implements
-
implements的使用可以变相使Java具有多继承的特性,这是Java为单继承灵活性不足所作的补充。类实现接口语法格式如下:
-
public interface A{ public void eat(); } public interface B{ public void sleep(); } public class C implements A,B{//类C继承接口A,B }实现接口与继承父类相似,同样可以获得接口中的变量和方法,可以将接口认为是一种特殊的继承(相当于实现类继承了一个彻底的抽象类,除默认方法外,所有方法都是抽象方法的类);
-
实现接口,必须实现接口中的所有方法;(也就是重写这些方法)
-
接口可以被多重实现,接口只定义定义抽象方法,这些方法默认是public abstarct,而接口中的成员变量默认是public static final,必须显式初始化。
-
使用继承应注意(继承关系中,子类可以直接访问父类的所有方法和成员变量,从而破坏了父类的封装性)
-
尽量隐藏父类的内部数据,将父类的所有成员变量设置为private访问类型,使子类不可以直接访问;
-
尽量不让子类随意访问修改父类的方法,对于基本不使用的方法,可以用private修饰;对于需要被外部类调用的方法,用public修饰,若该方法又不希望被重写,用final修饰;对于要被重写,又不希望被随意访问的方法,用protected修饰;
-
尽量不要在父类构造器中调用将要被子类重写的方法;见下例:
class Parent{ public void Parent(){ eat(); } public void eat(){ System.out.println("子类将要重写的方法"); } } public class Sub { private String name; public void eat(){ System.out.println("子类重写的方法"+name.length()); } public static void main(String[] args) { // 发生空指针异常 Sub s = new Sub(); s.eat(); } }结果:发生空指针异常。分析:当创建Sub对象时,会先执行父类里的构造器,而父类构造器中调用了eat()方法,但是,调用的并不是父类中的eat()方法,而是子类中的eat()方法,此时Sub对象的name实例变量是null,从而引发空指针异常。
-
什么时候需要从父类派生子类?
-
子类需要额外增加属性,而不仅是属性值的改变;比如,从People类中派生出Student子类,Student类中需要学号Id属性,而People类中没有该属性。
-
子类需要增加自己的行为方式(新增方法或重写方法);从People类中派生出Student子类,Student类中需要考试方法test(),而People类中没有该属性,该属性用于描述Student类的行为。
2529

被折叠的 条评论
为什么被折叠?



