继承
一.继承的定义,为什么继承
1.通过拓展一个类来建立另外一个类的过程称为继承,java中所有的类都来源于"一个神通广大的类"Object.
2.在继承中,子类就是一个父类
3.通过继承不仅可以拓展父类功能,也可以实现代码复用(不同子用父的方法)
4.继承中的注意事项
0.子类方法访问父类私有变量时,必须调用父类方法.
总结:
成员变量不重名,子方法引用一个成员变量时,是谁的,就用谁的,没有往上找,如果是私有的,调用要用相关方法调用
成员变量重名时,使用this supper来进行区分,当涉及到私有时,要使用相应的方法来调用
成员方法不重名是,子类调用一个方法时,是谁的,就用谁的,没有往上找,如果是私有方法,实践证明,子类无法调用
成员方法重名,可以使用super this关键字进行区分,如果没有,离谁近就调用谁
父类拥有变量如果是私有变量,可以通过 本类中构造方法 本类中get set或者本类中其它方法来进行访问
本类中的私有变量,可以直接使用变量名 或this.变量名 或方法(getter 或其它)来进行使用
关于子类的构造方法
在子类的构造方法中,一定要先有父类的构造方法,如果没有,默认在第一行有父类默认构造方法
如果父类的成员变量都是私有变量,则第一行父类构造方法就显得尤为重要,因为子类无法访问父类成员变量,如果父类没有带参数的构造方法,而子类有带参构造,那么在该带参构造中只能调用父类setter方法## 标题
继承使代码简化,但并没有简化空间,因为每个子类创建时都会创建父类空间,而不是共用父类空间
(1)public double getSalary()
{
double baseSalary=super.getSalary(); //此处一定要加supper,否则会成为死循环
return baseSalary+bonus;
}
(2)子类访问父类的私有变量时只能使用父类的方法
public double getSe(){
double baseSalary=salary+bonus; //报错salary has private method
return baseSalary+bonus;
}
(3)私有变量在本类中的三种访问方法
private double bonus;
直接访问 或this.bonus 或this.getbonus
(4)父类中的非私有变量可以直接访问
public double gTest(){
double baseSalary=test+bonus; //test是父类中的变量
return baseSalary+bonus;
}
二.继承的写法
1.
```java
class 父类 {
...
}
class 子类 extends 父类 {
...
}
2.访问成员变量
(1)直接通过子类访问成员变量,如果遭遇重名,等号左边是谁,就优先用谁的,如果没用,向上找
(2)通过方法间接访问成员重名变量,则该方法隶属于谁,访问谁的成员变量
(3)当 父 子 局部重名时
2.成员方法重名
是谁的,就用谁的,如果没有,就向上找
三.方法的重写(覆盖)
1.定义
在继承中,方法的名称一样,参数列表页一样
2.写法
3.注意事项
(1)子类方法的返回值范围必须小于等于父类方法的返回值范围(辈分) object最大
(2)子类方法的权限必须大于等于父类方法的权限
public>protected>(default)>private
四.supper与this
1.supper用法
> ![这里是引用](https://img-blog.csdnimg.cn/7536ba4d4d2e46ea8559e971366659a4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5byI5biI5Lqm5Y-L,size_20,color_FFFFFF,t_70,g_se,x_16)
2.
```java
/*
super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种:
1. 在本类的成员方法中,访问本类的成员变量。
2. 在本类的成员方法中,访问本类的另一个成员方法。
3. 在本类的构造方法中,访问本类的另一个构造方法。
在第三种用法当中要注意:
A. this(...)调用也必须是构造方法的第一个语句,唯一一个。
B. super和this两种构造调用,不能同时使用。
*/
public class Zi extends Fu {
int num = 20;
public Zi() {
// super(); // 这一行不再赠送
this(123); // 本类的无参构造,调用本类的有参构造
// this(1, 2); // 错误写法!
}
public Zi(int n) {
this(1, 2);
}
public Zi(int n, int m) {
}
public void showNum() {
int num = 10;
System.out.println(num); // 局部变量
System.out.println(this.num); // 本类中的成员变量
System.out.println(super.num); // 父类中的成员变量
}
public void methodA() {
System.out.println("AAA");
}
public void methodB() {
this.methodA();//this可以不写,起强调作用
System.out.println("BBB");
}
}
3,内存图