封装
将属性改为private,然后设置get/set方法
继承
查看类的继承关系快捷键:CTRL + H
- 所有类都默认继承了Object类
- Java中只有单继承没有多继承
-
问:java是单继承,但是所有类都是Object类的子类,那么既然已经继承Object,为什么还能继承一个其他的类呢?
-
答:https://blog.youkuaiyun.com/yekui/article/details/84222590
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
继承的使用
// 此代码段为两个Java源文件,通过*行分隔。
public class Person {
private String name = "Wwz";
int age = 23;
public void say() {
sout("Person.say()");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
*****************************************************************************************************************
public class Student extends Person {
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say();
System.out.println(student.name); // 此行代码报错,因为name为private,子类继承了此属性,但不可见。可通过public的get/set方法获取。
System.out.println(student.age); // 顺利打印:23
}
}
this和super
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
- this和super分别代表本身调用者这个对象和代表父类对象的引用
- this没有继承也可以使用
- super只能在继承条件下才可以使用
- this();调用本类的构造
- super();调用父类的构造
public class Person {
protected String name = "WZhAng";
private void print() {
System.out.println("Person method.");
}
}
*****************************************************************************************************************
public class Student extends Person {
private String name = "Wwz";
public void print() {
System.out.println("Student method.");
}
public void test1(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void test2() {
print();
this.print();
super.print(); // 此行代码报错,父类的print方法为private属性。
}
}
*****************************************************************************************************************
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test1("汪汪~");
student.test2();
}
}
/* 输出结果:
汪汪~
Wwz
WZhAng
*/
继承中构造器问题
子类的无参构造器隐式调用了父类的无参构造器
public class Person {
public Person() {
System.out.println("执行了Person无参构造器。");
}
}
***************
public class Student extends Person {
public Student() {
super();// 此行代码被隐藏了,默认调用父类的无参构造器。且必须放在子类构造器的第一行。
this("调用子类有参构造器。");//此行代码报错,必须放在子类构造器的第一行。与super()冲突。
System.out.println("执行了Student无参构造器。");
}
publi Student(String name) {
}
}
****************
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
/*输出结果:
执行了Person无参构造器。
执行了Student无参构造器。
*/
多态
static修饰的方法归类所有,叫类的成员,不叫对象的成员。
有static时,person调用了Person类的方法,因为person是用Person类定义的
没有static时,person调用的是对象的方法,而person是用Student类new的
即person是Student new出来的对象,因此调用了Student的方法
因为静态方法是类的方法,而非静态是对象的方法
总结:能否执行看引用类型,执行内容看实际创建的类型
重写:需要有继承关系,子类重写父类的方法
1.方法名必须相同
2.参数列表列表必须相同.
3.修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
4.抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大)
重写,子类的方法和父类必要-致;方法体不同
public class Person {
public static void test() {
System.out.println("Person.test()");
}
public void test1() {
System.out.println("Person.test1()");
}
}
*********************************************
public class Student extends Person {
public static void test() {
System.out.println("Student.test()");
}
public void test1() {
System.out.println("Student.test1()");
}
}
*********************************************
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test();//输出:Student.test()
student.test1();//输出:Student.test1()
Person person = new Student();//父类的引用指向了子类
//对象能执行哪些方法,主要看对象声明的类型,和右边new的关系不大
person.test();//输出:Person.test()
person.test1();//输出:Student.test1()
}
}