前面学习过,面向对象程序设计的基本原则有四个,即抽象原则、封装原则、继承原则、多态原则。 今天来学习一下第三个基本原则——继承原则。
比如先定义一个User类,代表人类
public class User {
private String name;
private int age;
// ...省略get set方法
}
再定义一个学生类继承User类
public class Student extends User{
}
此时,学生类就包括了User类的变量,可以在测试类调用
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(18);
}
}
public class User {
// private 级别
private String name1;
// 默认 级别
String name2;
// protected 级别
protected String name3;
// public 级别
public String name4;
}
访问权限明细如下
访问权限 | 类内部 | 包下的类 | 非本包子类 | 非本包非子类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
默认 | √ | √ | × | × |
private | √ | × | × | × |
在Object类中,定义了Java对象都应具备的方法。
即使某一个类没有使用extends关键字,也默认直接继承了Object类,这是Java的约定。
比如User类
public class User {
// private 级别
private String name1;
// 默认 级别
String name2;
// protected 级别
protected String name3;
// public 级别
public String name4;
}
等同于
public class User extends Object{
// private 级别
private String name1;
// 默认 级别
String name2;
// protected 级别
protected String name3;
// public 级别
public String name4;
}
之前学习了this关键字,this代表着当前对象本身。
super还可以调用被覆盖或者被隐藏的父类方法。
父类User定义了say方法
public class User{
public void say() {
System.out.println("我是User类");
}
}
子类Student也定义say方法
public class Student extends User{
@Override
public void say() {
System.out.println("我是Student类");
super.say();
}
}
在测试类中,调用Student方法
public class Main {
public static void main(String[] args) {
new Student().say();
}
}
输出如下,即子类Student调用了父类User的say方法
我是Student类
我是User类
Process finished with exit code 0
之前介绍的User和Student的say方法就是方法覆盖的demo。
属性隐藏指在子类重新定义了父类同名的成员变量,从而导致在子类中不能找到父类继承而来的成员变量。 子类可以通过属性隐藏,来实现父类未完善的功能,对父类的功能进行进一步扩展。
public class User{
public String post;
}
public class Student extends User{
public String post = "学生";
}
public class Main {
public static void main(String[] args) {
System.out.println(new Student().post);
}
}
输出
学生
Process finished with exit code 0
前面学习的方法覆盖,指的是Java继承关系中,子类对父类继承而来的方法进行了重写,存在于不同的类中,要求子类的方法声明和父类一致。
如下面的add方法
public class Main {
public static int add(int x,int y) {
return x + y;
}
public static float add(float x,float y) {
return x + y;
}
public static float add(int x,float y) {
return x + y;
}
public static void main(String[] args) {
System.out.println(add(1, 2));
}
}
idea工具会给与调用提示
在实际开发中,父类只允许子类继承,但不允许子类修改。 在一些安全性较高的场景下会有这样一个需求。 此时可以将父类方法或父类成员变量增加final关键字修饰,子类将不能更改父类的成员方法。
public class User{
public final void say() {
System.out.println("我是USER");
}
}
子类无法重写覆盖