类的继承(二)

继承关键字(extends和implements)

继承可以用extends和implements两个关键字实现,若无这两个关键字,则默认继承Object类。

  • extends
    class A{
    
    }
    class B extends A{//A为父类,B为子类
    
    }

    Java中,继承可以多层继承,不能多重继承,只能单一继承,即一个子类只能有一个父类,extends只能继承一个类。

  • implements

  1. implements的使用可以变相使Java具有多继承的特性,这是Java为单继承灵活性不足所作的补充。类实现接口语法格式如下:

  2. public interface A{
        public void eat();
    }
    public interface B{
        public void sleep();
    }
    public class C implements A,B{//类C继承接口A,B
       
    }

    实现接口与继承父类相似,同样可以获得接口中的变量和方法,可以将接口认为是一种特殊的继承(相当于实现类继承了一个彻底的抽象类,除默认方法外,所有方法都是抽象方法的类);

  3. 实现接口,必须实现接口中的所有方法;(也就是重写这些方法)

  4. 接口可以被多重实现,接口只定义定义抽象方法,这些方法默认是public abstarct,而接口中的成员变量默认是public static final,必须显式初始化。

  • 使用继承应注意(继承关系中,子类可以直接访问父类的所有方法和成员变量,从而破坏了父类的封装性)

  1. 尽量隐藏父类的内部数据,将父类的所有成员变量设置为private访问类型,使子类不可以直接访问;

  2. 尽量不让子类随意访问修改父类的方法,对于基本不使用的方法,可以用private修饰;对于需要被外部类调用的方法,用public修饰,若该方法又不希望被重写,用final修饰;对于要被重写,又不希望被随意访问的方法,用protected修饰;

  3. 尽量不要在父类构造器中调用将要被子类重写的方法;见下例:

    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,从而引发空指针异常。

  • 什么时候需要从父类派生子类?

  1. 子类需要额外增加属性,而不仅是属性值的改变;比如,从People类中派生出Student子类,Student类中需要学号Id属性,而People类中没有该属性。

  2. 子类需要增加自己的行为方式(新增方法或重写方法);从People类中派生出Student子类,Student类中需要考试方法test(),而People类中没有该属性,该属性用于描述Student类的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值