精华内容
下载资源
问答
  • 疑问:因为知道抽象类是不能初始化的,那么super(name)调用父类构造器,会初始化父类实例吗?如果不初始化父类实例,那么也就是说调用构造器并不一定初始化实例了,那这里的super(name)又有什么用处呢? 对这些...
    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连在一块使用时,才是创建类的实例(对象)。

            抽象类中的构造方法是怎么回事?就是初始化属性的作用

        

    转载于:https://www.cnblogs.com/westward/p/5323111.html

    展开全文
  • 现在有一个抽象类 GenericWithCreate abstract class GenericWithCreate<T> { final T element; GenericWithCreate() { System.out.println("GenericWithCreate constructor"); element = c...

    现在有一个抽象类 GenericWithCreate

    abstract class GenericWithCreate<T> {
    
        final T element;
    
        GenericWithCreate() {
            System.out.println("GenericWithCreate constructor");
            element = create();
        }
    
        abstract T create();
    
    }
    

    继承该抽象类

    public class Creator extends GenericWithCreate<X> {
    
        public Creator() {
            System.out.println("Creator constructor");
        }
    
        @Override
        X create() {
            System.out.println("Creator create()");
            return new X();
        }
    
        void f() {
            System.out.println(element.getClass().getSimpleName());
        }
    
    }
    

    可见,在抽象基类中调用了抽象方法,那么这时候构造方法等执行流程是什么样呢?

    public class CreatorGeneric {
        public static void main(String[] args) {
            Creator c = new Creator();
            c.f();
        }
    }
    

    打印输出

    GenericWithCreate constructor
    Creator create()
    Creator constructor
    X
    

    可见,抽象基类构造方法调用后,会调用子类的抽象方法,然后再调用子类的构造方法。

    展开全文
  • Java中抽象类构造器的作用

    千次阅读 2016-04-28 15:25:03
    因为抽象类不可实例化,那么只能在子类实例化时调用该抽象类构造器才有用 看实例代码: abstract class Animal { Animal(){ System.out.println("抽象类Animal无参构造器"); //此处执行前会默认执行super() } ...

    因为抽象类不可实例化,那么只能在子类实例化时调用该抽象类的构造器才有用

    看实例代码:

    abstract class Animal {
    	Animal(){
    		System.out.println("抽象类Animal无参构造器"); //此处执行前会默认执行super()
    	}
    	
    	Animal(int a){
    		System.out.println("抽象类Animal有参构造器");
    	}
    }
    public class Horse extends Animal {
    	Horse () {
    		System.out.println("子类horse无参构造器"); //此处执行前会默认执行super()
    	}
    	
    	Horse (int h) {
    		super(3);
    		System.out.println("子类horse有参构造器");
    	}
    	
    	public static void main(String [] args) {
    		Horse h = new Horse();
    		System.out.println("---------------------");
    		Animal h2 = new Horse(6);
    //		Animal h3 = new Animal(); //无法编译,抽象类不可实例化
    	}
    }
    

    运行结果如下:

    抽象类Animal无参构造器
    子类horse无参构造器
    ---------------------
    抽象类Animal有参构造器
    子类horse有参构造器


    展开全文
  • 抽象类含有构造器吗?

    千次阅读 2016-04-24 11:41:01
    抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。示例代码如下: package ahu; abstract class Base{ int a=7; ...

    抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。示例代码如下:

    package ahu;
    
    abstract class Base{
        int a=7;
        public Base(){
        	a=8;
        }
        public Base(int i){
        	a=i;
        }
    }
    public class Demo01 extends Base {
    	public Demo01(){
    		super();
    	}
    	public Demo01(int i){
    		super(i);
    	}
    	public static void main(String[] args) {
    		Demo01 demo=new Demo01();
    	    System.out.println(demo.a);
    	    Demo01 demo1=new Demo01(9);
    	    System.out.println(demo1.a);
    	}
    }

    运行结果:  8     9

      

    展开全文
  • 存在构造器 即使你没有提供任何构造函数,编译器将为抽象类添加默认的无参数的构造函数,没有的话你的子类将无法编译,因为在任何构造函数中的第一条语句隐式调用super()。 扩展 有抽象方法的类一定是抽象类 ...
  • Java抽象类构造方法

    2019-09-24 03:48:56
    java中抽象类的子类的构造方法会隐含父类的无参构造方法。 package com.zempty.abstractclass; public class AbstractDemo01 { public static void main(String[] args) { B b = new B("哦"); } } ...
  • java中 抽象类构造方法的理解

    千次阅读 2016-08-03 12:20:54
    抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。 在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法 示例代码如下: 运行结果: 抽象类虽然不能自己实例化对象...
  • 构造器不就是为了初始化对象而存在的吗 既然抽象类不能被实例化 那为什么 还要按个构造器
  • 首先,抽象类可以有构造器、静态方法,抽象类不一定要被其他类继承,可直接不实例化就使用 抽象类可以有构造器、静态方法。构造器能被子类继承并完成初始化,但不会创建抽象类的实例对象。静态方法的好处是不实例...
  • java抽象类构造函数的含义

    万次阅读 2016-06-28 10:04:18
    抽象类虽然自身不可以实例化,但是其子类覆盖了所有的抽象方法后,是可以实例化的,所以抽象类构造函数,适用于给其子类对象进行初始化的       构造函数是对象的基本,没有构造函数就没有对象。 若果在...
  • 抽象类构造方法

    千次阅读 2019-12-11 15:49:33
    1、抽象类的说明 抽象类不能被实例化(也就是不能直接 new 抽象类()),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是...
  • 抽象类

    万次阅读 2019-04-16 13:20:35
    抽象类不能被实例化,即无法使用new来调用抽象类构造器创建抽象类实例。但是抽象类有构造器,主要是给其子类调用的 含有抽象方法的类必须定义成抽象类 注:抽象类比普通类多了一个抽象方法,但是却少了一个功能:...
  • 今天被问到抽象类要不要有构造函数的时候, 我随口一答应该是没有的, 我以为, 抽象类是不能直接用new来被实例化的, 所以也就不需要再去写构造函数了; 随后查了一下明白: 抽象类也需要构造函数, 在大多数情况中抽象类...
  • 如果你想写一个抽象类作为父类,其中有子类...如果你在父类中有一些逻辑要处理,那么你最好不要在构造器中引用抽象父类的自动注入属性,抽象类的实现类(子类)在构造时,必须调用父类的构造器,但是在子类创建完...
  • java抽象类构造方法吗?

    千次阅读 2020-05-27 21:50:09
    定义抽象类 格式 : abstract class 类名{} 举例 : 抽象类中的 方法 抽象方法 abstract void eat();...抽象类中,有构造方法,但是有不能new,那么构造方法干嘛的呢? 给子类用的!!! 抽象类,一样可以使用多态来创建子
  • 抽象类构造函数

    万次阅读 2010-10-19 15:31:00
    1、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,...
  • 编写一个Employee类,声明为抽象类, 包含如下三个属性:name,id,salary。 提供必要的构造器和抽象方法:work()。 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。 请使用继承的思想,设计...
  • java 抽象类构造函数的作用

    千次阅读 2020-04-17 12:33:42
    毋庸置疑抽象类中可以定义构造函数,但是这时会有一个疑问,既然抽象类的实例化毫无意义那为何又要定义其自己的构造函数呢? 首先,可以通过其内部的构造函数初始化其内部的变量。 其次,可以通过实现它的子类通过...
  • 抽象类与接口的构造方法

    千次阅读 2016-02-12 09:14:29
    首先抽象类是有构造方法的,我先前一直以为抽象类不能实例化所以是没有构造方法的,,显然这个想法是错误的,因为构造器跟对象没有关系。在此明白一点构造器并不是产生一个对象,而是对成员变量进行初始化。之前看过...
  • Java抽象类可以有构造函数吗

    万次阅读 多人点赞 2019-03-11 21:23:51
    因为你不可以创建抽象类的实例,所以构造函数只能通过构造函数链调用(Java中构造函数链指的是从其他构造函数调用一个构造函数),例如,当你创建具体的实现类。现在一些面试官问,如果你不能对抽象类实例化那么构造...
  • 1. 构造器知识点一:构造器从来都没有返回值,其中不能包含return语句(一般的成员方法要在方法名称前面加上void关键字,而构造器不用)知识点二:中的成员变量如果不对其进行初始化(即赋值),如果为int型的成员...
  • 所以既然抽象类是不允许被实例化的,那么他的构造方法存在是否还有实际意义? 直接上例子 //抽象父类 abstract public class Shape { public Shape(){ System.out.println("这是Shape的构造方法"); } p
  • 接口是我们常用的,抽象类好像并不是怎么常用,但这并不代表他不重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。       抽象类的出现使得...
  • java中抽象类构造函数使用

    千次阅读 2016-08-12 17:44:14
    如果在父类中(这里就是你的抽象类)中显示的写了有参数的构造函数,在子类继承是就必须写一个构造函数来调用父类的构造函数 例子: abstract class Person { //定义一个抽象类,必须被继承 Person(int i) { ...
  • 即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用...
  • 不能直接实例化,通过非抽象类继承后,才能实例化对象。 2.类中含有抽象方法,那这个类需要声明为抽象类。 3.抽象方法:只声明,不含方法体; 4.在子类中必须实现父类所有抽象方法。 父类构造方法初始化: 1....
  • 抽象类中可以有构造函数吗

    千次阅读 2017-06-11 16:48:25
    而派生类在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象类构造函数也是可以被调用的,所以抽象类中可以有构造函数。抽象类的析构函数最后是虚析构函数。 比如上面的程序在执行的时候就会执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 284,699
精华内容 113,879
关键字:

抽象类构造器