目录
认识
:java中提供了一个关键字extends,用这个关键字可以让一个类和另一个类建立起父子关系
public class B extends A{
}
(A类为父类,B类为子类)
特点:子类能继承父类的非私有成员(成员变量、成员方法)
继承后对象的创建:子类的对象是由子类,父类共同完成的。
带继承关系的类,java如何创建它的对象?
java会用类和其父类这多张设计图来一起创建类的对象。
对象创建出来后,可以直接访问哪些成员?
对象能直接访问什么成员是由子类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员。
继承的好处
减少重复代码的编写
public class People {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Teacher extends People{
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public void printInfo(){
System.out.println(getName() + "具备的技能:" + skill);
}
}
package com.itheima;
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("播仔");
t.setSkill("Java、Spring");
System.out.println(t.getName());
System.out.println(t.getSkill());
t.printInfo();
}
}
继承相关注意事项:
权限修饰符
就是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。
修饰符 | 在类中 | 同一个包下的其他类里 | 任意包下的子类里 | 任意报下的任意包里 |
private | y | |||
缺省 | y | y | ||
protected | y | y | y | |
public | y | y | y | y |
private<缺省 <protected<public
单继承,object
java是单继承的,java中的类不支持多继承,但是支持多层继承。
object类是java所有类的祖宗类。我们写的任何一个类,其实都是object的子类或子孙类
方法重写
- 当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父亲的这个方法,这就是方法重写。
- 注意:重写后,方法的访问,java会遵循就近原则。
其他注意事项:
- 重写小技巧:使用Override注解,它可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
- 子类重写父类方法时,访问权限必须大于或者等于父亲该方法的权限(public>protected>缺省)
- 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
- 私有方法、静态方法不能被重写,如果重写会报错的。
子类中访问其他成员的特点
在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。
- 先子类局部范围找。
- 然后子类成员范围找。
- 然后父亲成员范围找,如果父亲范围还没有找到则报错。
如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办?
可以通过super关键字,指定访问父亲的成员:super.父亲成员变量/父亲成员方法。
子类构造器特点
子类的全部构造器都会先调用父亲的构造器,再执行自己。
子类构造器是如何实现调用父亲构造器的:
- 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),它会调用父亲的无参数构造器。
- 如果父亲没有无参数构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父亲的有参数构造器。
super(...)调用父亲有参构造器的常见应用场景:
为对象中包含父类这部分的成员变量进行赋值。
子类构造器可以通过调用父亲构造器,把对象中包含父亲这部分的数据先初始化赋值,再回来把对象里包含子类这部分的数据也进行初始化赋值。
补充知识:this(...)调用兄弟构造器
任意类的构造器中,都可以通过this(...)去调用该类的其他构造器。
this(...)的作用:
在构造器中调用本类的其他构造器。
this(...)和super(...)都必须放在构造器的第一行。