系列文章目录
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
面向对象中的继承与多态问题
一、继承是什么
java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起·父子的关系。
public class B extends A{
}
其中的A类被称为父子类,也叫做基类或超类;
B类称为子类,也叫做派生类。
##1.继承的特点
子类继承父类的非私有变量(成员方法,成员变量)。
##2.继承后对象的创建
子类的对象是由子类和父类共同完成的。
##3.使用继承的好处
减少代码的重复编写,提高代码的复用性。
##4.继承相关注意事项
public(公开)
private(隐藏)
protected(缺省)
关于权限修饰符各自的作用]
java支持继承,但是单继承,java的类中不支持多继承,但支持多层继承
Object是java中所有类的祖宗。
方法重写
当子类觉得父类中的某个方法不好用的时候,或者无法满足自己需求的时候,子类可以重写一个方法名称,参数列表一样的方法,去覆盖掉父类的这个方法,这就是方法重写。
重写之后,java会遵循就近原则。
重写技巧:使用Override注解,他可以指定java编译器,检查我们重写的格式是否正确,代码可读性也会更好。
子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限。
重写方法的返回值类型,必须与重写的返回值类型一样或者范围更小。
私有方法,静态方法不能被重写。
子类访问其他成员的方法
按照就近原则
super关键字可以访问父类成员变量
public class Test {
public static void main(String[] args) {
//目标:掌握子类中访问其他成员的特点:就近原则
Z z=new Z();
z.showname();
z.showMethod();
}
}
package d13_extends_visit;
public abstract class F {
String name="父类名字";
public void print1(){
System.out.println("====父类中的print方法执行====");
}
}
package d13_extends_visit;
public class Z extends F {
String name="子类名称";
public void showname(){
String name="局部名称";
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
@Override
public void print1(){
System.out.println("子类方法被执行了");
}
public void showMethod(){
print1();
super.print1();
}
}
子类构造器的特点
子类中的全部构造器都会先调用父类的构造器,在执行自己的。
默认情况下,子类的第一行代码都是super,它会调用父类的无参构造器。
如果父类没有无参构造器,则我们必须在子类构造器的第一行手写一个super,指定去调用父类的的有参构造器。
this关键字可以调用兄弟构造器,去调用该类的其他构造器。
2.多态
多态是继承/实现情况下的一种现象,表现为:对象多态和行为多态。
People p1=new Student();
p1.run();
People p2=new Student();
p2.run();
多态的前提:
有继承和实现关系的;存在父类引用子类对象,存在方法重写。
多态强调对象和行为多态性,java中的属性(成员变量)不说多态。
多态的好处:
在多态形势下,右边对象是解耦合的,更利于扩展和维护。
但多态下不能使用子类的独有功能。
多态的类型转化
强制类型转化要注意存在继承实现关系就可以在编译阶段进行强制类型转换,编译后不会报错。运行时如果发现对象的真实类型与强转后的类型转换不同,就会报错。
强转前,java建议使用instanceof,判断当前对象的真实性,再进行强转。