文章目录
继承
继承格式:子类 extends 父类
继承中,成员变量和成员方法的访问特点
当子类和父类的成员变量不重名:
总结:**看等号左边是谁,先调用谁中的成员 .**如果等号左边是父类类型,只能调用父类中的成员变量,如果等号左边是子类类型,既能调用子类的,还能调用父类中继承过来的非私有成员.
当子类和父类的成员变量重名:
总结:看等号左边是谁,先调用谁中的成员,子类没有,找父类
成员方法
成员方法:看new的是谁,就行调用谁中的方法,子类没有,就找父类.
方法的重写
概述:子类中有一个和父类方法名以及参数列表相同的方法
访问要求:看new的是谁,就先调用谁中的.如果new的是子类,调用子类重写的的方法,子类没有这个方法的话,就往父类找.
检测是否重写方法的注解:@Override
方法重写注意事项
- 子类重写父类方法的权限必须要大于等于父类权限
- 子类方法重写父类方法,方法名和参数列表一样
- 私有方法\构造方法\静态方法 不能被重写
- 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型???
方法重写的使用场景:功能改造,子类需要对父类中已经实现好的功能进行重写改造的时候使用.
final、Supre和this关键字
final关键字
final关键字是最终
的意思,可以修饰类,变量和方法.
修饰类:
该类就不能被继承修饰变量:
变量会变为常量,只能赋值一次,之后就不能改变了.final修饰的变量被称为常量.[常量名我们奋斗史大写的,常量一般我们会声明为static]
final关键字修饰变量
成员变量:
在定义的同时必须给出初始值局部变量:
可以在使用之前赋值
final关键字修饰方法
final修饰的方法,子类是不能重写该方法的!
super的使用方法
概述:super代表的就是父类的引用,作用是调用父类中的成员
使用方法:
a.调用父类构造方法-> 在子类中的构造中写
-
super() -> 调用父类无参构造
-
super(实参) -> 调用父类有参构造
b.调用父类成员变量:
-
super.成员变量名
c.调用父类成员方法:
-
super.成员方法名(实参)
//案例理解
public class Fu {
int num = 10;
public Fu(){
System.out.println("我是父类中的无参构造");
}
public Fu(int data){
System.out.println("我是父类中的有参构造");
}
public void method(){
System.out.println("我是父类中的method方法");
}
}
//===================================================
public class Zi extends Fu{
int num = 100;
public Zi(){
super();//调用父类中的无参构造
System.out.println("我是子类中的无参构造");
}
public Zi(int num){
super(10);//调用父类的有参构造
System.out.println("我是子类中的有参构造");
}
public void method(){
super.method();//调用父类的method方法
System.out.println("我是子类中的method方法");
System.out.println(num);//子类自己的
System.out.println(super.num);//调用父类的num
}
}
//==================================
public class Test01 {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println("============");
Zi zi1 = new Zi(10);
System.out.println("============");
Zi zi2 = new Zi();
zi2.method();
}
}
每个构造方法的第一行默认都会有一个Super( )
,不写jvm会自动提供一个super()
代表父类无参构造.
//案例理解
public class Fu { //父类
public Fu(){
System.out.println("我是父类中的无参构造");
}
}
public class Zi extends Fu{ //子类
public Zi(){
//super();
System.out.println("我是子类中的无参构造");
}
public Zi(int i){
//super();
System.out.println("我是子类中的有参构造");
}
}
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println("===========");
Zi zi1 = new Zi(10);
}
}
this的使用方法
概述:代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)
作用:
- 区分重名的成员变量和局部变量
- 调用当前对象中的成员
使用方法:
a.调用当前对象的构造:在构造中写
-
this():调用当前对象的无参构造
-
this(实参):调用当前对象的有参构造
b.调用当前对象的成员变量:
-
this.成员变量名
c.调用当前对象的成员方法:
-
this.成员方法名(实参)
//案例理解
public class Person {
int num = 10;
public Person(){
//this(10);
System.out.println("我是Person中的无参构造");
}
public Person(int data){
//super();super和this不能同时再构造中出现
this();
System.out.println("我是Person中的有参构造");
}
public void method(){
int num = 20;
System.out.println(num);//20
System.out.println(this.num);//10
this.method01();
System.out.println("我是Person类中的method方法");
}
public void method01(){
System.out.println("我是Person类中的method01方法");
}
}
//=======================================
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
System.out.println("========");
Person person1 = new Person(10);
System.out.println("========");
Person person2 = new Person();
person2.method();
}
}
继承的特点
1.继承只支持单继承,不能多继承
public class A extends B,C{} -> 错误
2.继承支持多层继承
public class A extends B{}
public class B extends C{}
3.一个父类可以有多个子类
public class A extends C{}
public class B extends C{}
4.构造方法不能继承,也不能重写
私有方法可以继承,但是不能被重写
静态方法可以继承,但是不能被重写