面向对象编程之继承、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);
//}
}效果: