抽象类那点事

一、抽象类的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(" 我是静态方法 " );
    }
}

猜你喜欢

转载自blog.csdn.net/myhAini/article/details/112605195
今日推荐