继承的基本介绍
继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性【变量】
和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类
不需要重新定义这些属性和方法只需要通过继承父类即可
语法
class 子类 extends 父类{
}
案例
public static void main(String[] args) {
B b = new B();
b.name = "jack";
b.dal;
}
class A{
public String name;
public void dal(){
System.out.println("父类的方法");
}
}
class B extends A{
}
继承的使用细节:
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问
但是私有属性不能再子类直接访问,需要通过公共的方法去访问子类必须调用父类的构造器,完成对父类的初始化
当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类
的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用
【super】去指定使用父类的哪一个构造器完成对父类的初始化工作如果希望指定调用父类的某个构造器,则显试的调用一下:super(参数列表);
super在使用时,必需放在构造器第一行
super() 和 this() 都找你放在构造器第一行,因此两个方法不能共存在一个构造器
JAVA所有类都Object类的子类
父类构造器的调用不限于直接父类,将一直往上追溯到Object类
子类最多只能继承一个父类(指直接继承),即JAVA中是单继承机制
不能滥用继承,子类和父类之间必须满足is-a的逻辑关系
细节案例
public static void main(String[] args) {
Son son = new Son();
//按查找规则返回信息
//先从子类开始查找,如果有并且可以访问,则返回
//如果子类没有就向上查找,如果父类有并且可以访问,则返回
//如果父类也没有继续向上访问,直到object
System.out.println(son.name);
System.out.println(son.getAge());
System.out.println(son.hobby);
}
}
class GrandPa{
String name = "金木研";
String hobby = "喰";
}
class Father extends GrandPa{
String name = "雾岛董香";
private int age = 18;
//如果不能访问私有属性或方法,就提供一个公有的属性或方法
public int getAge() {
return age;
}
}
class Son extends Father{
String name = "金雾";
}
super关键字基本介绍
代表父类引用,用于访问父类的属性,方法,构造器
基本语法
访问父类的属性,但不能访问父类的private属性
super.属性名;访问父类的方法,不能访问父类的private方法
super.方法名(参数列表);访问父类的构造器
super(参数列表); 注意只能放在构造器的第一句
案例
class A{
//属性
public String name;
//构造器
public A(String name){
this.name = name;
}
//方法
public void say(){
System.out.println("父类的say方法");
}
}
class B extends A{
public B(String name){
super(name);
}
public void say(){
System.out.println("子类的say方法");//和父类构成了重写
}
public void okj(){
//System.out.print(super.name);
super.say();;//super查找顺序直接查找父类,如果父类没有则继续向上查找
}
}
super给编程带来的便利和细节
- 调用父类构造器的好处,分工明确,父类属性由父类初始化,子类的属性由子类初始化
- 当子类中有和父类的成员【属性和方法】重名时,为了访问父类的成员,必须通过super
如果没有重名,使用super,this,直接访问是一样的效果 - super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员
如果多个基类【上级类】中都有同名的成员,使用super访问遵循就近原则,也需要遵守访问权限的相关规则
super 和 this 的区别为,一个是直接跳到父类开始查找,一个是从本类开始查找
方法(重写/覆盖)基本介绍
方法重写就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样那么我们就说子类的这个方法覆盖了父类的方法
案例
public static void main(String[] args) {
B b = new B();
b.aa();
}
class A{
public void aa(){
System.out.println("父类aa方法被子类重写");
}
}
class B extends A{
public void aa(){
System.out.println("子类重写父类的aa方法");
}
}
注意事项和使用细节
- 子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样
- 子类的返回类型和父类的返回类型一样,或者是父类返回类型的子类
比如:父类返回类型是Object ,子类返回类型是String - 子类方法不能缩小父类方法的访问权限,可以放大父类的访问权限