了解扩展类和导入类之间的区别

use*_*769 4 java import inheritance extend difference

我已经看到了几个定义扩展类的线程,作为个性化类继承它扩展到的类的方法的一种方式.当你导入一个类并创建该类的实例时,你可以访问它的方法,有人可以向我解释如何扩展一个类来为你自己的类提供这些方法实际上是不同的,换句话说,我看到的唯一区别是在导入时创建标准化类的实例,当您有效扩展时,将您的个性化类转换为仅使用不同名称的标准化类.我知道我错了,但我读过的答案都无法帮助我从根本上理解其中的差异.

hel*_*cha 8

导入和扩展是两个截然不同的东西.

输入

类以包的形式组织,这提供了一个避免名称冲突的命名空间工具.导入允许您在代码中使用该类而不使用命名空间信息.

导入是可选的.如果您始终使用类的完全限定名称,则永远不必导入任何内容,但这会使您的代码难以阅读.

如果你想使日历对象的列表,例如,你要么进口java.util.List,java.util.ArrayListjava.util.Calendar与用途:

List<Calendar> array = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

或者进口什么并使用:

java.util.List<java.util.Calendar> array = new java.util.ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

有时您在不同的包中有两个具有相同名称的类.在这种情况下,如果您在代码中同时使用它们,则无法同时导入它们.您必须通过其完全限定名称来引用其中一个.例如:

List<java.awt.List> array; // you have to import java.util.List, but can't also import java.awt.List
Run Code Online (Sandbox Code Playgroud)

扩展

当您在Java中扩展时,您说子类原始类的一种类型.这是使用时必须注意的最重要的方面extends.你是说Bus extends Vehicle你说的Bus Vehicle.您不仅可以继承超类的所有非私有方法和字段,还可以在合法使用超类的任何位置使用子类.例如,如果您有此方法:

public park(Vehicle v) {
   v.drive();
   v.turn(Direction.LEFT);
   v.stop();
}
Run Code Online (Sandbox Code Playgroud)

你可以传递一个Bus作为参数,因为Bus是一个Vehicle.

parkingLot.park(new Bus());
Run Code Online (Sandbox Code Playgroud)

并且drive(),turn()stop()方法将在被调用Bus.那就是多态性.

虽然继承了方法,但继承并不是重用代码的最佳方法.大多数的时候,你需要重用代码,你可以通过组成这样做(让你的类有一个到另一个类的参考,而不是作为一个).A Car不应该延伸,Motor因为汽车不是电动机,但它可以一个电动机,并在调用汽车的方法时委托调用电动机的turnOn()方法drive().

您还可以使用接口在Java中使用不带继承的多态.


ohl*_*mar 5

举一个简单的例子(但很糟糕:/).假设你有一个Person类.

public Person 
{
    int age;
    string name;
}
Run Code Online (Sandbox Code Playgroud)

然后你有不同类型的人继承Person类,例如.

public SoftwareDeveloper extends Person 
{
    string codingLanguage;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以轻松创建SoftwareDeveloper并使用其属性,如下所示:

public static void main () 
{
    SoftwareDeveloper developer = new SoftwareDeveloper();
    System.print.out(developer.name);  
}
Run Code Online (Sandbox Code Playgroud)

如果您要"导入",则必须在SoftwareDevelopers构造函数中创建Person实例并将其公开.所以你的代码就是访问属性:

public SoftwareDeveloper
{
    public Person person;
    string codingLanguage;

    public SoftwareDeveloper(){
         person = new Person();
    }
}

public static void main () 
{
    SoftwareDeveloper developer = new SoftwareDeveloper();
    System.print.out(developer.person.name);  
}
Run Code Online (Sandbox Code Playgroud)