Java在学习的时候一般很少会注意的一些点,以及面向实际操作过程中的一些Demo吧主要是。

还有this和super这两个关键字的正确用法。

this和super关键字的作用

而一般用的最多的还是

因为

  • this.成员变量一般用于区分实例变量局部变量

  • super.成员方法用于访问父类的成员方法。

两种情况一般都是比较常见的,所以着重区别一下。

子父类构造方法访问流程

抛砖引玉

  1. 创建子类对象的时候,一定是先找子类对应的构造方法;
  2. 在子类构造方法的第一行,一定会调用父类的构造方法,此时就会执行父类的构造方法,对父类进行初始化;父类初始化的内容,专供当前这个子类独享使用;
  3. 当父类的构造方法执行完成之后,才会执行子类构造方法中的其他代码,完成子类对象的初始化;

CodeDemo

主要分三个类:父类,子类,Test测试类

Tips:

  • 输出打印对象
    • 在sout打印对象的时候,如果没有重写toString方法,则默认打印包名.类名@地址值这种格式
  • 创建子类对象:首先调用子类构造器方法,然后super(有参则调用父类全参构造,无则调用空参构造)

父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.xlkh.demo08_constructorSeq;

import javax.lang.model.element.NestingKind;

public class Fu {
// 标准的Javabean实体类
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
System.out.println("父类构造方法执行了!");
}

public Fu(String name) {
this.name = name;
}

@Override
public String toString() {
return "Fu{" +
"name='" + name + '\'' +
'}';
}
}

子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.xlkh.demo08_constructorSeq;

public class Zi extends Fu{
// 这里如果父类没有写空参数的构造方法,写到这里是会报错的,因为java会赠送子类一个空参数的构造方法,第一行为super();去找父类的空参数构造方法,但是父类没有,故报错
// 解决方法1:在父类中添加一个空参数的构造方法(如果父类是别人写的就不太合适)

// 解决方法2:子类手动调用父类带参数的构造方法
public Zi(String name) {
super(name);
System.out.println("子类构造方法执行了!");
}
public Zi(){
// 调用重载的方法时,可以使用this().方法名,但是this会和super打架
// this(); 因为在调用重载方法的时候,super(name)会调用父类的构造方法,造一个父类, 但是下面的super(null)又会造一个父类,违背了一个孩子只能有一个爹的原则
super(null);


}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
package com.xlkh.demo08_constructorSeq;

public class Test {
public static void main(String[] args) {
Zi z = new Zi("张三");
Zi z2 = new Zi("李四");

System.out.println(z);
System.out.println(z2);
}
}

子类构造器调用父类构造器的执行流程

面向对象-继承刷题本

要求

Analysis

需要创建四个类,Person类,Coder类,Manager类,Test测试类。

其中Manager有bonus奖金,而Coder没有,所以这个类的构造方法略微有些不同,但是都能通过快捷键生成。

CodeDemo

Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.xlkh.demo01_exercise;

public class Person {
private String name;
private int id;
private double salary;

public Person(String name, int id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}

public Person() {
}
public void work(){
System.out.println("人要工作!");
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}
}

Coder类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.xlkh.demo01_exercise;

public class Coder extends Person {

public Coder(String name, int id, double salary) {
super(name, id, salary);
}

public Coder() {
}

@Override
public void work() {
System.out.println("工号为"+ super.getId() +"基本工资为" +super.getSalary()+ "的程序员正在努力写着代码!,");
}
}

Manager类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.xlkh.demo01_exercise;

public class Manager extends Person {
private double bonus;

public Manager(String name, int id, double salary, double bonus) {
super(name, id, salary);
this.bonus = bonus;
}

public Manager() {
}

public double getBonus() {
return bonus;
}

public void setBonus(double bonus) {
this.bonus = bonus;
}

@Override
public void work() {
System.out.println("工号为"+ super.getId() +"基本工资为" +super.getSalary()+"奖金为"+bonus+"的项目经理正在努力做着管理工作,");
}
}

Test测试类

1
2
3
4
5
6
7
8
9
10
11
12
package com.xlkh.demo01_exercise;

public class Test {
public static void main(String[] args) {
Manager m = new Manager("张三", 9527, 1500, 600);
Coder c = new Coder("华安", 123, 10000);

m.work();
c.work();
}
}

Summary总结

有始有终!