构造方法
1.1、构造方法的定义格式:
public 类名(参数列表){
}
方法的名字必须和类的名字完全一致,并且不允许返回值类型,void也不行
普通方法定义格式:修饰符 返回值类型 方法名(参数列表){return}
构造方法在new的时候,自动执行 ,其他方法需要对象.方法,调用才能执行。而且构造方法只执行一次,new一次执行一次
new类,就是在调用类(class)的构造方法,每个class必须拥有构造方法,构造方法不写也有,,编译的时候,javac,会自动检查类中是否有构造方法,如果没有,编译器就会自动添加一个空参数的构造方法。
如果手写了构造方法,在编译的时候,就不会自动添加构造方法
当调用构造器的时候new person()是可以调用类的构造器,但是这个构造器里根本没有参数
new person("张三",20)实在调用有参数的构造器,当然参数必须存在
构造方法可以重载,也就是一个类可以共同有多个构造器
下面两个构造器属于重载关系
、
输出为:旺财 18、小强 17.
构造方法内存图
this关键字
this.用于区分局部变量和成员变量的同名情况:
1 成员变量:作为类的成员而存在,直接存在于类中。所有类的成员变 量可以通过this来引用。
2 局部变量:作为方法或语句块的成员而存在,存在于方法的参数列表和方法定义中。
3 全局变量:定义在类上面,全部可以进行this调用
this另一种用法:this()可以再构造方法之间进行调用
this()在空参构造器里调用了有参构造方法,将参数传递给有参构造器,但是在传递的时候this()必须在构造器第一行
调用哪一个构造方法完全地看this()括号里面的参数与哪呢个构造器相匹配重载形式的构造方法,无论new哪一个构造器都会进行赋值运算。
super关键字、父子类
- 1、Super的应用
- super.,可以调用父类成员变量
- super.调用父类成员方法()
- 在构造方法当中可以调用父类构造方法super()
- 2、在子类中使用super()的方式,调用父类的构造方法
- super()调用的是分类中空参的构造器
- super(有参)调用的是父类中有参数的构造器
- 但是在父类中调不到子类构造器
- 3、子类构造方法
- 子类构造方法的第一行,有一个隐式代码super()
- public Student(){
super()
}
- 在new子类构造器的时候要首先new父类构造器
- 子类中所有的构造方法无论重载多少个,第一行必须是super()
- 父类中有多个构造方法,子类中调用几个都可以,
- 构造方法不能继承,当然也没有重写的概念
构造方法的第一行到底是写this还是super
不能同时存在,然选其一,但是保证子类的所有构造方法都能调用到父类中的构造方法即可
- 无论如何,子类的所有构造方法,直接或者间接,必须调用到父类构造方法
- 子类构造方法,什么都不写,默认的第一行也是super()
- super表示的是父类的内存位置,标记出所继承的父类的内存区域,
- 而this是本类的对象引用
子父类内存关系:
子类调用父类实例
/*
*把共性抽取出来,做成父类
*子类继承共性,继承person
*创建的同时==new Student、new Worker
*/
public class Person {
private String name;
private int age;
public static void main(String[] args) {
Worker w = new Worker("光头强", 30);
System.out.println(w.getAge());
System.out.println(w.getName());
Student s = new Student("熊二", 10);
System.out.println(s.getAge());
System.out.println(s.getName());
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
}
class Worker extends Person {
public Worker(String name, int age) {
super(name, age);
}
}