Java中的继承与接口、静态关键字、静态代码块

从java8开始:
1.接口中可以定义默认方法(default修饰),这样可解决接口升级的问题(比如接口中新增一个抽象方法会导致所有已经投放使用的实现类报错)。实现类会默认实现接口中的默认方法,实现类也可以对默认方法进行覆盖重写
2.接口中可定义静态方法(带方法体),不能通过接口实现类对象来调用接口中的静态方法,直接通过接口名来调用静态方法。(即:接口名.静态方法名)


问题描述:当我们需要抽取一个共有方法,来解决接口中两个默认方法之间的重复代码的问题。但是这个共有方法不应该让实现类单独使用,应该是私有的。
解决:java9开始,接口可定义私有方法:
1.普通私有方法,解决多个默认方法之间代码重复的问题
2. 静态私有方法,解决多个静态方法之间代码重复的问题

私有方法:只有默认方法可以调用。 
私有静态方法:默认方法和静态方法可以调用。
如果一个接口中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法中,
供默认方法 去调用。从设计的角度讲,私有的方法是对默认方法和静态方法的辅助。
public interface LiveAble { 
       default void func(){
          func1(); 
          func2();
       }
       private void func1(){ 
       System.out.println("跑起来~~~"); 
       }
       private void func2(){ 
       System.out.println("跑起来~~~"); 
       } 
 }

接口当中可以定义“成员变量”,但必须使用public static final修饰,可省略。static代表和对象无关,final代表只能进行唯一一次的赋值。接口中的常量名称使用完全大写,并用下划线进行分隔。


注意事项:
1.接口中不能含有静态代码块和构造方法的。
2.如果实现类实现的多个接口中,存在重复的抽象方法,则只需要覆盖重写一次即可。
3.如果实现类没有覆盖重写所有的接口中的所有抽象方法,那么该实现类就必须是个抽象类。
4.如果实现类实现的多个接口中,存在重复的默认方法,那么实现类必须要对冲突的默认方法 进行覆盖重写
5.如果一个类的直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。


继承关系中,父子类构造方法的访问特点:
1.子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。
2.子类构造可以通过super关键字来调用父类重载构造。
3.super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。
总结:
子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个语句。


继承时的内存图解,方法区中Fu.class{…}代表编译后的字节码文件
继承内存图解


抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束(无方法体)。
抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。抽象类也可以包含普通的成员方法。(抽象类不一定含有抽象方法,只要满足抽象方法所在的类是抽象类即可,例如适配器)
如何使用抽象类和抽象方法:
1.不能直接创建new抽象类对象。
2.必须用一个子类来继承抽象父类。
3.子类必须覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
4.创建子类对象进行使用。


静态方法不属于对象,而是属于类的。如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它。无论是成员变量,还是成员方法。如果有了static,都推荐使用类名称进行调用。
静态变量:类名称.静态变量
静态方法:类名称.静态方法()

注意事项:
1.静态不能直接访问非静态。
原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容。
“先人不知道后人,但是后人知道先人。”
2.静态方法当中不能用this。
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。

静态变量的访问内存指向图
静态变量的访问内存指向图
静态代码块特点:当第一次用到本类时,静态代码块执行唯一的一次。静态内容总是优先于非静态,所以静态代码块比构造方法先执行。
静态代码块的典型用途:用来一次性地对静态成员变量进行赋值。

public class Demo04Static {
    public static void main(String[] args) {
        Person one = new Person();
        Person two = new Person();
    }
}

补充:接口和抽象类的主要的区别

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值