面向对象编程之继承、super关键字
继承
继承的思想是基于已存在的类来构建新类
在Java中,除Object类之外,所有类都是子类,都有唯一的父类
Java中用extends关键字表示继承
类之间的关系
Is-a 继承体现
Has-a 组合体现
Like-a 实现接口体现
继承的意义
代码重用
体现不同的抽象层次
父子类关系
父类更抽象,更一般
子类更具体,更特殊
super关键字
super代表的是父类对象的引用
当子父类的成员出现同名时,可以通过super来进行区分
子类的构造方法中,通过super关键字调用父类的构造方法(必须是子类构造方法第一条语句)
面向对象编程之方法重写、final关键字
方法重写(override)
方法重写是指子类可以根据需要对从父类继承来的方法进行改写,是多态机制的前奏
方法重写注意点:
重写方法必须和被重写方法具有相同的方法签名(方法名称、参数列表、返回值一样)
重写方法不能比被重写方法的访问权限低
父类中的私有方法不能被重写
在子类重写方法中继续调用父类被重写的方法可以通过调用super.函数名()调用
final关键字
final可以用来修饰变量、方法、类。
final修饰的变量是一个常量,一旦赋值就不能再修改。(常量一般都和static关键字配合使用)
final修饰类代表此类不能被继承。
final修饰方法代表方法不能被重写。
Demo:
public class TeacherDemo { public static void main(String[] args){ test1(); test2(); test3(); } public static void test1(){ B b=new B(); b.showA(); b.showB(); System.out.println("——————————————————————————————————"); } public static void test2(){ JavaTeacher javaTeacher = new JavaTeacher("张三","JavaSchool"); javaTeacher.teaching(); DBTeacher dbTeacher = new DBTeacher("王五","DBSchool"); dbTeacher.teaching(); System.out.println("——————————————————————————————————"); } public static void test3(){ C c = new C(); //c.number1=10;//编译出错,常量不能被修改 c.showNumber1(); //D d=new D(); //d.showNumber2(); final C c2 = new C();//c2不能再改变指向 c2.number2=20;//c2成员操作方法不变 c2.showNumber2(); System.out.println("——————————————————————————————————"); } } //继承测试1 class Teacher{ private String name; private String school; public Teacher(String name,String school){ this.name=name; this.school=school; } public void teaching(){ System.out.println(school+","+name+"老师 准备上课"); } } class JavaTeacher extends Teacher{ public JavaTeacher(String name,String school){ super(name,school);//调用父类的构造方法 } public void teaching(){ super.teaching(); System.out.println("Java教学"); } } class DBTeacher extends Teacher{ public DBTeacher(String name,String school){ super(name,school);//调用父类的构造方法 } public void teaching(){ super.teaching(); System.out.println("DB教学"); } } //继承测试2 class A{ public A() { System.out.println("构造函数A()"); } public void showA(){ System.out.println("父类showA"); } public void showB(){ System.out.println("父类showB"); } } class B extends A{//B类继承自A public B(){ super();//默认会加无参数构造方法,可省略 System.out.println("构造函数B()"); } public void showA(){ System.out.println("子类showA"); } public void showB(){ super.showB();//调用父类的showA方法 System.out.println("子类showB"); } } //final测试 class C{ public final int number1 = 1; public int number2 =2; public void showNumber1(){ System.out.println(number1); } public final void showNumber2(){ System.out.println(number2); } } class D extends C{//final class C 编译报错,final类不能被继承 //public void showNumber2(){//编译报错,final方法不能被重写 //System.out.println(number2); //} }
效果: