Java抽象类与接口内容详解

在刚入门的时候,我就接触到了接口与抽象类,之前还写过一篇博客。但内容其实很少,只是写了最基本的概念。现在回头看发现Java里每一个点其实都值得去细细钻研。

抽象类与接口的实现

大家都知道接口是implements实现,抽象类是extends继承。但有没有想过他们的实际意义是什么?在一开始学习的时候,老师 告诉我们接口和继承都是为了写一个带有方法体和属性的框架,方便后人直接使用。但随着深入的学习我才知道,接口并不止于让你少写那几个方法的几行代码。比如ActionListener这样的监听器,我们就是通过实现接口来让按钮能够响应的。

方法体与属性

相同的是,在传统的Java编程中,接口和抽象类都不能拥有私人的方法与属性。但在Java9之后,接口可以拥有私人方法,但需要遵循以下几点
1.不能是抽象方法
2.私有方法只能被内部方法调用
3.私有静态方法可以在其他静态或非静态方法里使用
4.非静态方法不能在私有静态方法中使用

接口没有构造方法,所以不能被直接new实例化,但可以通过子类实例上转型产生一个接口对象。抽象类有构造方法,但只是用于初始化,而不是实例化。
在Java8之后,抽象类可以拥有static和default方法,但static不能被继承,也不能被实现,只能自身调用,而default可以被子类方法调用。
值得一提的是,静态方法被继承后不会被重写,而是会被隐藏。重写地功能是,重写之后子类优先级高于父类,而隐藏不存在这种优先级。所以我们大概可以理解为,静态方法无法被重写。

大家看看接下来这段是否算抽象类的实例化

public abstract class C{
 private String c;
 public void C(String c){
System.out.println("父类已经被实例化");
this.c=c;
System.out.println(c);
}
}
public class B extends C{
public void C(String c){
super(c);
System.out.println("子类被实例化了");
}
public static void main(String[] args){
C c=new B("c");
}
}

看起来是生成了一个实例化的抽象类,其实只是实例化了抽象类的子类,就算不显式地调用父类的构造方法,默认也会有super()这一句。
举个例子

public abstract class A{a=1;}
public class B extends A{b=2;}

在jvm层面来看,创建语句A a=B b是在hostpot中生成了一个instanceoopdesc对象,这个对象包含三个部分
1._mark对象头
2.metadata(元数据指针,这个指针指向的是本身的类,也就是说,指针指向的类才是真正生成的类)
3.实例数据区(存放着数据a=1 b=2,a在前面,也就是在生成这个对象实例时,非静态方法和属性就已经被放进了hostpot的opp对象对等体中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值