java中抽象类可以实例化_关于实例化:实例化Java抽象类?

本问题已经有最佳答案,请猛点这里访问。

比较新的Java程序员和我已经被教导过,你不能创建一个抽象类的实例。我还做了一些研究,我了解到在大多数情况下,当一个抽象类被创建时,它实际上是一个匿名的子类。但我遇到的问题是:

Java的EDCOX1×0类有一个方法EDCOX1,1,它返回一个EDCOX1,2,}。EDCOX1 2是一个抽象类,Java文档还列出了它的所有子类抽象。所以我真的迷路了。退回什么?

如你所说,是URLConnection的一个子类。

返回的URLConnection的具体类别可能标记为private。

还可以查看stackoverflow.com/questions/2793150/…。

这里将应用多态概念。类的类型将是URLConction,您将返回其子类的实例

只是为了这个例子:System.out.println(theConnection.getClass());会给你答案(当然,没有任何解释为什么是这个答案,当然…)

文档中没有匿名类,这可能有助于清理问题。(尽管我认为这个特定的示例实际上返回了一个未记录的实现。有关Sun中未记录类的更多信息,请参阅此问题。)

返回的是API文档中找不到的非抽象子类,例如sun.net.www.protocol.http.HttpUrlConnection。如果在浏览器中的小程序中运行相同的代码,可能会得到不同的代码,通常是包装浏览器的本机连接的代码。

所以这里没有技巧也没有魔力,只是一些类不会出现在API文档中,因为它们被认为是实现内部的,并且会发生变化。

有许多类似的例子,DocumentBuilderFactory或TransformerFactory都是抽象的,但它们的newInstance()方法将返回一个子类,通常是单独包装的(例如saxon)。

但对于同一个问题也有不同的解决方案:JDBC用静态方法定义了Driver接口(而不是抽象类)和DriverManager实用程序类来加载不同的驱动程序实现。数据库驱动程序供应商不需要扩展抽象类,而是需要实现Driver接口。

顺便说一下,要找到对象的实际运行时类,只需调用它们的getClass()。

另一个问题的这个答案进一步解释了为什么这些类不在文档中。

openConnection返回一些具体类,扩展URLConnection。方法的签名被定义为返回URLConnection,因为使用它的代码不应该依赖于任何特定的实现。

这个答案中的所有内容都是正确的,但我认为它并不能回答关于实际返回内容的问题。

这里将应用多态性概念。

对象的类型将是URLConnection(父类接口),对象将是其子类(扩展或实现(如果是接口))。

下面的例子可能会让您明白这一点。

abstract class URLConnection {

// some methods.

}

假设你有自己的班级。

class ConnectionClass extends URLConnection {

// some methods

}

class Main {

URLConnection connect = null

public URLConnection getUrl() {

return connect = new ConnectionClass();

}

}

您将返回类的对象,该对象提供了URLConnection类的openConnection()的实现。同样的概念也适用于接口案例。

可能是匿名类

比如说你有一个abstract class…

abstract class Vehicle {

abstract public void move();

}

不用制作一个class Car extends Vehicle或class Boat extends Vehicle,你可以用匿名类的魔力做到这一点。(这可能就是为什么JavaDoc没有说存在子类的原因,因为它是匿名的,因此不能被JavaDoc表示的公共API引用。)

class Example {

public Vehicle foo() {

Vehicle car = new Vehicle {

@Override

public void move() {

// do some car movement, i.e. driving

}

}

return car;

}

public Vehicle bar() {

Vehicle boat = new Vehicle {

@Override

public void move() {

// do some boat movement, i.e. boating

}

}

return boat;

}

}

所以不,你不能实例化一个abstract class…但这并不是全部的事实,您可以作为一个匿名类来实现,并在现场实现这些方法。不过,从技术上讲,这并不是在实例化一个abstract class,但当你看到这类事情时,你会做很多事情。可能是私人内部阶级

再说一次,假设你有一个abstract class…

abstract class Vehicle {

abstract public void move();

}

如果内部class是private,那么只有封装它的类才能实例化它。(这可能就是为什么JavaDoc没有说存在子类的原因,因为它是私有的,因此对JavaDoc表示的公共API是隐藏的。)

class Example {

private class Car extends Vehicle {

@Override

public void move() {

// do some car movement, i.e. driving

}

}

private class Boat extends Vehicle {

@Override

public void move() {

// do some boat movement, i.e. boating

}

}

public Vehicle foo() {

return new Car();

}

public Vehicle bar() {

return new Boat();

}

}

这并不能解释任何关于实例化abstract classes的问题,但它可能有助于回答URL、openConnection和URLConnection。

它是一个扩展URLConnection的类,正在返回。这是一种隐藏实现细节的方法,因为可以根据输入参数返回URLConnection的不同实现。

当所有子类都是抽象的,那么这是因为只能通过在工厂中创建类来使用类。如果您仔细检查使用java.net.urlconnection来触发和处理HTTP请求中的代码,您将看到URLConnection对象从未被实例化。相反,我们是这样称呼openConnection的:

URLConnection connection = new URL(url +"?" + query).openConnection();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值