gpt4 book ai didi

Java:从抽象类和接口(interface)创建引用类型

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:53 26 4
gpt4 key购买 nike

我是 Java 的新手,我已经阅读线程 (here),无法实例化抽象类。所以,我测试了一下。

我做的第一个测试如下所示。看起来我实际上可以实例化一个抽象类,事实上,我实际上有一个新的 type 引用抽象类,并且该类型实际上由扩展它的所有子类共享。这也意味着多态性适用。

import java.util.*;

abstract class AbstractClass{
public abstract void printname();
}


class Test1 extends AbstractClass{

private String name;

public Test1(String name){
this.name = name;
}

public void printname(){
System.out.println("My name is " + name);
}
}

class Test2 extends AbstractClass{
private String saysomething;

public Test2(String saysomething){
this.saysomething = saysomething;
}

public void printname(){
System.out.println(saysomething);
}
}

class TestingApp{
public static void main(String[] args){
AbstractClass[] abstractclass_list = {new Test1("JEFFFFFF") , new Test2("Hey , say something")};
for(AbstractClass item : abstractclass_list){
item.printname();
}
}
}

然后我做了另一个测试,但这次,我决定创建一个引用接口(interface)的类型,而不是处理抽象类。好像我也可以实例化一个接口(interface)。我实际上可以创建一个引用接口(interface)的类型。此类型由所有实现此接口(interface)的类共享。多态性再次适用。

import java.util.*;

interface AbstractInterface{
public void printname();
}


class Test4 implements AbstractInterface{

private String name;

public Test4(String name){
this.name = name;
}

public void printname(){
System.out.println("My name is " + name);
}
}

class Test3 implements AbstractInterface{
private String saysomething;

public Test3(String saysomething){
this.saysomething = saysomething;
}

public void printname(){
System.out.println(saysomething);
}
}

class TestingAbstractInterfaceApp{
public static void main(String[] args){
AbstractInterface[] abstract_list = {new Test4("Helen") , new Test3("Hey , say my name")};
for(AbstractInterface item : abstract_list){
item.printname();
}
}
}

问题:

我感觉到我在我的代码中所做的事情有问题。但是我不能完全解释为什么代码在理论上仍然有效,不可能实例化抽象类和接口(interface)。我实际上是在上面显示的示例中实例化抽象类和接口(interface)吗?因为这似乎正是我所做的,因为我有一个新的抽象类和接口(interface)类型。请纠正我,如果我的逻辑是错误的或者我使用了错误的话。

更新:所以我想我的误解是关于类型。我一直认为类型只能指代普通的Java类而不能指代抽象类和接口(interface)。 “类型”实际上是如何工作的?它正在创建引用吗?

最佳答案

为什么你认为你实际上是在实例化 AbstractClassAbstractInterface

new Test1("JEFFFFFF") , new Test2("Hey , say something"), new Test4("Helen") , new Test3("Hey , say my name") 都是实例化具体类,而不是抽象类。

如果您将 AbstractClass[] abstractclass_list = 作为实例化抽象类的证明,那是错误的。在这里,您声明了一个数组,其元素类型为 AbstractClassTest1Test2 是(因为它们extend AbstractClass).

更新

你可以有这样的东西 AbstractClass abs = new Test1("hey"); 它所做的是创建类 Test1 的新实例,并引用该实例来自变量 absabs的具体类型是Test1,但只有在AbstractClass中声明的方法在它上面可见。如果你想调用 Test1 的方法,你必须先转换它。

AbstractClass abs = new Test1("hey");
abs.printname(); // this is ok, and it calls `printname() implemented in Test1
abs.someTest1Method(); // this is NOT ok, someTest1Method() is not visible to abs
((Test1)abs).someTest1Method(); // this is ok, abs is cast to Test1, but would fail if abs was instantiated as 'abs = new Test2("t2")' (would throw ClassCastException)

关于Java:从抽象类和接口(interface)创建引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294442/

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