精华内容
下载资源
问答
  • java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些...
    java可以多重继承吗

    java可以多重继承吗

    有时我写了几篇有关Java继承接口组成的文章。 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处。

    Java中的多重继承

    多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言(例如C ++)不同, java不提供对类中多重继承的支持 Java不支持类中的多重继承,因为它可能导致钻石问题,而不是提供一些复杂的方法来解决它,而是有更好的方法来实现与多重继承相同的结果。

    钻石问题

    为了轻松理解钻石问题,我们假定Java中支持多重继承。 在这种情况下,我们可以像下面的图像那样有一个类层次结构。

    钻石问题多重继承

    假设SuperClass是一个抽象类,声明了一些方法,而ClassA,ClassB是具体类。

    超类.java

    package com.journaldev.inheritance;
    
    public abstract class SuperClass {
    
    	public abstract void doSomething();
    }

    ClassA.java

    package com.journaldev.inheritance;
    
    public class ClassA extends SuperClass{
    
    	@Override
    	public void doSomething(){
    		System.out.println("doSomething implementation of A");
    	}
    
    	//ClassA own method
    	public void methodA(){
    
    	}
    }

    ClassB.java

    package com.journaldev.inheritance;
    
    public class ClassB extends SuperClass{
    
    	@Override
    	public void doSomething(){
    		System.out.println("doSomething implementation of B");
    	}
    
    	//ClassB specific method
    	public void methodB(){
    
    	}
    }

    现在,让我们说ClassC的实现如下所示,它扩展了ClassA和ClassB。

    ClassC.java

    package com.journaldev.inheritance;
    
    public class ClassC extends ClassA, ClassB{
    
    	public void test(){
    		//calling super class method
    		doSomething();
    	}
    
    }

    注意, test()方法正在调用超类doSomething()方法,这导致歧义,因为编译器不知道要执行哪个超类方法,并且由于菱形类图,它被称为Diamond Problem,这是Java不支持类中的多重继承的主要原因。

    请注意,具有多个类继承的上述问题也可能只出现在三个类中,它们全部具有至少一个通用方法。

    接口中的多重继承

    您可能已经注意到,我一直在说类不支持多重继承,但是接口支持多重继承,并且单个接口可以扩展多个接口,下面是一个简单的示例。

    接口A.java

    package com.journaldev.inheritance;
    
    public interface InterfaceA {
    
    	public void doSomething();
    }

    接口B.java

    package com.journaldev.inheritance;
    
    public interface InterfaceB {
    
    	public void doSomething();
    }

    注意,两个接口都声明了相同的方法,现在我们可以拥有一个扩展这两个接口的接口,如下所示。

    接口C.java

    package com.journaldev.inheritance;
    
    public interface InterfaceC extends InterfaceA, InterfaceB {
    
    	//same method is declared in InterfaceA and InterfaceB both
    	public void doSomething();
    
    }

    这样做非常好,因为接口仅声明方法,并且实际实现将由实现接口的具体类完成,因此在接口的多重继承中不存在任何歧义的可能性。

    这就是为什么Java类可以实现多重继承的原因,例如下面的示例。

    接口Impl.java

    package com.journaldev.inheritance;
    
    public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {
    
    	@Override
    	public void doSomething() {
    		System.out.println("doSomething implementation of concrete class");
    	}
    
    	public static void main(String[] args) {
    		InterfaceA objA = new InterfacesImpl();
    		InterfaceB objB = new InterfacesImpl();
    		InterfaceC objC = new InterfacesImpl();
    
    		//all the method calls below are going to same concrete implementation
    		objA.doSomething();
    		objB.doSomething();
    		objC.doSomething();
    	}
    
    }

    您是否注意到,每当我覆盖任何超类方法或实现任何接口方法时,我都使用@Override注释,它是三个内置的Java注释之一,并且 在覆盖任何方法时都应 始终使用覆盖注释

    救援人员组成

    因此,如果我们想在ClassC使用ClassA函数methodA()ClassB函数methodB() ,该解决方案在于使用composition ,这是ClassC的重构版本,该版本使用了composition来利用这两种类方法以及doSomething ()方法来自其中一个对象。

    ClassC.java

    package com.journaldev.inheritance;
    
    public class ClassC{
    
    	ClassA objA = new ClassA();
    	ClassB objB = new ClassB();
    
    	public void test(){
    		objA.doSomething();
    	}
    
    	public void methodA(){
    		objA.methodA();
    	}
    
    	public void methodB(){
    		objB.methodB();
    	}
    }

    组合与继承

    Java编程的最佳实践之一是“通过接口支持组合”,我们将研究一些偏爱这种方法的方面。

    1. 假设我们有一个超类和子类,如下所示:

      ClassC.java

      package com.journaldev.inheritance;
      
      public class ClassC{
      
      	public void methodC(){
      	}
      }

      ClassD.java

      package com.journaldev.inheritance;
      
      public class ClassD extends ClassC{
      
      	public int test(){
      		return 0;
      	}
      }

      上面的代码可以编译并正常工作,但是如果ClassC实现更改如下:

      ClassC.java

      package com.journaldev.inheritance;
      
      public class ClassC{
      
      	public void methodC(){
      	}
      
      	public void test(){
      	}
      }

      请注意,子类中已经存在test()方法,但返回类型有所不同,现在ClassD将无法编译,并且如果您使用的是任何IDE,它将建议您更改超类或子类中的返回类型。

      现在想象一下这样的情况:我们具有多个级别的类继承,并且超类不受我们控制,我们别无选择,只能更改我们的子类方法签名或名称以消除编译错误,我们还必须在所有方面进行更改子类方法被调用的地方,因此继承使我们的代码易碎。

      组合永远不会发生上述问题,这使其比继承更有利。

    2. 继承的另一个问题是,我们将所有超类方法公开给客户端,并且如果我们的超类设计不当且存在安全漏洞,那么即使我们在实现类时全神贯注,我们也会受到不良实现的影响。超类。组合可以帮助我们提供对超类方法的受控访问,而继承不提供对超类方法的任何控制,这也是组合优于继承的主要优势之一。
    3. 组合的另一个好处是它提供了方法调用的灵活性。 我们上ClassC实现不是最佳的,它提供了与将要调用的方法的编译时绑定,只需进行最小的更改,我们就可以使方法调用变得灵活并使其动态。

      ClassC.java

      package com.journaldev.inheritance;
      
      public class ClassC{
      
      	SuperClass obj = null;
      
      	public ClassC(SuperClass o){
      		this.obj = o;
      	}
      	public void test(){
      		obj.doSomething();
      	}
      
      	public static void main(String args[]){
      		ClassC obj1 = new ClassC(new ClassA());
      		ClassC obj2 = new ClassC(new ClassB());
      
      		obj1.test();
      		obj2.test();
      	}
      }

      上面程序的输出是:

      doSomething implementation of A
      doSomething implementation of B

      方法调用的这种灵活性在继承中不可用,并且提倡了最佳做法,即在继承方面偏向于组合。

    4. 单元测试很容易组合,因为我们知道超类中正在使用的所有方法,并且可以对其进行模拟,而在继承中,我们很大程度上依赖于超类,并且不知道将使用所有超类方法,因此我们需要要测试超类的所有方法,这是一项额外的工作,由于继承,我们不需要这样做。

    理想情况下,仅当在所有情况下父类和子类的“ is-a ”关系均成立时才应使用继承,否则我们应该继续进行组合。

    翻译自: https://www.javacodegeeks.com/2013/08/multiple-inheritance-in-java-and-composition-vs-inheritance.html

    java可以多重继承吗

    展开全文
  • 类的继承是存在局限性的,一个 子类只能继承一个父类,但是可以多重继承,多重继承就是先让B类继承A类,之后再让C类继承B类。calss A{} //这是父类class B extends Af{; //此时 B类具备了A的操作class C extends B{}...

    类的继承是存在局限性的,一个 子类只能继承一个父类,但是可以多重继承,多重继承就是先让B类继承A类,之后再让C类继承B类。

    calss A{}   //这是父类

    class B extends Af{;   //此时 B类具备了A的操作

    class C extends B{};   //此时 C类有A类和B类的所有操作

    DEMO:多重继承

    01e418aa700cf6ebb7690b06e61c8b0e.png

    78731978dc65d8f57210f0ef006d3243.png

    此时C类就继承了A类和B类的属性以及方法,其实上在实例化子类的时候会调用父类的构造方法(虽然子类不能继承父类的构造方法,但是在实例化子类的时候会默认调用),而且默认调用的是无参构造方法。

    DEMO:调用父类的构造方法

    d0b26ad8b51c9cf335a0f23a7f01ae03.png

    通过上面的错误提示就可以知道实例化子类的时候一定要先调用父类的构造方法,默认调用的是无参数构造方法,此时如果提供了有参数构造方法,那么我们要将无参数构造方法显示的定义。

    DEMO:无参构造方法调用

    71fa3380c6ad467159edcf05eaa079d8.png

    b8f5f5962f933bf6133f0b4ac8d0c9d4.png

    知道了实例化子类的时候需要调用父类的无参构造方法,如果要调用父类的有参数构造方法呢?此时需要使用到一个新的关键 字“super

    DEMO:调用有参数构造方法

    8cf4fc7a7842e3e6986c0c1d794c30bf.png

    3aa282955f95be1f68050472d21eceea.png

    4edc43dcec2d5be45a7622bba93f5dda.png

    以上就是构造方法在子类和父类之间调用的关系,你要清楚。

    总结:

    1、继承有单继承的局限(一个子类只能有一个父类),但是可以多重继承

    2、在实例化子类的时候会先调用父类的构造方法(默认调用的是无参数构造,如果要调用有参数构造需要使用关键字super实现)

    3、如果是多重继承,那么实例化子类的时候最先调用的是最高父类的构造方法,依次往下

    有完整的Java初级,高级对应的学习路线和资料!专注于java开发。分享java基础、原理性知识、JavaWeb实战、spring全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!

    欢迎关注微信公众号:码邦主

    展开全文
  • 1.简要介绍java程序的健壮性。答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的...另答:因为它有8种简单数据类型不是面向对象的,可以直接使...

    1.简要介绍java程序的健壮性。

    答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的垃圾回收机制也有效的避免了内存的泄漏。

    2.为什么说java语言是完全面向对象的?(其实我觉得它不是完全面向对象的)

    答:因为它不支持任何面向过程的程序设计技术它的所有程序设计技术都是用类来实现的。

    另答:因为它有8种简单数据类型不是面向对象的,可以直接使用它,用static申明的变量或方法不是面向对象的,因为它不属于任何一个对象,要调用它可以直接使用,不用对它进行实例化(这种方法还在争论中)。

    3.简要介绍java如何实现安全性。java支持多重继承吗

    答:首先JAVA删除了指针这就避免了非法的内存操作,所有对内存的操作都必须通过对象的实例来实现。而且当我们从网上下载代码执行是它的安全系统能确保恶意程序不会随便访问我们本地计算机的资源。

    4.为什么说java是解释性的?

    答:因为我们在执行JAVA文件时,编译器会先把代码译成字节码文件,这是一种中间代码,然后JAVA解释器才进行执行。

    5.简要介绍java的平台无关性。

    答:JAVA程序是在虚拟机上执行的,只要安装了JAVA虚拟机它就可以以字节码的形式在任何平台上执行。

    6.简要介绍java的多态性。

    答:多态性是指同名的不同方法在程序中共存,系统根据不同的情况调用不同的方法实现不同的功能。实现多态性的方法有两种:覆盖实现,重载实现。java支持多重继承吗

    7.简要介绍java是强类型检查语言。

    答:JAVA对数据类型的检查非常严格,在定义和用变量时必须先指定其类型而且它只允许数据类型的向上提升,而且不允许出现会出现数据丢失的附值(如把小数附给整形)。

    8.int和 Integer有什么区别?

    答:int是简单数据类型(整形)而Integer是整形的封装类。

    9.简要介绍String和StringBuffer的区别?

    答:String类代表不可变字符串。在值创建之后就不能被改变。而StringBuffer是可变的字符序列,初始容量16字节,通过某些方法可改变其内容和长度。

    10.简要介绍java的垃圾回收机制。

    答:JAVA的垃圾回收机制就是:当一个对象没有任何引用时,该对象便会启动垃圾回收器调用finalize方法以配置系统资源或执行相关的清除操作。

    1、面向对象编程(OOP):OOP最重要的思想是类,类是模板,从类中构造一个对象,即创建了这个类的一个实例;

    2、封装:是把数据和行为结合在一起,并对对象使用者隐藏数据的实现过程,通常一个对象中的数据叫他的实例字段(instance field) ;

    3、继承:Java中允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段;

    4、多态:在java中,对象变量是多态的;需要注意的是java中不支持多重继承;

    5、类之间的关系:

    use-a :依赖关系 ;

    has-a :聚合关系 ;

    is-a : 继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法;

    6、构造对象使用构造器:构造器是一种特殊的方法,它的作用是构造对象并对其初始化,

    构造器特点:构造器可以有0个,一个或多个参数 ;

    构造器和类名称是相同的;

    一个类可以有多个构造器;

    构造器没有返回值;

    构造器一定是和new运算符一起使用的;

    gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==

    7、包(package):Java允许把一个或多个类放在一起成为一组,称作为包,以便于更好的管理,标准Java库分为许多包如java.lang、java.util、java,net等,包是分层次的,所有的java包都在java和javax包层次内;

    8、重载:当多个方法具有相同的名字而含有不同的参数时,这时就发生了重载,编译器会选出调用哪个方法;

    9、健壮特性:Java采取了一个安全指针模型,能有效防止重写内存和数据崩溃;

    10、安全:Java可以用来构建防病毒和防攻击的系统,事实证明Java在防毒方面做的比较好;

    11、可移植性:Java中对基本数据结构类型的大小和算法都有严格的规定,所以有很好的可移植性;

    12、多线程:由于Java的机制,它处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成,所以多线程是Java作为服务器端开发语言的流行原因之一;

    13、动态绑定:这是Java调用对象方法的机制;

    14、Java中的每一个类都是从Object类扩展而来的;

    15、内部类:一个内部类的定义是定义在另一个内部类中;

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/sanxing/article-69370-1.html

    展开全文
  • Interface3 Extends Interface0, Interface1, interface……不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个呢?但接口不存在这样的问题,接口全都是抽象方法继承....

    接口是常量值和方法定义的集合。接口是一种特殊的抽象类。

    java类是单继承的。classB Extends classA

    java接口可以多继承。Interface3 Extends Interface0, Interface1, interface……

    不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个呢?

    但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。

    自我看法

    因为类如果可以多继承,实例化时,如果要跳用父类的方法,如果两个一样,

    根本就不知道该调用那个父类的方法;

    但是接口就不一样了,因为接口继承多个接口,就算多个接口有相同的方法,

    但是最终实现接口的类只能实现一个方法且@Override一个方法,所以调用时就

    不会有问题了

    注意:

    1)一个类如果实现了一个借口,则要实现该接口的所有方法。

    2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。

    3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。

    分享到:

    18e900b8666ce6f233d25ec02f95ee59.png

    72dd548719f0ace4d5f9bca64e1d7715.png

    2012-05-06 11:32

    浏览 23653

    评论

    展开全文
  • 这里我们首先应该知道java多重继承的类型: -多重继承状态。多重继承的实现。多重继承的类型。Java“不支持状态的多重继承,但它支持使用默认方法实现多次继承,因为java 8发布和带接口的类型的多重继承。那么这里...
  • Java多重继承上的设计甚至不如 C++。这个论点让人很难接受,毕竟我们在第一堂 Java 课上学到了:“Java 的优越性之一是摒除了 C++ 中易出错的多重继承”。然而,Java 的类单继承、接口多继承的设计,最终使 Java ...
  • java中接口可以继承接口吗?

    千次阅读 2014-09-12 12:55:13
    java中不允许类多重继承的主要原因是:如果A同时继承B和C,而假如B和C同时有一个d方法,A如何决定该继承哪一个呢?  但接口不存在这样的问题,接口中全都是抽象方法,继承谁都无所谓,所以接口可以继承多个接口。 ...
  • java 一个接口可以继承多个接口吗

    千次阅读 2018-06-19 14:36:33
    Interface3 Extends Interface0, Interface1, interface……不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?但接口不存在这样的问题,接口全都是抽象方法继承....
  • Java继承

    2019-07-26 12:26:00
    Java多重继承吗? 单一继承是指只能从一个父类继承它的行为与特征; 多重继承是指从多于一个父类中继承。 如果java要解决这个问题,需要引入更复杂的机制,这和java 的初衷是背道而驰的(simple), 但是java中...
  • 此代码在我的IDE中显示有效,并且它确实编译:interface Foo extends Runnable, Set, Comparator { }但我听说Java中不允许多重继承。 为什么接口似乎有例外?哪篇文章说不可能? 他们要么错了,要么你误解了他们,...
  • 我们都知道,Java类是单继承,那接口可以继承吗? 答案是:Java 接口是可以继承多个接口的 Java不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢? 但接口不...
  • 但是接口里面有default方法,加上接口可以继承,这样问题就来了。不信,我们走着瞧。 跳一下。还记得吗:函数接口只允许有一个抽象方法,Lambda表达式默认实现这个抽象方法。比如要对一个参数判断是否满足某条件,...
  • java接口的继承问题

    2018-06-22 13:38:55
    我们都知道,接口是一种...java中不允许类多重继承,这样就不会有如果A同时继承B和C,而B和C同时有一个D方法,那么我们无法确定A到底继承了哪一个方法。但是难道接口就不会有这样的问题吗?猜想是因为接口里面都是抽...
  • 展开全部接口是常量32313133353236313431303231363533e58685e5aeb931333363373163值和方法定义的集合。...Interface3 Extends Interface0, Interface1, interface……不允许类多重继承的主要原因...
  • 第8章 抽象类与接口 陶俊 内容大纲 抽象类 修改器与访问器 接口实现 类的多重继承 接口继承 西北大学公共管理学院 陶俊 1 引言 可根据抽象类派生出新的子类再由子类来创建对象 java接口是提升面向对象编程扩展性而...
  • 简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有... 还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识...
  • 昨日内容回顾类成员构造函数:和类同名...接口之间是继承关系,可以多重继承类和接口之间是实现关系,类可以实现多个接口class A implements B,C,D面向接口编程降低耦合度.抽象类abstract class抽象方法没有方法体,...
  • Q:Java支持多重继承吗? A:Java不支持多重继承,即一个子类只能有一个父类 Q:Java的类没有使用extends关键字的话,默认是哪个类的子类? A:Object类,任何类都是Object类的子孙类(Object类是java.lang包中的...
  • 内部类的作用:内部类可以很好的实现功能隐藏,可以添加private、protected等权限控制可以避免修改接口而实现同一个类中两种同名方法的调用可是实现多重继承(重要)内部类和外部类相互调用方式:一:非静态内部类内部...
  • 简单来说,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,...还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如R...
  • 由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有...
  • 简单说:1.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,2.JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,3.继承只能继承一个类,但implements可以...
  • 此外,Java和C#等几种流行的编程语言不支持多重继承,这限制了这种方法的好处。 装饰器模式为扩展对象功能提供了一种灵活的继承替代方法。此模式的设计方式是多个装饰器可以堆叠在一起,每个...
  • JAVAday18

    2020-12-14 23:55:10
    但是可以多重继承, 一个子类继承了一个父类, 那么久拥有了 父类的所有的公共资源, 但是私有属性 ,获取不到, 必须提供 公共的属性的访问器, 继承中构造器可以被继承吗?不可以,但是必须被子类调用, 默认...
  • 接口和抽象类中只有方法名,没有定义的,如果你不定义 也就是空方法,接口就是为了弥补java不能多重继承,接口针对的是对象而不是实现。实现的部分可以交由对象去实现。这就是java中的多态啊。 ...
  • 在往下阅读之前 你可以尝试实现多重继承! 如果你了解c++,在c++中是支持多重继承的 但是Java把这个特性剔去了。 Java 为了解决在编程过程中遇到的多重继承的需要 设计了内部类这个特性去解决
  • Java基础总结

    2019-03-09 12:07:28
    Java 基础 ...Q4: Java 中如何实现多重继承 2. final关键词的使用和区别 Q1:final的含义 Q2: final 使用 Q3:好处 3.异常分类和处理机制 Q1: java提供两类主要异常:运行时异常和...
  • 一个类有且仅有一个父类,这种特性被称之为“单重继承”,Java不支持多重继承(重点) 为什么? ​ 1,语法设计 ​ 2,多重继承会来带麻烦 Java虽然不支持多重继承,但是父类还有父类,从而形成了继承链 两个重要...
  • 如果你是想快速找工作的转行求职者,我推荐你学Python或者JAVA;如果你是在校大学生,有充足的自由时间去学习,未来想从事编程行业,我推荐你学C++...C语言里的指针,多重继承概念等虽然晦涩,但是却贴近底层实现,...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

java可以多重继承吗

java 订阅