Java 理解扩展类和导入类之间的区别
我见过几个线程将扩展类定义为个性化类继承其扩展到的类的方法的一种方式。当你导入一个类并创建该类的一个实例时,你可以访问它的方法,有人能给我解释一下,扩展一个类以向你自己的类提供这些方法实际上是如何不同的,换句话说,我看到的唯一区别是,当你导入时,你创建了一个标准化类的实例,当您扩展时,您可以有效地将您的个性化类转换为仅具有不同名称的标准化类。我知道我错了,但我读到的答案并没有帮助我从根本上理解差异。扩展类意味着您的类“继承”了标准类的方法;换句话说,您正在使用一个现有的类并在其上构建您的类。这就是Java管理所有对象的方式(即,您创建的每个类实际上都扩展了默认对象类)。另一方面,当您导入一个类时,您可以访问它的所有功能,但是您不能像继承那样在它上面构建 让我们从导入类开始。如果一个类位于另一个包中,则导入该类以在另一个类中使用它。这实际上只是一个快捷方式,当你看到一个名为Java 理解扩展类和导入类之间的区别,java,inheritance,import,extend,difference,Java,Inheritance,Import,Extend,Difference,我见过几个线程将扩展类定义为个性化类继承其扩展到的类的方法的一种方式。当你导入一个类并创建该类的一个实例时,你可以访问它的方法,有人能给我解释一下,扩展一个类以向你自己的类提供这些方法实际上是如何不同的,换句话说,我看到的唯一区别是,当你导入时,你创建了一个标准化类的实例,当您扩展时,您可以有效地将您的个性化类转换为仅具有不同名称的标准化类。我知道我错了,但我读到的答案并没有帮助我从根本上理解差异。扩展类意味着您的类“继承”了标准类的方法;换句话说,您正在使用一个现有的类并在其上构建您的类。这就
X
的类被使用时,我真正的意思是如果com.somepackage.X
扩展就是获取一个类并将其用作新类的基础。这样做还有很多原因(远远超出了这里的回答范围),但重要的是,您继承了要扩展的类的行为,并且可以选择是否重写该行为或添加其他行为
要获得扩展类的良好示例,请查看中的集合API,您可以在其中看到它被扩展以最终创建两种不同类型的列表,每种类型都具有不同的特征-和。来创建一个简单的示例(但不好:/)。假设您有一个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);
}
我认为在小范围内,您的推理工作正常,但是扩展的想法是您的类继承了扩展类的所有方法 但是,如果您从一个简单的想法或程序开始,并希望对其进行大规模扩展,那么实例化所需的所有类的使用将变得更加耗时。即使是一个简单的想法,进口的增长也会爆炸式增长 例如: 动物-温血动物-两足动物-人类 动物-温血动物-四足动物-猫-美洲狮-黑豹 现在你想让你的黑豹拥有它构建的5个类的所有方法。 因此,您必须操作5个导入和对象才能访问所有要访问的方法。但是,如果所有这些都是相互扩展的,那么您就可以直接访问这些方法。这是一个简单的例子想象一个巨大的会计程序 所以我想说的是,当你从大规模的角度来看时,它更普遍,也更容易理解扩展类的有用性
希望这对我有帮助或有意义。让我们看一个例子 我们有一个类,它为数据库提供了一个更新函数,并包含一个字符串变量
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。它所做的工作类似于写入控制台和文件。但您只想使用它的“log”函数,而不想使用它用于工作的特殊函数
有用继承的示例是java.lang.Thread。如果您使用java.lang.thread函数“start()”,则如果您的类成为一个线程,它可以被视为一个线程,并将被拆分以并行运行。(重写run()方法来执行某些操作…导入和扩展是两件截然不同的事情 进口 类以包的形式组织,包提供了避免名称冲突的命名空间功能。导入允许您在代码中使用该类,而不需要名称空间信息 导入是可选的。如果始终使用类的完全限定名,则不必导入任何内容,但这会使代码难以阅读 例如,如果要创建日历对象列表,可以导入
java.util.list
、java.util.ArrayList
和java.util.Calendar
并使用:
List<Calendar> array = new ArrayList<>();
您可以将总线
作为参数传递,因为总线
是车辆
parkingLot.park(new Bus());
在总线中调用drive()
、turn()
和stop()
方法。这就是多态性
尽管继承方法,但继承并不是重用代码的最佳方式。大多数时候,当您需要重用代码时,您可以通过使用组合来实现(使您的类具有对另一个类的引用,而不是作为一个类)。Car
不应该扩展Motor
,因为Car不是一个电机,但它可以有一个电机,并在调用Car的drive()
方法时,将调用委托给电机的turnOn()
方法
在Java中,您也可以使用接口实现多态性而无需继承。在最简单的情况下,可以说
List<java.awt.List> array; // you have to import java.util.List, but can't also import java.awt.List
public park(Vehicle v) {
v.drive();
v.turn(Direction.LEFT);
v.stop();
}
parkingLot.park(new Bus());