java中abstract 和interface的区别与相似之处?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

a1.m();

a1.m1();

a1.m2();

b.mb();

c.mc();

d.mb();

d.mc();

d.md();

e.me();

}

}

/*

为什么要定义抽象类

留给子类继承

子类需要继承抽象类,实现里面的抽象方法,这样子类可以创建对象;

*/

interface IA{

public static final int M = 10;

//public static final可以不写,默认有

int M1 = 10;

double N = 2.78;

public abstract void m();

//public abstract也可以省略不写,默认有

void m1();

void m2();

}

abstract class ClassA{

abstract void ma();

}

interface IB{

void mb();

}

interface IC{

void mc();

}

interface ID extends IB,IC{

void md();

}

abstract class ClassE{

public abstract void me();

}

//实现类

//一个类去实现接口,如果这个类不希望也成为抽象类,就必须实现接口中所有方法

//否则这个类也是抽象类

class Impl extends ClassE implements IA,ID{

//public 必须要写,不写的话是默认default

public void m1(){

System.out.println(“1111”);

}

public void m2(){

System.out.println(“22222”);

}

@Override

public void m() {

// TODO Auto-generated method stub

}

@Override

public void me() {

// TODO Auto-generated method stub

}

@Override

public void mb() {

// TODO Auto-generated method stub

}

@Override

public void mc() {

// TODO Auto-generated method stub

}

@Override

public void md() {

// TODO Auto-generated method stub

}

}

作用:

接口的多继承

  • 利用接口去实现多继承,不会破坏类之间树状关系的简单性

  • java中,多个子类主要的共性抽象成父类,次要的共性抽象成接口

  • 接口中所有方法都是抽象方法

  • Java中的弱耦合,遵循同一标准;

package test;

public class TestInterface2 {

public static void main(String[] args) {

// TODO Auto-generated method stub

//创建一个台灯对象

Lamp l = new Lamp();

//创建一个黄灯泡对象

YellowLight light = new YellowLight();

//将黄灯泡传入到台灯的setLight方法中

l.setLight(light);

//然后执行台灯的开灯方法

l.powerOn();

/*

  • 思考一个问题:

  • 这只能传入一个黄灯泡对象,如果想要再传入其他灯泡呢,这种方式就不行了

  • setLight方法中传入的是YellowLight对象,所以要想再传入其他灯泡就得重新写一个方法

  • 这样程序的耦合度就太高了,

*例如:

*/

RedLights redLight = new RedLights();

//将黄灯泡传入到台灯的setLight方法中

//l.setLight(redLight**);//所以这里台灯Lamp没有传入红灯泡 的方法

//然后执行台灯的开灯方法

//l.powerOn();

}

}

class Lamp{

YellowLight light = null;

public void setLight(YellowLight light){

this.light = light;

}

//台灯的开灯方法

public void powerOn(){

light.LightOn();

}

}

class YellowLight {

public void LightOn(){

System.out.println(“黄灯泡发黄光”);

}

}

class RedLights {

public void RedLightOn(){

System.out.println(“红灯泡发红光”);

}

}

  • 解耦合的工具, 标准

  • 把标准的使用者和标准的实现者分离

package test;

//接口的解耦合作用

public class TestInterface3 {

/**

  • 为解决上面提到的程序无法解耦的问题,这就引入了interface 的作用,

  • 利用interface可以很好的使程序达到弱耦合的效果,

  • 就是在台灯和灯泡之间加一个统一的标准,

    • 接口中所有方法都是抽象方法
  • Java中的弱耦合,遵循同一标准;

  • 解耦合的工具, 标准

  • 把标准的使用者和标准的实现者分离

  • @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

//创建台灯对象

Lamps l = new Lamps();

//创建黄灯泡对象

YellowLights light = new YellowLights();

//创建红灯泡对象

RedLight r = new RedLight();

//台灯里面传入什么就调用什么,不用再更改Lamp程序中的代码,达到弱耦合效果

l.setLight(light);

l.setLight®;

//再调用开灯方法

l.powerOn();

}

}

class Lamps{

private Light light = null;

//传入接口对象;

public void setLight(Light light){

this.light = light;

}

//开灯方法

public void powerOn(){

light.On();

}

}

//创建灯泡的接口

interface Light{

public void On();

}

class YellowLights implements Light{

public void On(){

System.out.println(“黄灯泡发黄光”);

}

}

class RedLight implements Light{

public void On(){

System.out.println(“红灯泡发红光!”);

}

}

修饰符的组合:


static final abstract (都不能修饰构造方法)

在方法中:

private

static

final

abstract

final 和abstract 相矛盾,不能同时出现

抽象类中可以有一个final属性;

一个类同时是final和abstract 是不对的

一个方法同时是final和abstract 是不对的

一个final类中有抽象方法也是不对的(final类没有子类)

static 和 abstract 不能同时出现

静态方法的覆盖没有多态

private 和 abstract 不能同时出现;

私有方法不能继承给子类

所以

private static final 可以随意组合,但均不能和abstract联用;

abstract

总结一下:abstract class 和 interface 有什么区别?


含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的。abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract 类型,接口中的成员变量类型默认为 public static final。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

[外链图片转存中…(img-R8jE72zL-1714676497344)]

[外链图片转存中…(img-PNDQ9ii0-1714676497344)]

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值