第七天 构造器和super关键字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七天 构造器和super关键字相关的知识,希望对你有一定的参考价值。
构造方法constructor
在开发的过程中,创建对象的同时要明确对象的属性值,比如员工入职就要明确让他的姓名,年龄等.怎么解决呢就需要构造方法
构造方法:是一个类的成员方法,它的名称与类的名称相同,声明类的一个对象时,会自动调用 构造方法,构造方法用于初始化对象
构造方法的定义:
格式
修饰符 构造方法名(参数列表){ }
体现:
名称必须与类名一致,
没有返回值类型,因为他用来构造对象,对象构造完,方法就执行结束
不能被static、final、synchronized、abstract和native修饰。
构造方法是可以被private修饰的,作用其他程序无法创建该类的对象.
举例
class Person { // Person的成员属性age和name private int age; private String name; // Person的构造方法,拥有参数列表 Person(int a, String nm) { // 接受到创建对象时传递进来的值,将值赋给成员属性 age = a; name = nm; } }
特点:在new对象的时候自动执行.只要是构造方法默认第一行都是super();Java体系在设计,定义了一个所有对象的父类Object
默认添加的构造方法:编译的时候,javac 系统会自动检测类中是否有构造方法,如果没有 编译器会自动添加一个构造方法,比如上面的例子,编译器添加一个 无参数的构造方法public person(){}
构造方法的调用赋值:构造方法是系统自动调用的,不需要手动调用
普通方法不能调用构造方法
构造方法的重载:
与普通方法一样;
class Person { private int age; private String name; // 私有无参数的构造方法,即外界不能通过new Person();语句创建本类对象 private Person() { } // 多个构造方法是以重载的形式存在 Person(int a) { age = a; } Person(String nm, int a) { name = nm; age = a; } }
构造方法与一般烦那个发的异同
1.格式不同
构造方法 : 修饰符 类名(参数类型 参数 ...){
初始化成员变量
}
一般方法: 需要有返回值类型
2.作用不同
构造方法一般用来给成员变量初始化;
一般方法根据需求而定;
3.调用方式不同
构造方法创建对象时调用, 或者this() super() 语句调用
普通方法需要对象调用或者静态方法直接调用静态方法.
4.执行不同
构造方法在对象创建时就执行了,而且只执行一次。
一般方法是在对象创建后,需要使用时才被对象调用,并可以被多次调用。
This在构造方法之间的调用
一般方法可以通过方法名实现方法之间的调用,真对构造方法,无法这样做.
这个时候就需要借助this关键字来实现,来减少代码的复制,增大代码的可读性.
格式:this(参数列表);
This();必须在构造方法第一行,初始化动作要最先执行
class Person { // 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; } }
如果构造器参数有多个怎么办?比如说,人有姓名、性别、年龄、体重、身高、出生年月、出生地址......这种情况在做项目中必然是会遇到的,就算开始没有遇到,随着项目的需要,也是需要可扩展。这个时候就需要Java高效编程之Builder模式.
Super关键字
有人任务super和this是类似的概念 实际上这样比较不恰当 这是因为super不是一个对象的引用,不能将super 的值赋给另一个变量 他只是指示编译器调用超类的方法的特殊关键字
作用 两个1构造方法中的使用
2 和this差不多,当父类子类中的成员变量或方法与父类中的成员变量或方法同 名,引用父类中的成员.
子父类中构造方法的调用
创建子类对象时,父类的构造方法会先执行,因为所有的构造方法的第一行有默认 的隐式super();语句
格式:
(调用本类中的构造方法this(实参列表);
调用父类的构造方法:
Super();
Super(参数)
子类构造方法会有一个默认添加的构造方法
public class Student extends Person { public Student(){ super(); } }
为什么子类对象创建都要访问父类中的构造方法呢
因为子类继承了父类的内容,所以创建对象时,必须要先看着父类是如何对其内容进行初始化的.子类默认会调用父类的无参构造, 但如果父类没有无参构造,子类的构造方法继续调用父类的无参构造就会报错。因此子类构造方法的第一行需要调用父类的构造方法,既可以调用父类的无参构造,也可以调用父类的有参构造,这样语法上就不会报错。
当父类没有空参构造方法时,子类的构造方法必须有显示的super语句,指定要访问的符有参数构造方法
构造方法的第一行写this还是super
This()是调用本类的构造方法,super是调用父类的构造方法,两条语句不能同时存在我们要做的就是保证所有的构造方法能调用到父类的构造方法
如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?
这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
无论如何,子类的构造方法,直接或间接必须调用到父类的构造方法
在子类中的成员变量或方法与父类中的成员变量或方法同名,引用父类中的成员.
class Father { public int num = 2; Father() { getNum(); } public void getNum() { System.out.println("父类getNum"+this.num); } } class Son extends Father { public int num=4; public Son() { super(); super.getNum(); System.out.println("子类构造函数中"+num); } public void getNum() { System.out.println("子类getNum方法"+num); } } public class Demo { public static void main(String[] args) { new Son(); } }
结果
子类getNum方法0
父类getNum2
子类构造函数中4
new son();先执行子类构造器,构造器里先执行父类的构造器,父类构造器调用了getnum方法
为什么调用的是子类的呢 因为方法已经被子类覆盖(隐藏)掉了,这个时候打印num也应该打印子类的num而这时num的值还没始化为4所以还是0 第一句
之后用super.名调用了父类自己的getnum 输出第二句
最后子类自己的构造方法的最后一句话
以上是关于第七天 构造器和super关键字的主要内容,如果未能解决你的问题,请参考以下文章