构造方法 this super
1 构造方法
1.1 构造方法Constructor概述
创建对象要明确属性值,此时需要用到构造方法,即对象创建时要执行的方法,用来给对象的属性进行初始化。
在new对象时,知道其执行的构造方法是什么,就可以在执行这个方法的时候给对象进行属性赋值。
Perons p = new Person("张三",23); 在new的时候给p对象的name属性和age属性进行赋值,使这个对象的属性有值。
构造方法没有返回值类型,也不需要写返回值。因为它是用来构建对象的,对象创建完方法就执行结束。
格式特点:
a:方法名与类名相同(大小也要与类名一致)
b:没有返回值类型,连void都没有
c:没有具体的返回值return;
每一个class类都必须有一个构造方法,如果不定义空参构造方法,系统会自动生成一个空参构造方法,如果定义了构造方法,无论空参还是有参,系统都不再提供空参构造方法了。
此时如果还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法。
什么时候需要在类中写构造方法?如果对象在创建时就要明确属性值,这时就需要在定义类的时候书写有参构造方法。(不写也有默认的构造方法)。
一个类可以有多个构造方法,多个构造方法是以重载的形式存在的,构造方法可以被private修饰,作用:其他程序无法创建该类的对象。
构造方法举例
class Person {
private int age;
private String name;
// Person的构造方法,拥有参数列表
Person(int a, String nm) {
// 接收创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
}
1.2 给成员变量赋值的两种方式的区别
setXxx()方法:修改属性值
构造方法:给对象中属性进行初始化
1.3 构造方法的内存加载过程
有一个Person类, 创建Person 对象new Person()
1、首先会将main方法压入栈中,执行main方法中的 new Person(23,"张三");
2、在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88)。然后给成员变量进行默认初始化(name=null,age=0)。
3、执行构造方法中的代码(age = a ; name = nm;),将变量a对应的23赋值给age,将变量nm对应的”张三赋值给name,这段代码执行结束后,成员变量age和name的值已经改变。执行结束之后构造方法弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2。
1.4 构造方法和一般方法区别
1.格式:构造方法没有返回值和返回值类型
2.作用:构造方法用来给成员变量初始化;
3.调用方式:构造方法创建对象时调用, 或者this() super()语句调用
4.执行时机:构造方法在对象创建时就执行了,且只执行一次。
1.5 this在构造方法之间的调用
构造方法,无法通过构造方法名来相互调用。构造方法之间的调用通过this关键字来完成。
构造方法调用格式:this(参数列表);
this调用构造方法的案例:
class Person {
private int age;
private String name;
// 无参构造方法
Person() {
}
// 姓名初始化构造方法
Person(String nm) {
name = nm;
}
// 姓名和年龄初始化构造方法
Person(String nm, int a) {
// 由于已经存在给姓名进行初始化的构造方法 name = nm;因此只需要调用即可
// 调用其他构造方法,需要通过this关键字来调用
this(nm);
// 给年龄初始化
age = a;
}
}
1.6 构造方法调用的原理
1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
2、堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null age = 0);
3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。
4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。
调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。
2 this关键字
2.1 this关键字概述
this代表当前对象的引用,用来区别同名的成员变量与局部变量(this.成员变量),谁来调用我,我就代表谁
什么时候使用this呢?
1 当类中成员变量和局部变量同名时,为了区分,需要使用this关键字
2 写功能的时候,可能用到this。比如比较两个对象的年龄compare();equals();
3 构造函数中使用this,this()必须放在第一行。
this什么时候存在的?当创建对象的时候,this存在
2.2 super关键字
代表当前对象父类的引用
2.3 this和super的使用区别
a:调用成员变量
this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量
b:调用构造方法
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
c:调用成员方法
this.成员方法 调用本类的成员方法,也可以调用父类的方法
super.成员方法 调用父类的成员方法
2.4 this应用示例
需求:在Person类中定义功能,判断两个人是否是同龄人
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
// 判断是否为同龄人
public boolean equalsAge(Person p) {
// 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
// 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
return this.age == p.age;
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.setName("zhangsan");
p1.setAge(13);
p2.setName("lisi");
p2.setAge(14);
System.out.println("年龄相同?..." + p1.equalsAge(p2));
}
}
3 super关键字
3.1 super关键字概述
代表当前对象父类的引用
3.2 子父类中构造方法的调用
子类创建对象、使用子类构造方法时,都会调用父类构造方法,因为子类构造方法第一行都有默认的隐式super();语句。
原因:子类继承了父类内容,子类创建对象时,必须先到父类中去执行父类的初始化动作,这样,才可以使用父类中的内容。
子类默认会调用父类的无参构造,当父类中没有空参构造方法时,子类构造方法调用父类的无参构造会报错,所以子类构造方法必须有显式的super语句,指定要访问的父类有参构造方法。
格式:
调用本类中的构造方法:this(实参列表);
调用父类中的空参构造方法:super();
调用父类中的有参构造方法:super(实参列表);
class Fu{
int num ;
Fu(){
System.out.println("Fu构造方法"+num);
num = 4;
}
}
class Zi extends Fu{
Zi(){
//super(); 调用父类空参数构造方法
System.out.println("Zi构造方法"+num);
}
}
public class Test {
public static void main(String[] args) {
new Zi();
}
}
>>>
Fu构造方法0
Zi构造方法4
3.3 创建子类对象过程的细节
1 构造方法第一行,写this()还是super()?
this() 是调用本类的构造方法,super()是调用父类的构造方法, 且两条语句不能同时存在
保证子类的所有构造方法调用到父类的构造方法即可,无论如何,子类的所有构造方法,必须直接或间接调用到父类构造方法;
2 如果子类构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?
此时是没有的,因为this()或super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
3 父类构造方法中是否有隐式的super呢?父类的父类是谁呢?super调用的到底是谁的构造方法呢?
有。记住:只要是构造方法默认第一行都是super();Java定义了一个所有对象的父类Object
构造方法 this super的更多相关文章
- 12_java之构造方法|this|super
01构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建 ...
- java 构造方法+this+super
构造方法的格式: 修饰符 构造方法名(参数列表) { } 构造方法的体现: 构造方法没有返回值类型.也不需要写返回值.因为它是为构建对象的,对象创建完,方法就执行结束. 构造方法名称必须和类名保持 ...
- java 构造方法中super()和this()
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 3)super: 它引用当前对 ...
- java 构造方法中super()的作用?
手贱百度了一下 :java里面自定义类的有参构造方法为什么不用super() 举个例子: class Father { Father(){print ('father');}; } class Son ...
- PyQt(Python+Qt)学习随笔:PyQt界面派生类构造方法中super方法的使用
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<第15.7节 PyQt入门学习:PyQt5应用构建详细过程介绍>和订阅专栏<第 ...
- [Day12]构造方法、关键字this、super
1.构造方法:对象创建时要执行的方法 (1)构造方法的格式: 修饰符 构造方法名(参数列表){} 体现: a.构造方法没有返回值类型,也不需要返回值 b.构造方法名称必须和类型保持一致 c.构造方法没 ...
- this和super不能同时出现在构造方法中
package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...
- 使用super调用父类的构造方法
package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...
- 4、构造方法、this、super
构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...
随机推荐
- 基于weixin-java-mp 做微信JS签名 invalid signature签名错误 官方说明
微信JS签名详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang= ...
- Cmake find_package 需要指定具体的so
需要使用cmake的find_package将boost库添加到项目中,通过cmake --help-module FindBoost 可以查看cmake引入Boost的帮助信息: 可以看到,Boot ...
- 离线环境下安装ansible,借助有网环境下pip工具
环境 有网的机器(192.168.19.222):rhe65,python2.7.13,pip9.0.1 离线机器(192.168.19.203):rhe65,python2.6 FTP(192.16 ...
- 关于Java 软件工程师应该知道或掌握的技术栈
鄙人星云,今天突然想写这么一篇需要持续更新的文章,主要目的用于总结当前最流行的技术和工具,方便自己也方便他人. 更新时间:2018-10-23 09:26:19 码农职业路径图 码农入门职业路径图 J ...
- 基于jQuery发展历程时间轴特效代码
分享一款基于jQuery发展历程时间轴特效代码,带左右箭头,数字时间轴选项卡切换特效下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div id="time ...
- Paxos 实现日志复制同步(Basic Paxos)
Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...
- 遍历一个Set的方法只有一个:迭代器(interator)。
Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...
- List接口:(介绍其下的两个实现类:ArrayList和LinkedList)
以下介绍接口: List接口:(介绍其下的两个实现类:ArrayList和LinkedList) ArrayList和数组非常类似,其底层①也用数组组织数据,ArrayList是动态可变数组. ① ...
- org.hibernate.InvalidMappingException: Could not parse mapping document from无法创建sessionFactory
把 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" 改为 "http://hibernate.sourc ...
- tensorflow c/c++库使用方法
tensorflow目前支持最好的语言还是python,但大部分服务都用C++ or Java开发,一般采用动态链接库(.so)方式调用算法,因此tensorflow的c/c++ API还是有必要熟悉 ...