java构造函数能否被继承?
不能,因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。继承(extends)的含义其实是“扩展”,子类完全没必要扩展父类的构造函数,因为反正每次调子类的时候都会“自动运行”它父类的构造函数,如果真的需要子类构造函数特殊的形式,子类直接修改或重载自己的构造函数就好了。估计是你对“构造函数”的意义本身不理解,“调用”一个类有“继承”和“组合(说白了new 一个类)”两种方式,当你“调用”一个类的时候就会“自动运行”它的“构造函数”。
java声明为static的方法不能被重载?
static方法,是属于这个类的,不是属于对象的。没有继承不继承的说法。覆盖和重写也是说的对象的方法而不是static方法。你问的这个第二个问题叫“隐藏”“方法被声明为是static的,而静态方法是不能被覆写的;它们只能被隐藏。为了避免这样的混乱,千万不要隐藏静态方法。即便在子类中重用了超类中的静态方法的名称,也不会给你带来任何新的东西,但是却会丧失很多东西。” (——《java解惑》)
什么是多态?java中如何实现多态?
多态分为编译时多态和运行时多态。
1.编译时多态,其实就是方法重载,相同函数名,但签名不相同。值得注意的是签名不包括方法返回值,换句话说,两个方法,函数名和入参都相同,但返回值不同,编译器回报错的。
2.运行时多态,其实就和继承和接口实现相关了,子类可以覆盖父类的非final,非static,非private方法或者实现接口方法。运行时,动态绑定实例到父类或接口的引用,那jvm是怎么知道调用哪个子类的实例的对应方法的呢?这就是你问的问题了——Java中对象在jvm内部都有描述元数据,对象头,对象头中存储了当前实例的类型信息,调用时jvm就根据这个type能精确找到具体是点用哪个子类的方法了。
main方法可以被重载和重写吗?
可以重载,但是JVM将始终调用原始的main方法,而永远不会调用重载的main方法。
但不能重写,因为main方法是静态的,而static方法在java中不能被覆盖。
JAVA中的构造方法只能调用一次,为什么this();又可以调用另一个构造方法?
这是一个比较好的问题,在学习Java的过程中,通过对各种调用方式进行发问,从而能越来越深入的了解Java的运行机制。
要想解释为什么this()可以再次调用构造方法,我们首先需要看一下这种调用是如何产生的,要产生this()调用构造方法,需要先完成一个构造方法的重载,看一个例子:
通过这个例子,我们可以看到this()完成了对构造方法的多次调用,最终的结果是三个构造方法都执行了。
这里面有一点是需要被重点关注的,那就是this()调用一定是位于构造方法中的第一条可执行语句的位置,这是一个硬性规定。为什么有这个规定呢?下面我们沿着这个思路来探究一下,这些构造器在执行过程中都经历了哪些过程。
首先当调用CTest(int a)这个构造方法时,由于其中的this(a,b)调用从而开始调用CTest(int a,int b),同样由于this(a,b,0)从而调用第一个构造方法,也就是CTest(int a,int b,int c),这是一个非常好理解的流程。但是这个流程中有一个明显的问题,就是构造器被调用了3次,那么是不是会产生三个不同的对象呢?看一个例子:
通过这个例子,我们发现,虽然调用了3次构造器,但是只创建出了一个对象。Java的学习过程中一定要搞清楚一件事情,那就是构造方法的作用是初始化对象,而不是创建对象,创建对象的动作是new完成的!可以简单的说(不太严谨),调用了几次new就创建了几个对象,和调用多少次构造器没有必然的联系。
在Java语言中,能完成对构造方法调用的,除了this还有super,其实我们在构造对象的时候,构造方法中往往都会有一个super调用,它的作用是调用父类构造器,那么是不是super调用会导致再创建出一个父类对象呢?当然不是!看一个例子:
通过这个例子,更能说明构造器的作用是初始化。在调用期间涉及到静态绑定和动态绑定,动态绑定发生在创建父类属性期间,而子类在调用父类方法时是静态绑定。
我的主要研究方向是大数据和人工智能,也出版过Java书籍,目前我在头条会陆续写一些关于软件编程、大数据、人工智能等方面的文章,感兴趣的朋友可以关注我的头条号,相信一定会有所收获。
如果有编程方面的问题,也可以咨询我。
谢谢!

