1.抽象类能够初始化吗?答案是:肯定的,抽象类可以初始化!

2.但是抽象类不能够直接new 初始化,你不信看下图:


3.所以我们初始化抽象类,是间接的!接来下介绍两种间接的初始化抽象类方法

    3.1.多态方式




   3.2.静态方法

至于多态,我不多说什么了,但是第二种方法

package test;

abstract class singletonInstance{
    
    static int i=1;
    public static  singletonInstance getinstance() {
        System.out.println("在静态的getinstance()方法下,抽象类也可以初始化");
        System.out.println(i++);
        return null;
    }
}


public class two {
    public static void main(String[] args) {
        singletonInstance si=singletonInstance.getinstance();
        singletonInstance si1=singletonInstance.getinstance();
    }
}   
它是通过了静态成员方法以达到在其他类中通过该类轻而易举地调用该方法-------->因为静态成员方法是在方法区,该区被所有的线程所共享(方法区存放的是类的模板即静态绑定,参考csdn讨论区http://bbs.csdn.net/topics/370001490),

所以利用静态方法,可以调用到抽象中具体的静态方法以达成初始化抽象类的目的,但是通过此方法却不能完全初始化抽象类,仅仅初始化它的静态方法(因为静态成员变量是单独存放在方法区的,若要调用也是该局部被调用而并不是该类的整体),但是也达成初始化的目的了.

所以,我认为静态方法下的实例化抽象类是一种局部的初始化!


一句话:抽象类可以初始化,但是不能直接初始化(即new),要么通过多态,要么通过静态的内存来指向一块区域让你去调用抽象类的某个方法(即局部初始化)


补充:今天做aop的时候发现ac方法初始化容器时,若是主类实现接口,那么必须在ac方法中表名接口

         即这种: ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
                        person p=(person) ac.getBean("ch");

                       突然发现红色涂鸦部分不就是多态吗?

                      然后自己有了个疑惑----------->接口不是不能实例化吗?这种不就是我这篇文章所说的使用多态间接初始化吗?但是接口能实现多态吗?

                    接下去自己动手做了个实验,发现接口真的能够实现多态!!!!!!!!

     




对于上述实验结果,我得出两条结论:

                           1.接口可以实现多态也不足为其,毕竟接口为子类提供了一个模板,这时候子类内容返回给模板也应该是可以的,所以接口可以实现多态!!

                            2.但是我们就可以说因为接口能够实现多态所以接口能间接地进行实例化吗?答案是不能的,因为接口的多态不算是实例化,根本原因在于接口是一个没有构造函数的模板,这和抽象类有着根本的区别,而一个实例最基本的元素就是构造函数!!     
综上述:即使接口能够实现多态但是也不能够称之为接口可以实例化!!!!!!!!



Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐