我见过几个定义扩展类的线程,作为个性化类继承扩展类的方法的一种方式。当你导入一个类并创建该类的实例时,你可以访问它的方法,有人可以向我解释如何扩展一个类来为你自己的类提供这些方法实际上是不同的,换句话说,我看到的唯一区别是在导入时创建标准化类的实例,当您有效扩展时,将您的个性化类转换为仅使用不同名称的标准化类。我知道我错了,但我读过的答案都无法帮助我从根本上理解其中的差异。
答案 0 :(得分:8)
导入和扩展是两个非常不同的事情。
类以包的形式组织,这些包提供了一个避免名称冲突的命名空间工具。导入允许您在代码中使用该类而不使用命名空间信息。
导入是可选的。如果您始终使用类的完全限定名称,则永远不必导入任何内容,但这会使您的代码难以阅读。
例如,如果要创建日历对象列表,请导入java.util.List
,java.util.ArrayList
和java.util.Calendar
并使用:
List<Calendar> array = new ArrayList<>();
或者不进口任何东西并使用:
java.util.List<java.util.Calendar> array = new java.util.ArrayList<>();
有时您在不同的包中有两个具有相同名称的类。在这种情况下,如果您在代码中同时使用它们,则无法同时导入它们。您必须通过其完全限定名称来引用其中一个。例如:
List<java.awt.List> array; // you have to import java.util.List, but can't also import java.awt.List
当你在Java中扩展时,你会说子类是原始类的类型。这是使用extends
时必须注意的最重要的方面。你是说Bus extends Vehicle
你是说Bus
是 Vehicle
。您不仅可以继承超类的所有非私有方法和字段,还可以在合法使用超类的任何位置使用子类。例如,如果您有这种方法:
public park(Vehicle v) {
v.drive();
v.turn(Direction.LEFT);
v.stop();
}
您可以传递Bus
作为参数,因为Bus
是Vehicle
。
parkingLot.park(new Bus());
将在drive()
中调用turn()
,stop()
和Bus
方法。那就是多态性。
虽然您继承了方法,但继承并不是重用代码的最佳方法。大多数情况下,当您需要重复使用代码时,您可以使用合成(使您的类具有引用另一个类,而不是 一个)。 Car
不应该延长Motor
,因为汽车不是电机,但它可以拥有电机,委托调用电机调用汽车turnOn()
方法时的drive()
方法。
您还可以使用接口在Java中使用不带继承的多态。
答案 1 :(得分:5)
举一个简单的例子(但不好:/)。假设你有一个Person类。
public Person
{
int age;
string name;
}
然后你有不同类型的人继承Person类,例如
public SoftwareDeveloper extends Person
{
string codingLanguage;
}
现在,您可以轻松创建SoftwareDeveloper并使用其属性,如下所示:
public static void main ()
{
SoftwareDeveloper developer = new SoftwareDeveloper();
System.print.out(developer.name);
}
如果您要“导入”,则必须在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);
}
答案 2 :(得分:2)
我认为在小范围内你的推理工作正常,但扩展的想法是你的类继承了扩展类的所有方法。
但是如果你从一个简单的想法或程序开始并想要大量扩展它,那么实例化你需要的所有类的使用会变得更加消耗。即使是一个简单的想法,进口的增加也会爆炸。
示例:
动物 - 温血动物 - 两足动物 - 人类
动物 - 温血动物 - 四足动物 - 猫科动物 - 美洲狮 - 豹
现在你想让你的黑豹拥有它所建造的5个类的所有方法。 因此,您必须操作5个导入和对象才能访问您要访问的所有方法。但是如果所有这些都相互扩展,你就可以直接访问这些方法。这是一个简单的例子,现在想象一个庞大的会计程序。
所以,我试图制作....我认为......当你大规模地观察它时,它是否更加普遍且更容易理解扩展类的有用性。
希望这对我有帮助或有意义。
答案 3 :(得分:0)
扩展一个类意味着你的类“继承”标准类的方法;换句话说,你正在上一个现有的课程,并在它上面建立你的课程。这就是Java管理所有对象的方式(即您创建的每个类实际上都扩展了默认的Object类)。另一方面,当您导入类时,您可以访问其所有功能,但是您无法像继承那样构建它。
答案 4 :(得分:0)
让我们从导入类开始。您import
一个类,以便在另一个类中使用它,如果该类在另一个包中。这只是一个快捷方式,当你看到一个名为X
的类使用时,我的意思是com.somepackage.X
。
扩展是一个类并将其用作新类的基础。这样做有很多理由(远远超出了答案的范围),但重要的是你继承了你正在扩展的类的行为,并可以选择是否覆盖该行为或添加其他行为。
有关要扩展的类的好例子,请查看java.util中的Collection API,您可以看到java.util.AbstractList被扩展为最终创建两种不同类型的列表,每种列表都有不同的特征 - {{3 }和java.util.ArrayList。
答案 5 :(得分:0)
让我们看一个例子。
我们有一个类,它为数据库提供更新函数并包含一个String变量。
public class DBupdate {
public String StrVar = "Hello";
...
public void doUpdate(String expression) {
try {
connect();
runExp(expression);
disconnect();
} catch ...
}
}
如果您导入它。您将执行类似
的操作log(new DBupdate.StrVar);
String myExp = "UPDATE ..."; // SQL
new DBupdate.doUpdate(myExp);
如果你延长。
log(StrVar);
String myExp = "UPDATE ..."; // SQL
doUpdate(myExp);
doUpdate()函数和StrVar成为新类的一部分。因此,所有函数和变量(公共的或受保护的)都是新类的一部分(继承)。
有用的导入(而不是扩展/继承)的示例是log4j。它正在像写入控制台和文件一样工作。但是你只想使用它的“日志”功能,而不是它用于工作的特殊功能。
有用继承的示例是java.lang.Thread。如果你的类成为一个线程,它可以被视为一个线程,如果你使用java.lang.Thread函数“start()”,它将被拆分为并行运行。 (覆盖run()方法来做一些事情...)
答案 6 :(得分:0)
在最简单的情况下,可以说,Import语句提高了可读性并减少了代码的长度。
在java中我们实现动态加载,语言import语句在导入语句时没有加载类文件,当我们起诉一个类时,只会加载相应的.calss文件。
Extends- 在Java中,当我们希望扩展类的有用性时,我们可以创建一个继承另一个类的属性和方法的新类。我们不需要原始源代码的副本(与许多其他语言一样)来扩展库的有用性。我们只需要一个编译的'.class'文件,我们可以从中创建一个新的增强。我找不到更好的解释方法,所以请参考此链接..(来源 - http://www.javacoffeebreak.com/java104/java104.html)