java基础知识--继承
程序员文章站
2024-03-15 18:14:48
...
概述
- 继承是多态的前提,如果没有继承,就没有多态;
- 继承主要解决的问题:共性抽取(子类继承父类)
- 父类也可叫基类、超类
- 子类也可叫派生类,子类可以拥有父类可继承的内容,也可以拥有自己专有的内容;
继承的格式
- 在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类看待。例如父类是员工,子类是讲师,那么“讲师就是一个员工”。
- 关系:is - a
//定义父类格式:(一个普通的类定义)
public class 父类名称{
}
//定义子类格式
public class 子类名称 extends 父类名称{
}
继承中成员变量访问特点
- 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
1)直接通过子类对象访问成员变量:等号左边是谁则优先用谁,没有则向上找;
2)间接通过成员方法访问成员变量: 该方法属于谁则优先用谁,没有则向上找;
public class Fu{
int num = 200;//父类调用num,则使用父类num;
public void methodFu(){//该方法在父类中定义,属于父类
System.out.println(num);
}
}
public class Zi{
int num = 100;//子类调用num,则使用子类num,而不是父类的num
public void methodZi(){
System.out.println(num);//因为本类当中有num,所以这里用的是本类的num而不是父类的
}
}
区分子类方法中重名的三种变量
- 局部变量: 直接写局部变量名
- 本类成员变量: this.成员变量名
- 父类成员变量: super.成员变量名
public class Fu{
int num = 200;//父类成员变量
}
public class Zi{
int num = 100;//子类成员变量
public void methodZi(){
int num = 300;//局部变量
System.out.println(num);//局部变量
System.out.println(this.num);//子类成员变量
System.out.println(super.num);//父类成员变量
}
}
继承中成员方法的访问特点
- 在父子类的继承关系中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则向上找; - 注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的;
继承方法中的覆盖重写(Override)
- 概念:在继承关系当中,方法的名称一样,参数列表一样;
-
重写(Override)和 重载(overload)的区别
1)重写:方法的名称一样,参数列表一样;也叫覆盖、覆写
2)重载:方法的名称一样,参数列表不一样; - 方法的覆盖重写特点:创建的是子类对象,则优先用子类方法;
- 注意事项:
1)必须保证父子类之间方法名称的相同,参数列表也相同;
@override:写在方法前面,用来检测是不是有效的正确覆盖写;(可以不写,只要满足重写的要求)
2)子类方法的返回值必须小于等于父类方法的返回值范围;
object类是所有类的最高类(祖宗类)
3)子类方法的修饰权限必须大于等于父类方法的权限修饰符;
public>protected>(default)>private
(default)是什么都不写 - 应用场景:对于已经投入使用的类,尽量不要去修改,而是定义一个新的类继承该类,来重复利用共性的内容,并添加新的内容;
继承中构造方法的访问特点
- 继承关系中,父子构造方法的访问特点;
- 子类构造方法中有一个默认的隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造;
- 子类构造可以通过super关键字调用父类的重载构造方法;
- super的父类构造方法调用,必须是子类构造方法中的第一个语句;
- 不能一个子类构造方法中调用多次super构造方法;
即:子类构造方法中必须调用父类的构造方法,不写则默认赠送super(),写了则用写的指定的super调用,super只能有一个且只能有一个;
public class Fu{
public Fu(){
System.out.println("父类构造方法!");
}
public Fu(int num){
System.out.println("父类重载构造方法!");
}
}
public class Zi{
public Zi(){
super();//首先必须调用父类构造方法,不写的话也会默认赠送
// super(20);//调用父类重载构造方法,只能调用一个super构造方法
System.out.println("子类构造方法!");
}
}
super关键字的三种用法
三种用法:
- 在子类的成员方法中访问父类的成员变量
- 在子类的成员方法中访问父类的成员方法
- 在子类的构造方法中访问父类的构造方法
this关键字的三种用法
- super关键字用来访问父类内容,this用来访问子类内容
三种用法: - 在本类成员方法中,访问本类的成员变量
- 在本类的成员方法中,访问本类的另一个成员方法
- 在本类的构造方法中,访问本类的另一个构造方法
(注意:this(…)调用也必须是构造方法的第一个语句,唯一一个)
(注意:super和this两种构造调用,不能同时使用)
public class Zi{
public Zi(){
//super();//有了this之后不能在使用super,系统也不会默认赠送了
this(20);//调用子类重载构造方法,只能调用一个重载构造方法
System.out.println("子类构造方法!");
}
public Zi(int num){
System.out.println("子类重载构造方法!");
}
super和this关键字内存图解
继承的三个特点
- java语言是单继承的,一个类只能继承一个父类;
- java语言可以多级继承;即C继承B,B继承A;
- 一个父类可以拥有很多个子类;
上一篇: @Autowired注入为null