Java学习笔记【继承之类、超类、子类】

1、继承

关键字extends表示继承,表明正在构造的新类派生于一个存在的类。
    class Manager extends Employee
    {
       ....
    }
Java中,所有的继承都是公有继承。而C++中还有私有继承,保护继承。
已存在的类称为超类、基类或父类;新类称为子类、派生类。
子类往往比父类拥有更加丰富的功能。

子类方法和父类方法同名时,称为方法的覆盖(override)。
使用超类中的方法使用super关键字:
super.getSalary();  //调用父类中方法
super在子类构造器中的应用:
    class Manager extends Employee
    {
        public Manager(String n ,double s)
        {
          super(n, s);     //实际上调用父类中的构造器
        }
    }
一个对象变量可以指示多种实际类型的现象被称为多态。
在运行时能够自动地选择调用哪个方法的现象被称为动态绑定。

2、继承层次

一个公共类派生出来的所有类的集合被称为继承层次。
继承链的概念:某个特定的类到其祖先的路径。
Java不支持多继承。

3、多态

置换法则:
例如:可以将一个子类的对象赋给超类变量:
    Employee e;
    e = new Employee(...);
    e = new Manager(...); 
以上都是合法的。
在Java中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象。

置换法则的优点:
    Manager boss = new Manager(...);
    Employee[] staff = new Employee[3];
    staff[0] = boss;
编译器将staff[0]看成Employee对象。意味着可以这样调用:
    boss.setBonus(5000);//OK
    staff[0].setBonus(5000);//不OK

4、动态绑定

如果是private 方法、static方法、final方法或者构造器,那么编译器可以准确的知道应该调用那个方法。此称之为“静态绑定”。
调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
动态绑定有个重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。

5、阻止继承:final类和方法

不允许扩展的类称为final类。声明格式如下:
    final class Executive extends manager
    {
        ...
    }
类中的特定方法也可以声明为final。若果这样做,子类就不能覆盖这个方法了:
    class Employee
    {
        ...
        public final String getName()
        {
            return name;
        }
        ...
    }
设成为final方法或类主要目的为:确保他们不会在子类中改变语义(阻止继承,不允许对子类对final方法或final类处理)。

6、强制类型转换

转换实例:
Manager boss = (Manager) staff[0];
判断能否转换:
    if(staff[1] instancof Manager)
    {
        boss = (Manager)staff[1];
        ...
    }

7、抽象类

使用abstract关键字,实例:
    abstract class Person
    {
        private String name;

        public Person(String n)
        {
            name = n;
        };

        public abstract String getDescription(); //抽象方法

        public getName()
        {
            return name;
        };
    }
抽象类不能实例化!表达式 ***new Person("asasf");***是错误的。

可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。例如:
    Person p = new Student("ABC","CBA");   //子类student的对象变量。
通过抽象类Person扩展一个具体的子类Student:
    class Student extends Person
    {
        private String major;

        public Student(String n, String m)
        {
            super(n);
            major = m;
        }

        public String getDescription()
        {
            return "a student majoring in" + major;  //子类中定义了getDescription()方法,所以Student类中全部方法都是非抽象方法。
        }

    }

8、受保护访问

最好将类中的域标记为private,而方法标记为public。
有些时候,人们希望超类中某些方法允许子类访问,或允许子类的方法访问超类的某个域。为此要将方法或类声明为protected。

Java用于可见性的4个访问修饰符:
1)仅对本类可见————private。
2)对所有类可见————public。
3)对本包和所有子类可见————protected。
4)对本包可见————默认,即不需要修饰符。

你可能感兴趣的:(Java学习笔记)