在学习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方法中创建该抽象类,不重写其中的任意方法,这样也能实例化一个抽象类,可以看到,调用抽象类中的方法能获取属性的值。