接口与继承的笔记

接口与继承

子类与父类

  • 如果一个类的声明中没有使用extends关键字,这个类被系统默认为是Object的子类。Object是java.lang包中的类。

Super关键字

  • 子类不继承父类的构造方法

  • 如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有super()语句,即调用父类的不带参数的构造方法。

注意:当我们在父类中定义多个构造方法时.应当包括一个不带参数的构造方法,以防子类省略super时出现错误

  • 子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super

final关键字

  • final 类不能被继承,即不能有子类。(final 类)
  • 不允许子类重写父类的final方法。(final 方法)
  • 成员变量或局部变量被修饰为final的,就是常量。常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能再发生变化(常量)

对象的上转型对象

A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,对象a是对象b的上转型对象

  • 上转型对象不能操作子类新增的成员变量(失掉了这部分属性)
  • 不能调用子类新增的方法(失掉了一些功能)
  • 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法
  • 上转型对象操作子类继承的方法或子类重写的方法,其作用等价于子类对象去调用这些方法。
A  a;
a = new B();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIG9isoV-1588341903535)(https://i.loli.net/2020/05/01/6HQasGFZzTqwn1E.png)]

  • 不要将父类创建的对象和子类对象的上转型对象混淆。
  • 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。
  • 不可以将父类创建的对象的引用赋值给子类声明的对象

abstract类和abstract方法

  • abstract类中可以有abstract方法

  • 如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法

  • 如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法

  • abstract类不能用new运算创建对象

  • abstract类的对象作上转型对象

    abstract class GirlFriend {  //抽象类,封装了两个行为标准
       abstract void speak();
       abstract void cooking();
    }
    
    class ChinaGirlFriend extends GirlFriend {
       void speak(){
          System.out.println("你好");
       }
       void cooking(){
          System.out.println("水煮鱼"); 
       }
    }
    ChinaGirlFriend girl =new ChinaGirlFriend();
    
    GirlFriend girl = new ChinaGirlFriend();//上转型对象
    

接口

  • 接口体中包含static常量和方法定义两部分
interface Printable { 
       public static final int MAX=100;  //等价写法:int MAX=100;
       public abstract void add();           //等价写法:void add();
       public abstract float sum(float x ,float y); //等价写法:float sum(float x ,float y);
}

  • 接口体中的default实例方法
  • default的实例方法和通常的普通的方法比就是用关键字default修饰的带方法体的实例方法
interface Printable { 
       public final int MAX = 100;  //等价写法:int MAX=100;
       public abstract void add();   //等价写法:void add();
       public abstract float sum(float x ,float y);
       public default int max(int a,int b) {   //default方法
            return a>b?a:b;
       }
	   public static void f ()  {
             System.out.println("注意是从Java SE 8开始的");
       }

}   

接口的实现

  • 一个类通过使用关键字 implements 声明自己实现一个或多个接口
  • 类实现某接口,但类不拥有接口的static方法。
  • Default方法是指,在接口内部包含了一些默认的方法实现

abstract类与接口的比较

  • abstract类和接口都可以有abstract方法。
  • 接口中只可以有常量,不能有变量;而abstract类中即可以有常量也可以有变量。
  • abstract类中也可以非abstract方法,但不可以有default实例方法。接口不可以有非abstract的方法(不是default方法,还带有方法体的方法),但可以有default实例方法。
  • 在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类去实现的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好的解决,比如,子类除了需要实现父类的abstract方法,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值