一、抽象类的new
抽象类其实是可以通过new关键字来创建的。但是…转折来了。new抽象类没问题,那这个抽象类要有构造函数,没有构造函数new个毛线啊。
话不多说,上才艺…
package com.test.abstractTest;
public abstract class TestA {
public TestA() {
System.out.println("true = " + true);
}
}
class TestB{
public static void main(String[] args) {
TestA testA = new TestA(){};//这个抽象类居然可以new
}
}
二、抽象类中的抽象方法如果没有abstract就有{}。在“初始化”后不用实现该方法,因为他不是抽象方法啊。也就是证明了,抽象类中可以有非抽象方法。
package com.test.abstractTest;
public abstract class TestA {
public TestA() {
System.out.println("true = " + true);
}
public void test(){
System.out.println(" 我是一条酸菜鱼 " );
}
}
class TestB{
public static void main(String[] args) {
TestA testA = new TestA(){};
testA.test();
}
}
三、在抽象类中有abstract 就没有{},因为有这个abstract就是一个抽象方法,你说你都是方法了,咋能没有方法体。你有了方法体是不是就要在子类中实现,要不他该不乐意了。
package com.test.abstractTest;
public abstract class TestA {
public TestA() {
System.out.println("true = " + true);
}
public void test(){
System.out.println(" 我是一条酸菜鱼 " );
}
public abstract void testMethod();
}
class TestB{
public static void main(String[] args) {
TestA testA = new TestA(){
@Override
public void testMethod() {
System.out.println("我是来自抽象类中的抽象方法的实现。。。" );
}
};
testA.test();
}
}
四、如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
package com.test.abstractTest;
public abstract class TestA {
public TestA() {
System.out.println("true = " + true);
}
public void test(){
System.out.println(" 我是一条酸菜鱼 " );
}
/**
* 只有我在子类B里面继承了
*/
public abstract void testMethod();
/**
* 好想哭,子类B里面没有把我继承
*/
public abstract void testNoImp();
}
/**
* 子类没有完全实现父类的静态方法,子类也只能是抽象类,并且没实现的方法也要在子类中留存下来
*/
abstract class TestB extends TestA{
@Override
public void testMethod() {
}
public abstract void testNoImp();
}
class TestC extends TestB{
@Override
public void testMethod() {
}
/**
* 我在这嘎代继承了哈
*/
@Override
public void testNoImp() {
}
}
五、抽象类中可以有静态变量,也可以有非静态变量,也可以有静态方法
package com.test.abstractTest;
public abstract class TestA {
private String a = "hello";
private static String b = "world";
public TestA() {
System.out.println("我是成员变量 a: " + a);
System.out.println("我是静态变量 b: " + b);
}
/**
* 抽象类中的静态方法就不能再加上 abstract
*/
public abstract static void test(); //❌
public static void testB() { //✅
System.out.println(" 我是静态方法 " );
}
}