java之子类继承抽象类,子类构造器调用抽象类构造器问题
package com.wtd;
public abstract class Car {
    private String name= "car";
    public Car(String name) {
        this.name = name;
    }
}
public class JeepCar extends Car {
    public JeepCar(String name){
        super(name);
    }
}
现在我要创建JeepCar的实例,JeepCar jC= new JeepCar();那么我在debug的过程中,看到jvm运行的时候,先调用抽象父类的构造器Car(){},将属性初始化,然后回到JeepCar(){}子类构造器。
疑问:因为知道抽象类是不能初始化的,那么super(name)调用父类构造器,会初始化父类实例吗?如果不初始化父类实例,那么也就是说调用构造器并不一定初始化实例了,那这里的super(name)又有什么用处呢?
对这些疑问,自己很迷惑,所以只有求助于网络了。从网上找了些感觉比较靠谱的解释。
解释1:
  调用子类构造方法都会调用它的直接父类的构造方法。可以认为new才会返回一个实例的引用,而抽象类是不能new的(这个是规定,没理由)。
调用子类构造方法是调用了它的抽象父类的构造方法,但构造方法是用来做初始化工作的,它并不会返回实例。
解释2:
抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以你可以在子类产生对象 时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。而生成实 例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个 实例调用的,就像一个普通的实例方法一样。
解释3:
  抽象类不能被实例化是说Person p=new Person();这样是错误的;但是Person p=new Employee(); 是可以的,创建子类的实例,父类的引用指向它
在上述主程序中,new Employee后,它会初始化对象,初始化顺序为:
父类静态块初始化---->子类静态块初始化---->父类非静态块初始化---->父类构造方法---->子类非静态块初始化---->子类构造方法。(先静后动,先父后子) 
这个主程序会先初始化person类的非静态属性和构造函数再初始化employees类的非静态属性和构造函数
这就是你第一个问题的当子类的父类为抽象类时,构造方法如何追溯?而抽象类作为父类也会创建实例么?没有创建实例只是构造函数在对抽象类Person的属性初始化,对于一个类的声明,赋值 和使用两件事情,前者不需要实例化,后者必须实例化 。
自己的简单总结:类的构造器,不论抽象还是非抽象,作用都一样,就是初始化属性的;
只有构造器和new连在一块使用时,才是创建类的实例(对象)。
抽象类中的构造方法是怎么回事?就是初始化属性的作用。
java之子类继承抽象类,子类构造器调用抽象类构造器问题的更多相关文章
- 在C++中子类继承和调用父类的构造函数方法
		
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...
 - java类的继承,多态,抽象类与接口
		
知识点梳理: 1,怎样定义自己的类. MyStarFrame,MyStarPanel 类中定义: (1)属性(数据),变量. (2)方法(函数),行为. (3)构造方法(特征,作用,何时被调用 ...
 - java类的继承
		
继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(重写)的方式,产生一个新的类型.继承是面向对 象的三个基本特征--封装.继承.多态的其中之一,我们在使用java时编写的每一个类都是 ...
 - JAVA中的继承和覆盖
		
java里面的继承是子类继承父类的一些方法和属性(除private属性和方法之外):对于父类的私有属性和方法子类是没有继承的.可是要想子类也能訪问到父类的私有属性,必须给私有属性以外界訪问的方法接口. ...
 - java之父类中的构造器是否能被子类继承?
		
子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器.子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器.如果父 ...
 - Java 构造器 一道构造器调用子类重载方法的题目
		
构造器中不能new本类对象,否则进入死循环. 构造器没有返回值,也没有void修饰. 使用关键字super可以调用父类的构造器,而且这一句必须放在第一句的位置,否则无法编译. 题目: 请写出以下程序的 ...
 - java学习之路--继承(子类构造器)
		
子类的构造器不能访问父类的私有域,所以必须用的父类的构造器来对这部分的私有域进行初始化,我们可以通过super实现对父类的构造器的调用,使用super调用父类构造器的语句,必须放在子类构造器的第一句. ...
 - java基础:父类与子类之间变量和方法的调用
		
1)父类构造函数 java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码 块总是会被执行,接着调用父类的一个或者多个构造器执行初 ...
 - java中子类继承父类程序执行顺序问题
		
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
 
随机推荐
- python基础之练习题(二)
			
九九乘法表 i = 0 #while 九九乘法表 j = 0 while i < 9: i += 1 while j<9: j += 1 sum = i + j total="% ...
 - Python并行编程(十二):进程同步
			
1.基本概念 多个进程可以协同工作来完成一项任务,通常需要共享数据.所以在多进程之间保持数据的一致性就很重要,需要共享数据协同的进程必须以适当的策略来读写数据.同步原语和线程的库类似. - Lock: ...
 - 初识MVCSharp
			
MVCSharp其实是MVP模式 主要内容 ITask IView IController
 - CentOS7.0安装Nginx 1.10.0
			
首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib-devel ...
 - 解决maven的依赖总是无法下载完成
			
有时候在eclipse里面刚刚导进一个maven项目,但是总是无法完整下载pom文件里面的依赖 主要有两个原因: 1,需要下载的依赖(jar包)需要开发人员给权限(远程仓库的下载权限),这个可以找开发 ...
 - 26种基于PHP的开源博客系统
			
26种基于PHP的开源博客系统 来源:本站原创 PHP学习笔记 以下列举的PHP开源Blog系统中,除了我们熟知的WordPress之外,大多都没有使用过,其中一些已经被淘汰,或者有人还在使用.除了做 ...
 - Learning to Rank之RankNet算法简介
			
排序一直是信息检索的核心问题之一, Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Learning to Rank ...
 - 一个简单清晰的Redis操作类-php
			
<?php /** * redis处理的二次封装 * */ class Redis{ private $_redis; private $_config; public function __c ...
 - bzoj1621 / P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm
			
P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 基础dfs,按题意递归即可. #include<iostream> #include< ...
 - Eclipse配置tomcat8.5.7报错:The Apache Tomcat installation at this directory is version 8.5.27. A Tomcat 8.0 installation is...
			
Eclipse配置tomcat8.5.7报错:The Apache Tomcat installation at this directory is version 8.5.27. A Tomcat ...