gpt4 book ai didi

java - 父类(super class) obj = new 子类();意义和选角

转载 作者:行者123 更新时间:2023-12-02 08:43:23 25 4
gpt4 key购买 nike

如果我有父类(super class)(动物)和子类(猫)。

第三点是什么意思?什么时候我们必须进行转换?

  1. Cat obj = new Cat(); 表示从 Cat 类创建对象

  2. Animal obj = new Animal(); 表示从 Animal 类创建对象

  3. 动物 obj = new Cat();

最佳答案

首先让我们了解类、引用和对象。假设我们有一个名为 SomeClass

的类
SomeClass ref = new SomeClass();

上面我们在堆中创建了一个 SomeClass 对象,并有一个引用变量引用它。我们将引用变量命名为ref。对象存在于堆中,我们可以使用引用来访问它。所以对象类型是实际的类(已应用 new 关键字)。引用变量类型可以是实际类或其父类。

现在让我们看看继承关系。从另一个类继承的类共享子父关系。子级继承其父级的行为,然后可以覆盖某些行为,还可以添加一些附加行为。因此,子对象可以在需要父对象的任何地方使用,因为子对象具有其父对象的所有行为,因此调用父对象中存在的任何行为都将由子对象处理。

父类不知道其子类的附加行为(子类是稍后编写的。)因此,Parent的对象不能在需要Child的对象的地方使用(如果Child的附加行为是在父对象上调用,那么它将不会被尊重)。

现在假设我们有类 ParentClassChildClass,这样 ChildClass 继承 ParentClass

ParentClass reference =  new ParentClass(); // Valid
ParentClass reference = new ChildClass(); //Valid
ChildClass reference = new ChildClass(); //Valid
ChildClass reference = new ParentClass();// Not Valid.

请注意 父类引用 = new ChildClass();//这里Object是ChildClass类型,Reference是ParentClass类型。

现在什么时候施放。任何需要 ParentClass 对象的地方,都不需要强制转换,两个对象(ParentClass 或 ChildClass)都可以。任何需要 ChildClass 类型的对象的地方,但如果我们有如下情况,则需要进行强制转换。

public void someMethod(ChildClass expected){
//some implementation
}
ParentClass ref = new ChildClass();
someMethod(ref);//Invalid : Compilation Issue
someMethod((ChildClass)ref);// Valid
ParentClass anotherRef = new ParentClass();
someMethod(anotherRef); // Invalid : Compilation Issue
someMethod((ChildClass)ref); //Invalid, compiles but Runtime it will fail.

经验法则: child 是 child , child 是 parent , parent 是 parent , parent 不是 child 。

另一个便于理解的例子。

public abstract class List{
public abstract void add(int element);
public abstract void remove(int element);
public int size();
}

public class Application{
private List listReference;
public void setList(List ref){
listReference = ref;
}
}

//Now you may create sub classes as below
public class ArrayList extends List{
// all the abstract methods of List have been implemented
}

public class LinkedList extends List{
//all the abstract methods of List have been implemented
}

现在在 main 方法中,您可以传递 ArrayList 或 LinkedList 或任何其他实现。

public class Init{
public static void main(String[] args){
Application app = new Application ();
app.setList(new LinkedList());
//or you can set it like this
List listRef = bew ArrayList();
app.setList(listRef);
//or you can set it like this
LinkedList linkedListRef = new LinkedLiet();
app.setList(linkedListRef);
}
}

请注意,方法 setList() 接受 List 类型的引用,我们可以提供 List 抽象的任何实现。这导致了灵活的设计。类应该依赖于抽象。 接口(interface)编程是一种设计原则,可以轻松维护应用程序代码。

关于java - 父类(super class) obj = new 子类();意义和选角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61240002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com