java中抽象类不能实例化,但为什么有些方法却返回抽象类的实例?

比如抽象基类InputStream ,很多方法会返回InputStream的实例,如:
Socket类的getInputStream()方法:

public InputStream getInputStream() throws IOException
返回的就是InputStream的实例。
比如:
Socket s = new Socket("127.0.0.1",30000);
BufferInputStream bif = new BufferInputStream(s.getInputStream());

InputStream是无法new出实例的,那么这里返回的InputStream实例是怎么来的?

第1个回答  2014-05-06
那个是一个接口,你如果要用就这样写InputStream is = new FileInputStream();
声明对象,new 实现类. 他的返回值就是InputStream的对象,OnputStream也是一样的!希望可以帮到你!!追问

不是接口。InputStream is = new FileInputStream();是多态的应用,is只是引用,创建的仍然是FileInputStream类的实例。

第2个回答  2014-05-06
他返回的其实是socketInputStream 你可以看一下源码追问

是啊,API中找不到socketInputStream 这个东东,他是Socket的内部类吗?

追答

其实是SocksSocketImpl的getInputStream

protected synchronized InputStream getInputStream() throws IOException {
if (isClosedOrPending()) {
throw new IOException("Socket Closed");
}
if (shut_rd) {
throw new IOException("Socket input is shutdown");
}
if (socketInputStream == null) {
socketInputStream = new SocketInputStream(this);
}
return socketInputStream;
}

追问

我看了源码,Socket中返回的是SocketImpl的getInputStream方法,而SocketImpl中此方法是抽象方法,是空的?
另外SocksSocketImpl类中没有getInputStream方法啊?

本回答被提问者采纳

Java 抽象类能不能实例化
结论是:Java中的抽象类不能被实例化。让我们进一步探讨这个概念。抽象类是Java中一种特殊的类,它使用abstract关键字标记,其主要目的是为了定义类的公共接口,而不是创建具体的对象。抽象类可以包含成员变量、成员方法和构造方法,但不能直接通过new关键字实例化,因为它们通常不提供完整实现,而是留给子类...

java 抽象类不能直接进行实例化的操作,但可以声明对象
对于abstract类,我们不能使用new运算符创建该类的对象。如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不允许final,abstract同时修饰一个类或方法的原因。abstract类的对象作上转型对象 可以使用abstract类来声明对象,该对象可以作为器子类对象的上转型对象...

java语言中的抽象类如何实例化?
抽象类在Java中是无法直接实例化的,因为抽象类中至少包含一个抽象方法,该方法未实现任何具体的代码逻辑。直接实例化抽象类会导致编译错误。要使用抽象类,需要首先创建一个类继承抽象类,然后实例化这个继承类的对象。继承抽象类意味着你必须实现所有抽象方法。通过继承抽象类并创建实例,你可以充分利用抽象...

抽象类可以被实例化吗
抽象类是不能被实例化的。实例化实际就是在内存中开辟一块空间用于存储新的产物,即对象。在抽象类中,子类实例化会先初始化父类,但父类初始化并不是创建一个父类对象,而是把父类中定义的对象相关属性都初始化,因为这些属性子类对象也是拥有的。所以,为了保证子类对象的完整性,要从最底层的父类...

抽象类为什么不能实例化?
抽象类为什么不能实例化对象:因为抽象类中包含有没有定义的函数,因此不能用抽象类来实例化对象。但可以声明抽象类的指针指向派生类。示例:class A{public: virtual void f()=0;}; \/\/声明一个抽象类 class B:public A{public: void f(){cout<<"B"<<endl;};void main(){A ma; \/\/错误...

什么样的抽象类不能产生类的实例(怎么定义抽象类)?
抽象类是一种不能被实例化的类,在Java中,抽象类用abstract关键字来修饰。下面是定义抽象类的基本规则:抽象类必须用abstract关键字来声明。抽象类可以包含普通方法和抽象方法,普通方法具有实现代码,但是抽象方法没有。如果一个类继承了抽象类,则必须实现该抽象类中所有的抽象方法。否则,这个类也必须声明...

“java抽象类”不能被实例化是什么意思?
\\x0d\\x0a\\x0d\\x0a抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。\\x0d\\x0a1、抽象类可以不包括抽象方法,它反正不会去实例化,抽象类不能被实例化,也就是不能用new关键字去产生对象,抽象方法只需声明,而不需实现,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则...

抽象类为什么不能被实例化?
抽象类无法实例化,是因为没有完整的方法实现,无法生成一个具体对象。这如同你可以实例化一个苹果,但不能实例化一个水果,因为水果是抽象概念,而苹果是具体实例。内存管理方面,对象实例化涉及向JVM申请内存空间。抽象类由于没有具体的成员变量和方法,无法准确分配内存,这成为实例化障碍。抽象类主要用于...

java抽象类
抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。1、抽象类可以不包括抽象方法,它反正不会去实例化,里面的方法是不是抽象的没有本质影响。2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它...

抽象类和接口的相同点与不同点
2、实现 制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。3、构造器 抽象类可以有构造器,接口不能有构造器。4、与正常Java类的区别 除了不能实例化抽象类之外,和普通Java类...

相似回答