Java抽象类为什么能实例化?

在学习Java网络编程的时候,我们都写过如下代码:

Socket socket = new Socket("127.0.0.1",9000);
        OutputStream outputStream = socket.getOutputStream();

很显然OutputStream是一个抽象类,则=右边应该是OutputStream的一个子类。然而socket.getOutoutStream()返回类型也是OutputStream类型的。这一看似不符合语法要求的写法其实是没有问题的。

虽然正常情况下,抽象类不能进行实例化,但可以利用内部子类实例化,即 利用匿名内部类可以实现抽象类的,看如下代码:

声明一个抽象的AbstractFruit对象,在其里面声明一个方法,并且返回类型是AbstractFruit

public abstract class AbstractFruit{
    private String name;
    private int count;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public  void show(){
        System.out.println(getName()+" "+getCount());
    }

    public static AbstractFruit newInstance(){
        return new AbstractFruit() {};
    }

}

编写一个Main方法进行测试:

public class AbstractFruitTest {
    public static void main(String[] args) {
        AbstractFruit banana = AbstractFruit.newInstance();
        banana.setCount(10);
        banana.setName("banana");
        AbstractFruit apple = AbstractFruit.newInstance();
        apple.setCount(8);
        apple.setName("apple");
        banana.show();
        apple.show();
        AbstractFruit as = new AbstractFruit() {};
        as.show();
    }
}

运行结果如下图:

 总结,在这个例子中完全没有创建一个子类继承自AbstradtFruit二十通过AbstractFruit抽象类调自身的静态方法创建了一个匿名的抽象类,并为其中的属性赋值。除此之外,还可以直接在Main方法中创建该抽象类,不重写其中的任意方法,这样也能实例化一个抽象类,可以看到,调用抽象类中的方法能获取属性的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值