前言

  • 课程的第五篇,下一篇开始抽象类,方法和接口相关的内容,故命名为抽象与接口。
  • 以防有新读者所以我简述一下第一篇的前言。
  • 这个Java急速学习课程适合有一定编程基础的人。它通过实际的代码例子来教Java,减少了理论讲解,使学习过程更直观,帮助你更快地掌握Java的核心技能。课程内容经过优化,力求简洁明了。同时,课程鼓励大家交流心得,提出更好的解决方案,以此来不断改进课程内容。

包含的知识

  1. 继承 (Inheritance)
  • 子类可以通过 extends 关键字继承父类的非私有属性和方法。
  • 子类可以添加自己的属性和方法,也可以重写父类的方法。
  • 构造器中可以使用 super 关键字调用父类的构造器。
  1. 封装 (Encapsulation)
  • 属性通常设置为私有 (private) 以保护数据不被外部直接访问。
  • 通过提供公共的 getter 和 setter 方法来允许安全的数据访问和修改。
  1. 多态 (Polymorphism)
  • 允许将子类对象赋值给父类引用,实现接口的一致性和灵活性。
  • 方法调用是在运行时根据实际对象的类型决定的,这称为动态绑定或晚期绑定。
  1. 方法重写 (Method Overriding)
  • 子类可以重写继承自父类的方法来改变其行为。
  • 使用 @Override 注解来标识一个方法是重写父类的方法,有助于提高代码的可读性和维护性。
  1. 构造器 (Constructors)
  • 构造器用于初始化新创建的对象的状态。
  • 可以使用 this 关键字在一个构造器中调用另一个构造器。
  • 必须在构造器的第一行使用 super 或 this 调用构造器,但两者不能同时出现在同一个构造器中。
  1. 访问控制 (Access Control)
  • Java 中有四种访问级别:private, 缺省,protected, public
  • private:只能在定义它的类内部访问。
  • 缺省(无关键字):在同一包内的所有类中可见。
  • protected:在同一包内和所有子类中可见。
  • public:对所有类都可见。
  1. 对象的字符串表示 (toString Method)
  • toString 方法用于返回对象的字符串表示形式,常用于调试和日志记录。
  • 通常建议重写 toString 方法来提供对象状态的有用描述。

具体代码

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
package basic_0;

public class BasicZc6 {
public static void main(String[] args) {
// 认识继承
// 创建对象,封装老师数据
// 子类可继承父类的非私有成员方法,可继承成员变量,要调用父类的有参构造方法用super调用
Teacher t = new Teacher();
t.setName("微光zc");
t.setSkill("java、前端、网络工程");
t.setSex('男');
System.out.println(t.getName());
System.out.println(t.getSkill());
System.out.println(t.getSex());

System.out.println("------------------");
// 四种权限修饰符的修饰范围
Fu fu = new Fu();
// fu.privateMethod();
fu.method();
fu.protectedMethod();
fu.publicMethod();

System.out.println("------------------");
//方法重写: 方法名称,形参列表必须一样
Student s1 = new Student("张三", '男', 23);
System.out.println(s1);

Student s2 = new Student("二壮", '女', 19, "北京大学");
System.out.println(s2);

System.out.println("------------------");
//多态
//多态下不能调用子类独有功能
People pig = new Student();
pig.cry();//方法:编译看左,运行看右
System.out.println(pig.getName());// 成员变量:编译,运行看左
}

public static class People {
private String name;
private char sex;

public void cry(){
System.out.println("歪比巴伯,rua~~~");}

public String getName() {
return name;
}

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

public char getSex() {
return sex;
}

public void setSex(char sex) {
this.sex = sex;
}
public People(){
}

public People(String name, char sex) {
this.name = name;
this.sex = sex;
}
}
//继承后子类的访问特点:就近原则
// 只能是单继承的,不支持多继承,支持多层继承
// 一个类直接继承Object,默认继承Object,间接继承Object
public static class Student extends People{//继承extends,学生
private String name;
private char sex;
private int age;
private String schoolName;

@Override//方法重写的校验注解:要求方法名称和形参列表必须与被重写方法一致,否则报错! 好!
public void cry(){
System.out.println("啊吧啊吧啊吧~~");}

public Student() {
}

public Student(String name, char sex, int age) {
// this调用兄弟构造器
// 注:super() this() 必须写在构造器的第一行,而不能同时出现
this(name, sex, age, "微光zc课堂");
}

public Student(String name, char sex, int age, String schoolName) {
// super(); // 必须在第一行
this.name = name;
this.sex = sex;
this.age = age;
this.schoolName = schoolName;
}

public String getName() {
return name;
}

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

public char getSex() {
return sex;
}

public void setSex(char sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getSchoolName() {
return schoolName;
}

public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
//方法重写的常见应用场景:子类重写Object的toString方法,返回对象的内容,不重写返回地址
// 注:直接输出对象,默认会调用Object的toString方法(可以省略不写调用toString的代码),返回对象的地址信息
@Override//方法重写的校验注解
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", schoolName='" + schoolName + '\'' +
'}';
}
}

public static class Teacher extends People{//继承extends,老师
private String skill; //技术

public String getSkill() {
return skill;
}

public void setSkill(String skill) {
this.skill = skill;
}

public Teacher(){
}
public Teacher(String name, String skill, char sex) {
// 子类构造器调用父类构造器的应用场景
super(name, sex);
this.skill = skill;
}
}

class catPeople extends People{//方法的重写
@Override//方法重写的校验注解
public void cry(){
System.out.println("喵喵喵~~");
}
}

public static class Fu {
// 1、private:只在本类访问
private void privateMethod(){
System.out.println("privateMethod");
}

// 2、缺省:当前类中,同包下的其他类中
void method(){
System.out.println("method");
}

// 3、protected:当前类中,同包下的其他类中,子孙类中
protected void protectedMethod(){
System.out.println("protectedMethod");
}

// 4、public:任何类中都可以访问
public void publicMethod(){
System.out.println("publicMethod");
}

public static void main(String[] args) {
Fu fu = new Fu();
fu.privateMethod();
fu.method();
fu.protectedMethod();
fu.publicMethod();
}
}
}