精华内容
下载资源
问答
  • 构造方法不能直接调用构造方法,需要使用关键字this

    构造方法不能直接调用构造方法,需要使用关键字this

    展开全文
  • 如何调用构造方法

    千次阅读 2019-05-09 18:48:21
    调用构造方法通过constructor-arg标签设置构造方法参数的值1. 参数类型为基本数据类型或String类型2.参数类型为引用数据类型3.参数类型为数组类型4.List集合5.Set集合6.Map集合 一.自动创建对象 ①创建一个web工程...

    一.自动创建对象


    ①创建一个web工程,拷入以下五个jar包
    在这里插入图片描述
    ②为了规范代码使逻辑清晰按以下方式创建两个Class类以及一个Spring文件
    在这里插入图片描述
    ③在命名为Test的Class文件中输入以下代码,当第一行代码执行时,创建了一个容器
    调用第二行代码的时候将Student对象从容器中拿出来使用

    package com.jd.test;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.jd.vo.Student;
    
    public class Test {
    
    	public static void main(String[] args) {
    		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
    		Student student  = applicationContext.getBean(Student.class);
    		System.out.println(student);
    	}
    }
    

    ④由于并未设置懒加载,当③中容器创建的时候自动创建了一个Student对象

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<bean class="com.jd.vo.Student"></bean>
    </beans>
    

    ⑤在Test文件中运行,得下图(创建对象后会默认调用该Student类的无参构造方法,如果此时在Student类中定义了一个有参构造方法并且没有指定调用该有参构造方法则运行时会出错)
    在这里插入图片描述

    二.调用构造方法


    通过constructor-arg标签设置构造方法参数的值

    1. 参数类型为基本数据类型或String类型

    == 直接使用value标签属性赋值==
    ①Student类中

    public Student(String name,String age) {
    		System.out.println(name+":"+age);
    }
    

    ②application.xml中(constructor-arg标签的数和值对于调用构造方法的参数列表,若不对应则出错)

    <bean class="com.jd.vo.Student">
    		<constructor-arg name="name" value="Tom"></constructor-arg>
    		<constructor-arg name="age" value="12"></constructor-arg>
    </bean>
    

    2.参数类型为引用数据类型

    直接使用ref属性指定对象
    ①Student中

    public Student(Date day) {
    		System.out.println(day);
    }
    

    ②application.xml中

    <bean id="date" class="java.util.Date"/>
    <bean class="com.jd.vo.Student">
    	<constructor-arg name="day" ref="date"></constructor-arg>
    </bean>
    

    3.参数类型为数组类型

    使用array子标签设置数组,通过array子标签的value子标签设置数组每个元素的值
    ①Student中

    public Student(int [] scores) {
    	for (int score : scores) {
    		System.out.println(score);
    	}
    }
    

    ②application.xml中

    <bean class="com.jd.vo.Student">
    	<constructor-arg name="scores">
    		<array>
    			<value>1</value>
    			<value>2</value>
    		</array>
    	</constructor-arg>
    </bean>
    

    4.List集合

    使用list标签赋值,通过list子标签的value子标签设置数组每个元素的值
    ①Student中

    public Student(List<String> names) {
    	for (String name : names) {
    		System.out.println(names);
    	}
    }
    

    ②application.xml中

    <bean class="com.jd.vo.Student">
    	<constructor-arg name="scores">
    		<array>
    			<value>1</value>
    			<value>2</value>
    		</array>
    	</constructor-arg>
    </bean>
    

    5.Set集合

    使用set标签赋值,通过set子标签的value子标签设置数组每个元素的值
    ①Student中

    public Student(Set<String> ids) {
    	for (String id : ids) {
    		System.out.println(id);
    	}
    }
    

    ②application.xml中

    <bean class="com.jd.vo.Student">
    	<constructor-arg name="ids">
    		<set>
    			<value>451564651</value>
    			<value>845151548</value>
    		</set>
    	</constructor-arg>
    </bean>
    

    如果数组、List、Set集合存储的是基本数据类型或String类型,则使用value,否则使用bean子标签或者ref子标签
    ①Student中

    public Student(List<Date> birthdays) {
    	for (Date birthday : birthdays) {
    		System.out.println(birthday);
    	}
    }
    

    ②application.xml中

    <bean id="date" class="java.util.Date"></bean>
    <bean class="com.jd.vo.Student">
    	<constructor-arg name="birthdays">
    		<list>
    			<bean class="java.util.Date"></bean>
    			<ref bean="date"/>
    		</list>
    	</constructor-arg>
    </bean>
    

    6.Map集合

    使用set标签赋值,通过set子标签的value子标签设置数组每个元素的值
    ①Student中

    public Student(Map<String,Date> birthdays) {
    	Set<String> keys = birthdays.keySet();
    	for (String key : keys) {
    		Date birthday = birthdays.get(key);
    		System.out.println(birthday);
    	}
    }
    

    ②application.xml中

    <bean id="date" class="java.util.Date"></bean>
    <bean class="com.jd.vo.Student">
    	<constructor-arg name="birthdays">
    		<map>
    			<entry key="爸爸" value-ref="date"></entry>
    			<entry key="妈妈" value-ref="date"></entry>
    		</map>
    	</constructor-arg>
    </bean>
    

    如果Map集合 key或value是是基本数据类型或String类型,则使用key或value标签属性value,否则使用key-ref或value-ref

    展开全文
  • 调用子类构造方法之前调用父类没有参数的构造方法,其目的是? 帮助子类做初始化工作。

    在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

    帮助子类做初始化工作。

    展开全文
  • 首先我们要知道构造方法是类的一个特殊成员,它在类实例化对象时被自动调用 子类中,它在调用父类中空参数的构造函数。因为子类继承父类,继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的...

    首先我们要知道构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用

    子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程

    定义一个Dog类继承自Animal类

    Animal类中有一个有参构造方法,传入变量 name

    public class Animal {
    
    	public Animal(String name){ // 有参构造方法
    		System.out.println("我是一只"+name);
    	}
    }


    public class Dog extends Animal {
        // 继承自Animal类
    	public Dog(){
    		super("沙皮狗"); // 调用父类有参的构造方法 // 1
    	}
    }

    public static void main(String[] args) {
    		// 实例化子类Dog对象
    	    Dog dog=new Dog(); 
    	}
    }

    运行结果为: 

    通过结果可以看出 通过super调用父类的构造方法 在子类对象初始化时候调用了父类的构造方法。

    如果把Dog类中构造方法的 1 处 super("沙皮狗") 这行代码去掉。

    程序提示出错。运行结果是


    implicit 含义为隐式 explicit含义为显式 invoke 调用

    这行语句大致意思是: 隐式的 super 构造函数Animal()是未定义的。必须显式调用另一个构造函数(即调用有参的构造方法)


    进一步理解。因为Dog类继承自Animal类。当初始化Dog对象时会调用父类Animal的构造方法。

    我们可以在子类的构造方法中通过super指定调用父类的哪个构造方法。如果没有指定。在实例化子类对象时候会自动调用父类无参的构造方法。

    然而父类Animal中只有有参的构造方法。

    在Java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。这个默认方法没有参数,在其方法体中也没有任何代码。即什么也不做。

    但是如果一旦为该类定义了构造方法。系统就不再提供默认的构造方法了

    因此。由于Dog类中构造方法的 1 处 super("沙皮狗") 代码没有了 。而父类又没无参的构造方法。所以程序出错。


    为了解决上述编译问题。

    1、可以在子类中显式的调用父类中已有的构造方法,

    2、也可以在父类中定义无参的构造方法


    因此得出结论,在定义一个类时,如果没有特殊需求,尽量在类中定义一个无参的构造方法,避免被继承时出现错误。

    如果父类的构造方法是带参数的,而且没有无参数的构造方法,那么在子类的构造方法中必须显式地调用父类的构造方法。
    如果父类的构造方法是无参数的,那么在子类中写不写都可以,不写的话会隐式地调用。
    若父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数;

    展开全文
  • 在对对象成员变量初始化时,有输入时,通过有参构造方法进行赋值。当没有输入时,可以给个初始值,就通过无参写入默认的,无参调有参...// main方法中 new调用无参构造方法,再完成上面的无参调有参 new 类名(); ...
  • JVM不予许未实例化的情况下直接调用构造方法。必须new过才行。this是指实例化后的对象 代码: public class Person { String name; int age = 25; public Person(String name){ setName(name); } public ...
  • 用this调用构造方法

    千次阅读 2013-12-12 08:09:17
    如果在程序中想用某一构造方法调用另一构造方法,可以用this来实现,具体的调用形式如下; this(); 例: public class java_ex09 { public static void main(String[] args){ new Person09("xiangwang",25);...
  • Java的静态方法里是不能调用非静态方法的,但为什么可以调用构造方法
  • 是不是子类构造方法调用了任何方法,不管是自己重构的构造方法,还是其他方法,系统就不会给super()了,初学者有疑问,求大神解答
  • 使用this调用构造方法

    千次阅读 2014-07-23 20:25:10
    package lkp; class Person{ private String name; private int age;...2、this调用构造方法时一定要留下一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的 */
  • 转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中调用实例方法的示例代码中也提到了调用构造函数来实始化一个对象,但...
  • 无参构造方法和有参构造方法调用
  • 下面是关于父类构造方法调用的实验:当父类子类都没有定义构造方法时,系统为父类、子类提供一个无参构造方法,并在子类中隐式调用父类无参构造方法:class Father {} class Son extends Father {}我们可以自己写...
  • 先说构造方法,在使用Class类中的,newInstance() 取得实例化对象时,出现一些问题。看下面出错的代码:package com.jmd.bingo; class Person { private String name; private int age; // public Person() { //...
  • 一般在子类中显式的调用父类构造方法,若没有显式调用调用,则子类默认调用父类的无参构造方法。(**若父类没有无参构造方法,则编译报错**) 为什么要这样规定呢? 笔者认为:子类从父类那里继承所有的...
  • 方法的调用 this方法 构造方法

    千次阅读 2015-09-04 21:49:04
    1 调用者和被调用方法位于同一类中,调用形式如下 (this)方法名[] 在大多数情况下,关键字this可以忽略 2 调用者位于被调用方法所在类的外部 对象名.方法名或者类名.方法
  • 由此我们可以发现不管是执行子类的无参构造还是有参构造,都会默认调用父类的无参构造方法。 那么如过子类和父类都加了静态代码块,执行的先后顺序是怎样的呢?下面也做了测试 public class Test01 { ...
  • 其实子类的所有构造方法的第一行都有一条隐示super()或者显示的super() 隐示super() 先说一下什么情况下会有隐示的super()。 1.子类构造函数中没写super()并且子父类具有无参构造函数。那么子类第一行便自动一条...
  • 笔者之前一直很疑惑:为什么别人的源代码中的类...这个是Java的规定:子类继承父类,子类的构造方法必须调用super()即父类的构造方法,而且必须放在构造方法的第一行。那么问题又来,为什么我写的类有时候都不用去...
  • ),但是子类在实例化对象时:如果子类的构造器没有显示的调用超类的方法,则将自动调用超类默认构造器(子类构造器中默认是有super()的(可以使用super(参数)调用有参构造),所以会调用父类构造方法,如果是...
  • 1.构造方法为为了初始化对象中的属性和方法 2.子类继承父类的成员变量,所以要先调用fuqi父类的构造方法和属性。
  • Java继承关系下的构造方法调用

    千次阅读 2015-03-19 16:24:47
    在Java中创建一个类的对象时,如果该类存在父类,则先调用父类的构造方法,然后再调用子类的构造方法。本文描述子类中如何调用父类的构造方法
  • 如题:new 一个没有构造方法的子类,会调用父类的无参构造方法。如下面的两个类:
  • 如何在构造方法调用另一个重载的构造方法:案例: 编写汽车类 汽车类属性: int id; String brand; String color; int weight; 汽车类中的构造方法: Car(); Car(id,brand); Car(id,brand,color); Car(id,...
  • JAVA中super()作用:调用父类构造方法构造方法链 写给自己看的笔记。 写在纸上我弄丢。 有什么错误欢迎大家提出。 代码: public class Test extends B { public static void main(String[] arg) { new ...
  • * 在调用父类的构造方法时,super必在子类构造方法的第一行,否则报错*/class Demo6{//显示定义了有参构造方法,这个类就没了隐藏了的无参构造方法public Demo6(String name){this.name = name;this.age = 0;}...
  • Java中如何在无参构造方法调用有参构造方法

    万次阅读 多人点赞 2016-08-10 14:27:14
    参数的扩展和构造方法调用都是有一定的规律的。 有参调无参,多参调少参。。扩展参数的时候,最好保持原来的顺序。除非为了实现特殊的功能效果(个人以为主要是练基本功使用) 无参调有参需要传实参!!package ...
  • public class ThisQuoteTest { String name; int age; String work; public ThisQuoteTest() { this("Lily",23,"teacher");... public ThisQuoteTest(String name,int age,String work) ... this.name =nam
  • B继承A B x = new B();...如果父类无构造方法(其实是一个默认无参的构造方法),那么子类的构造方法自动进行调用;如果 父类有自己的构造方法(这时父类不会有默认无参的构造方法),那么在子类的...
  • public class Test{ private int x; private String s; public Test(int x) { this.x = x;...//调用自身的构造方法,这种写法只能存在于构造方法中,有且只能有一个,在此构造方法中必须写在其他语句之前

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,518,310
精华内容 607,324
关键字:

哪些会调用构造方法