继承关于1.成员变量 2.成员方法
1 继承的三个特点
1.1 Java语言是单继承的
一个类的【直接父类】是【唯一】的(爸爸只有一个)
1.2 Java语言可以多级继承
*注意是多级继承,不是多继承
class A {}
class B extends A {}
class C extends B {}
A是B的直接父类,B是C的直接父类,A也是C的父类(不是爷爷类)
在继承的体系中,所有类都有一个父类是java.lang.Object
1.3 Java语言父类可以有多个子类
很好理解 。。。
2 继承的注意事项
2.1 关于成员变量
2.1.1 在不同位置定义的变量,在调用时应注意区分
以下面的4个同名变量num为例:
public class Fu {
int num = 1;
public void fuMethod(){
int num =0;
System.out.print(num);
System.out.println(this.num);
}
}
public class Zi extends Fu {
int num = 2;
public void ziMethod() {
int num = 3;
System.out.print(num); // 访问的是局部变量3
System.out.print(this.num); // 访问的是本类的成员变量2
System.out.print(super.num); // 访问的是父类的成员变量1
super.fuMethod(); // 用子类方法访问父类的方法
}
}
main函数中创建一个子类的对象xiaoming,可调用自己的方法和其父的方法
public class FuZiDemo {
public static void main(String[] args) {
Zi xiaoming=new Zi();
xiaoming.ziMethod(); // 调用子类方法(其中也调用了父类方法)
System.out.println("——————");
xiaoming.fuMethod(); // 调用父类方法
}
}
/*
结果:
32101
——————
01
*/
2.2 关于成员方法
2.2.1 方法的覆盖重写@Override,要求父子方法名、参数都相同
public class Fu {
public void method() {
System.out.println("执行了父类方法");
}
}
@Override可以不写,但写了可以检测是否成功进行了覆盖重写
public class Zi extends Fu {
@Override
public void method() { // 子类的方法名和父类相同,就在前写上@Override
System.out.println("执行了子类方法");
}
}
public class Demo {
public static void main(String[] args) {
Zi xiaoming = new Zi();
xiaoming.method();
}
}
// 执行了子类方法
扩展知识:
- 子类方法的返回值范围必须小于等于父类返回值的范围,如java.lang.object类是所有类的公共最高父类,java.lang.String就是Object的子类,那么父类如果返回值为String,则子类不能返回Object
- 子类的权限修饰符必须大于等于父类的权限修饰符,public > protected > (default) > private
当然,大多数情况下父子返回值、权限修饰符是相同的
2.2.2 开发新产品应使用继承,而不能对原来的产品直接改动
老款手机的功能:
public class Phone {
public void call() {
System.out.println("打电话");
}
public void message() {
System.out.println("发短信");
}
public void show() {
System.out.println("显示来电号码");
}
}
新款手机显示功能不仅能显示来电号码,还可以显示号码归属地:
(继承后,在子类中输入想要覆盖重写的方法(即输入‘show’),就可以自动按IDEA的提示补全父类中(show方法)的模版,在它的基础上方便地进行修改,下面两排“=”号之间的内容为输入‘show’后自动补全的)
public class PhoneNew extends Phone {
/=================================
@Override
public void show() {
super.show(); // 来电显示号码父类有,直接拿来用
/=================================
System.out.println("显示来电归属地"); // 这是加入的新功能
}
}
main中展示两款手机各自的功能:
public class Demo {
public static void main(String[] args) {
System.out.println("以下是老款手机的全部功能:");
Phone phone1 = new Phone();
phone1.call();
phone1.message();
phone1.show();
System.out.println("***********************");
System.out.println("新款手机在原有的显示功能中加入了归属地:");
PhoneNew phone2 = new PhoneNew();
phone2.call();
phone2.message();
phone2.show();
}
}
/*
以下是老款手机的全部功能:
打电话
发短信
显示来电号码
***********************
新款手机在原有的显示功能中加入了归属地:
打电话
发短信
显示来电号码
显示来电归属地
*/