Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要使用接口、多重继承与接口、接口的好处?_Java_Oop_Inheritance_Interface_Multiple Inheritance - Fatal编程技术网

Java 为什么要使用接口、多重继承与接口、接口的好处?

Java 为什么要使用接口、多重继承与接口、接口的好处?,java,oop,inheritance,interface,multiple-inheritance,Java,Oop,Inheritance,Interface,Multiple Inheritance,我对这件事还有些困惑。到目前为止,我所发现的是 (这里已经有人问过类似的问题,但我还有其他观点。) 接口只是抽象方法和最终字段的集合 Java中没有多重继承 接口可用于在Java中实现多重继承 继承的一个优点是,我们可以在派生类中使用基类的代码,而无需再次编写。也许这是遗产最重要的事情 现在 问题1。因为接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现了任何接口,那么它就是继承呢?我们没有使用它的代码 问题2。如果实现接口不是继承,那么如何使用接口来实现多重继承 第三季度。无论

我对这件事还有些困惑。到目前为止,我所发现的是

(这里已经有人问过类似的问题,但我还有其他观点。)

  • 接口只是抽象方法和最终字段的集合

  • Java中没有多重继承

  • 接口可用于在Java中实现多重继承

  • 继承的一个优点是,我们可以在派生类中使用基类的代码,而无需再次编写。也许这是遗产最重要的事情

  • 现在

    问题1。因为接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现了任何接口,那么它就是继承呢?我们没有使用它的代码

    问题2。如果实现接口不是继承,那么如何使用接口来实现多重继承

    第三季度。无论如何,使用接口的好处是什么?他们没有任何代码。我们需要在实现它的所有类中反复编写代码

    那么为什么要制作接口?

    注意:我发现了一种接口有用的情况。其中一个例子类似于在Runnable接口中,我们有一个public void run()方法,在该方法中我们定义了线程的功能,并且有一个内置的代码,该方法将作为一个单独的线程运行。所以我们只需要编码在线程中做什么,Rest是预定义的。但是,这件事也可以通过使用抽象类和所有类来实现

    那么使用接口的确切好处是什么?我们使用接口真的实现了多重继承吗?

    问题1。因为接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现了任何接口,那么它就是继承呢?我们没有使用它的代码

    我们不能。接口不用于实现多重继承。他们用更安全的,虽然稍微不那么强大的构造来代替它。注意关键字
    实现了
    而不是
    扩展了

    问题2。如果实现接口不是继承,那么如何使用接口来实现多重继承

    事实并非如此。对于接口,单个类可以有多个“视图”、不同的API或功能。例如,一个类可以同时是
    可运行的
    可调用的
    ,而这两种方法实际上都在做相同的事情

    第三季度。无论如何,使用接口的好处是什么?他们没有任何代码。我们需要在实现它的所有类中反复编写代码

    接口是一种多重继承,没有后者带来的任何问题(如

    接口的用例很少:

    VolvoXC90 implements XCModel and Volvo (Interface)
    VolvoXC95 implements XCModel and Volvo (Interface)
    
    line1: Volvo   a = new VolvoXC90();
    line2: Volvo   a = new VolvoXC95();
    line3: XCModel a = new VolvoXC95();
    
  • 目标实际上有两个身份:坦克既是车辆,又是武器。您可以使用
    Tank
    的实例,其中需要前者或后者(多态性)。这在现实生活中很少出现,实际上是多重继承更好(或特征更好)的一个有效例子

  • 简单的职责:游戏中的
    Tank
    对象的实例也是
    可运行的
    ,让您在线程中执行它,并让
    ActionListener
    响应鼠标事件

  • 回调接口:若对象实现了给定的回调接口,它将收到关于其生命周期或其他事件的通知

  • 标记接口:不添加任何方法,但可通过
    instanceof
    轻松访问,以发现对象功能或愿望
    Serializable
    Cloneable
    就是这样的例子


  • 您要寻找的是trait(比如Scala),不幸的是在Java中不可用。

    继承是指一个类从另一个类(可以是抽象的)或接口派生。面向对象(继承)的最大优点不是代码的重用(有很多方法),而是多态性

    多态性是当您有使用接口的代码时,它的实例对象可以是从该接口派生的任何类。例如,我可以有这样一种方法: public void Pet(IAnimal animal),此方法将获取一个对象,该对象是从IAnimal继承的狗或猫的实例。或者我可以有这样一个代码: 动物 然后我可以调用这个接口的一个方法: 吃()哪只狗或猫可以用不同的方式执行

    接口的主要优点是可以从其中一些继承,但是如果只需要从其中一个继承,也可以使用抽象类。下面是一篇文章,详细解释了抽象类和接口之间的区别:

    问题1。因为接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现了任何接口,那么它就是继承呢?我们没有使用它的代码

    不幸的是,在口语中,
    继承
    一词在类实现接口时仍然经常使用,尽管
    接口实现
    将是一个更好的术语-IMO,术语
    继承
    应严格用于具体或抽象类的继承。在C++和C语言等语言中,相同的语法(即<>代码>子类:Superclass < /COD>和类:接口< /代码>)用于类继承和接口实现,这可能有助于使用接口来使用“代码< >继承< /代码>的误用。Java使用不同的语法来扩展类,而不是实现接口,这是一件好事

    如果实现接口不是继承,那么如何使用接口来实现多重继承

    您可以实现mult的“效果”
    Public Class Form1
    
    Private _data As IData = Nothing
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        _data = New DataText()
        MsgBox(_data.GetData())
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        _data = New DataDB()
        MsgBox(_data.GetData())
    End Sub
    
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        _data = New DataWeb()
        MsgBox(_data.GetData())
    End Sub
    
    End Class
    
    Public Interface IData
    Function GetData() As String
    End Interface
    
    Friend Class DataText : Implements IData
    
    Friend Function GetData() As String Implements IData.GetData
        Return "DataText"
    End Function
    
    End Class
    
    Friend Class DataDB : Implements IData
    
    Friend Function GetData() As String Implements IData.GetData
        Return "DataDB"
    End Function
    
    End Class
    
    Friend Class DataWeb : Implements IData
    
    Friend Function GetData() As String Implements IData.GetData
        Return "DataWeb"
    End Function
    
    End Class
    
    VolvoV3 extends VolvoV2, and VolvoV2 extends    Volvo (Class)
    VolvoV3 extends VolvoV2, and VolvoV2 implements Volvo (Interface)
    
    line1: Volvo v = new VolvoV2(); 
    line2: Volvo v = new VolvoV3(); 
    
    VolvoXC90 implements XCModel and Volvo (Interface)
    VolvoXC95 implements XCModel and Volvo (Interface)
    
    line1: Volvo   a = new VolvoXC90();
    line2: Volvo   a = new VolvoXC95();
    line3: XCModel a = new VolvoXC95();
    
    VolvoXC90 v = new VolvoXC90();
    
    // Create VolvoXC90 but now we need to create VolvoXC95
    Volvo v = new VolvoFactory().newCurrentVolvoModel(); 
    
    /* File name : MyStreamsClasses.java */
    import java.lang.*;
    // Any number of import statements
    
    public abstract class InputStream {
      public void ReadObject(Object MyObject);
    }
    
    public abstract class OutputStream {
      public void WriteObject(Object MyObject);
    }
    
    public abstract class InputOutputStream 
        imnplements InputStream, OutputStream {
      public void DoSomethingElse();
    }
    
    /* File name : MyStreamsInterfaces.java */
    import java.lang.*;
    // Any number of import statements
    
    public interface InputStream {
      public void ReadObject(Object MyObject);
    }
    
    public interface OutputStream {
      public void WriteObject(Object MyObject);
    }
    
    public interface InputOutputStream 
        extends InputStream, OutputStream {
      public void DoSomethingElse();
    }
    
    namespace Sample
    {
        class SampleApp
        {
            private IOContext context;
    
            public SampleApp()
            {
                this.context = new JSONFileContext(); //or any of the other implementations
            }
    
            public void doSomething()
            {
                //This app can now use the context, completely agnostic of the actual implementation details.
                object data = context.LoadData();
                //manipulate data
                context.SaveData(data);
            }
        }
    
        interface IOContext
        {
            void SaveData(object data);
            object LoadData();
        }
    
        class FileContext : IOContext
        {
            public object LoadData()
            {
    
                object data = null;
                var fileContents = loadFileContents();
                //Logic to turn fileContents into a data object
                return data;
            }
    
            public void SaveData(object data)
            {
                //logic to create filecontents from 'data'
                writeFileContents(string.Empty);
            }
    
            protected void writeFileContents(string fileContents)
            {
                //writes the fileContents to disk
            }
    
            protected string loadFileContents()
            {
                string fileContents = string.Empty;
                //loads the fileContents and returns it as a string
                return fileContents;
            }
        }
    
        class JSONFileContext : FileContext
        {
            public new void SaveData(object data)
            {
                //logic to create filecontents from 'data'
                base.writeFileContents(string.Empty);
            }
    
            public new object LoadData()
            {
                object data = null;
                var fileContents = loadFileContents();
                //Logic to turn fileContents into a data object
                return data;
            }
        }
    
        class SQLiteContext : IOContext
        {
            public object LoadData()
            {
                object data = null;
                //logic to read data into the data object
                return data;
            }
    
            public void SaveData(object data)
            {
                //logic to save the data object in the database
            }
        }
    }