java接口与抽象类,java接口和抽象类

  java接口与抽象类,java接口和抽象类

  相信大家都有这种感觉:抽象类和接口的异同太多了。通常,这两者都会让初学者感到困惑。无论是实际编程还是面试,抽象类和接口都特别重要!希望大家看完这篇文章,能冷静的理解他们两个。

  我所理解的抽象类

  1、抽象类和类的相样韵味

  1)抽象类和类一样,可以用来继承。

  2)一个类可以拥有的组件,抽象类可以拥有的【包括构造方法,静态静态修饰符等。]

  2、抽象方法

  抽象方法:在讲述不同的魅力之前有必要了解清楚:

  1)抽象方法没有方法体。

  2)抽象方法必须用抽象关键字修饰。

  3)有抽象方法的类一定是抽象类。

  4)抽象方法必须是公共的或受保护的,默认是公共的。

  3、抽象类和类的异样韵味

  1)、抽象类必须用abstract关键字修饰,用abstract修饰的类就是抽象类!

  2)、抽象类是可选的抽象方法。

  3)抽象类虽然有构造方法,但不能直接用来创建对象实例。

  4)抽象类不能用final或private来修饰。

  5)外部抽象类不能用static修饰,内部抽象类可以用Static声明。这句话的理解代码如下:

  //定义一个抽象类a。

  抽象A类{

  //定义内部抽象类b。

  静态抽象类B{ //static定义的内部类属于外部类。

  公共抽象void sa method();

  }

  }

  C类扩展了A.B{

  public void sa method(){

  System.out.println (======执行的SAOMethod方法====);

  }

  }

  公共类StaticDemo {

  公共静态void main(String[] args) {

  A.b ab=new C();//向上转换

  ab . sa method();

  }

  }

  运行结果:=====saoMethod被执行====有些童鞋傻。C延伸A.B是一种什么操作,还能这么玩?是的,当用static声明的内部抽象类等价于外部抽象类时,类名以“外部类”的形式表示。内部类”。这种骚操作没错,但是稳。

  4、掌握抽象类

  类是为了继承而存在的。如果你定义了一个抽象类,但是没有继承它,那么创建的抽象类是没有意义的!

  抽象类虽然有构造方法,但不能直接实例化。要创建的对象涉及向上转换,主要用来被它的子类调用。

  还有一种说法是,抽象类可以没有抽象方法。这只是一个需要记住的重要概念。一定要记住!在实践中,抽象类一般都有抽象方法,否则抽象类就失去了意义,就像普通类一样!

  如果一个普通类A继承了一个抽象类B,那么子类A必须实现父类B的所有抽象方法,如果子类A没有实现父类B的抽象方法,那么子类A也必须定义为一个抽象类,也就是抽象类。

  我所理解的接口

  接口可以说是抽象类的一个特例。抽象类和接口的异同太多了。相比之下,接口更像是行为的抽象!

  1、接口特性

  1)界面中方法默认为public abstract,界面中成员变量不写默认为public static final

  2)接口没有构造方法。

  3)接口可以实现“多继承”,一个类可以实现多个接口。实现编写格式可以直接用逗号分隔。

  2、接口必知

  该接口只能包含公共静态最终变量。如果不写,默认为public static final。如果用private来修饰,编译会失败。

  接口中的所有方法都将被隐式指定为公共抽象方法,并且只能是公共抽象方法。用其他关键字修改,比如private、protected、static、 final,会导致编译失败。

  3、接口误区

  很多网上文章都说接口里的方法都是抽象方法。博主回去研究发现,这其实不够严谨。只看一个简单的程序。

  包接口。

  接口AA{ //接口AA

  默认void hh(){

  system . out . println( 123 );

  };

  }

  类实现aa {//实现接口。

  }

  公共类接口设计{

  公共静态void main(String[] args) {

  AA a=new BB();//通过实现类来创建实例

  a . hh();

  }

  }

  运行结果:123显然hh方法并不是一个抽象的方法,只是这样的设计失去了接口的意义。实际开发中不会有这样的代码,真的有点死胡同的魅力,所以我不否认网上的言论,但是我觉得不够严谨。我觉得大家关注一下比较好.如果面试官听到你这样的回答,可能会对你印象深刻,认为你是一个向往和探索知识,有个人想法的学习者。

  抽象类和接口本质区别

  抽象和接口的本质区别主要来自两个方面:语法区别和设计思想。

  1、语法区别

  2、设计思想区别

  对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现(相当于写一个通用类的通用方法,添加方法体的实现代码),子类可以不变;但不用于接口。如果接口改变了,所有实现这个接口的类也必须相应地改变。这个应该很好理解。

  从设计的角度来说,抽象类是一个类的抽象,抽象类抽象了整个类,包括属性和行为。接口是行为的抽象,而接口是类部分(行为)的抽象。从某种角度来说,接口更像是抽象的抽象!

  如何理解上面这段话?

  了解两种设计思路的区别,要从程序员宜春和卖花女(一只可爱的小母猪)的故事说起。程序员伊春每天过着3.1分的生活,不是吃饭就是睡觉,闲暇时还能敲代码。花姑娘很神奇,每天过着1.1分的生活,不是吃饭就是睡觉,闲暇时吃饭就是睡觉。程序员伊春和卖花女过着幸福安逸的生活。突然有一天,风起云涌,天拍~天变~,邪恶的产品经理来索求了。设计一个程序员宜春和卖花女的程序,要求用抽象类或者接口来设计。这个时候你会怎么设计?这里有两个设计方案。

  方案一:用抽象类设计分别设计eat、sleep和qiaoDaiMa方法,具体代码如下:

  抽象类Myclass{

  公共抽象void eat();

  公共抽象void sleep();

  public abstract void qiaoDaiMa();

  }方案二:用接口设计分别设计eat、sleep和qiaoDaiMa方法。具体代码如下:

  接口Myclass{

  公共抽象void eat();

  公共抽象void sleep();

  public abstract void qiaoDaiMa();

  }显然,无论是哪个类继承了抽象类,还是实现了上述接口,都会出现同样的情况:重写它们的抽象方法。

  如果宜春有100个程序员,以上设计都很好解决。但对卖花女不起作用。花姑娘不能敲代码的高端操作!百花女改写的乔代玛法毫无意义。显然这个设计有问题。

  从上面可以看出,吃饭和睡觉对于乔代玛法来说,不是一个范畴的行为(方法)。其实我们可以这样设计:定义一个包含eat和sleep方法的抽象类,然后定义一个包含乔代玛方法的接口。具体代码如下:

  抽象类Myclass{

  公共抽象void eat();

  公共抽象void sleep();

  }

  接口MyclassTwo{

  public abstract void qiaoDaiMa();

  }

  宜春类扩展了Myclass实现了MyclassTwo{

  @覆盖

  public void eat() {

  }

  @覆盖

  公共无效睡眠(){

  }

  @覆盖

  public void乔代玛(){

  }

  }我们要做的就是让一百个程序员伊春继承抽象类,实现接口,而花姑娘直接继承抽象类。这个设计很完美。

  同样,讲这个故事也是不负责任的。为什么要捏?因为你会发现,抽象类和这样设计出来的接口,似乎没有什么区别。只是现在抽象类换成接口,接口换成抽象类,实现效果是一样的。代码如下:

  接口Myclass{

  公共抽象void eat();

  公共抽象void sleep();

  }

  抽象类MyclassTwo{

  public abstract void qiaoDaiMa();

  }于是,为了解释清楚设计思路的区别,程序员伊春和卖花女的故事不得不继续下去。

  众所周知,可爱的小母猪一般都是粉色的吧?这时候我们产品经理又改了需求。什么?产品经理家的100只小猪中有一只是黑白相间的赛,嗯?

  万恶的产品经理只会不合理的改变需求,但产品经理永远不会知道自己一味的逼迫程序员,程序员自己也不知道自己有多优秀!

  众所周知,可爱的小母猪一般都是粉色的吧?这时候我们产品经理又改了需求。什么?产品经理家的100只小猪中有一只是黑白相间的赛,嗯?

  万恶的产品经理只会不合理的改变需求,但产品经理永远不会知道自己一味的逼迫程序员,程序员自己也不知道自己有多优秀!

  所以这一次,我们都知道,抽象类和接口都是可以有成员变量的,只不过接口比较苛刻只能是public static final正是因为这一点!抽象类和接口的设计精髓就在这里了,这一次我们这样设计:

  接口Myclass{

  公共抽象void eat();

  公共抽象void sleep();

  }

  抽象类MyclassTwo{

  String color= red

  public abstract void qiaoDaiMa();

  }让宜春班这样设计。

  包抽象测试;

  接口Myclass {

  公共抽象void eat();

  公共抽象void sleep();

  }

  抽象类MyclassTwo {

  String color= red

  public abstract void qiaoDaiMa();

  }

  宜春类扩展了我的类二实现了我的类{

  @覆盖

  public void eat() {

  }

  @覆盖

  公共无效睡眠(){

  }

  @覆盖

  public void乔代玛(){

  }

  }

  公共类AbstractDemo {

  公共静态void main(String[] args) {

  宜春yc=新宜春();

  }

  }但是伊春可以忽略颜色的属性,当作不存在,除非伊春不嫌弃自己也是一个红赛派格哈哈哈。

  还有花童们要注意了!然后让产品经理家里的100只小猪设计代码如下;

  包抽象测试;

  接口Myclass {

  public abstract void qiaoDaiMa();

  }

  抽象类MyclassTwo {

  String color= red

  公共抽象void eat();

  公共抽象void sleep();

  }

  猪班扩展我的二班{

  @覆盖

  public void eat() {

  }

  @覆盖

  公共无效睡眠(){

  }

  }

  公共类AbstractDemo {

  公共静态void main(String[] args) {

  猪p=新猪();

  String color= blackWhite

  system . out . println(color);

  }

  }剩下的99个花童不需要直接动,就是不需要String color= blackWhite在这段代码中,默认情况下它的颜色属性是红色。

  这个时候抽象类和接口是不可替代的,所以抽象类和接口的设计思路是非常清晰的。你看怪不怪~

  本文来自java入门专栏,欢迎学习!以上是为了深入理解java中抽象类和接口的细节。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: