1. 父类(或超类)通常指直接上级,基类通常包括直接上级在内的“上级的上级”(即所有上级)。
2. public: 外界可自由访问;
private: 外界不可访问;
protected: 同一包中的子类都可以访问,另一包中的子类(派生于同一个父类)也可以访问;
default: 如果不指明任何权限,则默认同一包中的类可以访问;
3.构造函数的调用必须是构造函数中的第一个语句即通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句,否则出错
4.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造方法的作用就是初始化。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有啥变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
5.以final声明的方法不允许覆盖。以final声明的变量不允许更改
6.在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
7.方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。
package 继承与多态课件测验; class Person { String address; String name; int age; void introduce(){ System.out.print("姓名:"+name+",年龄:"+age); } } //default: 如果不指明任何权限,则默认同一包中的类可以访问; class Student extends Person{ void introduce(){ super.introduce(); System.out.println("住址:"+address); } } public class Test1 { public static void main(String[] args) { // 生成子类对象,调用子类的方法 Student a=new Student(); a.name="哈哈"; a.age=10; a.address="杭州市西湖区"; a.introduce(); // 生成父类对象,调用父类的方法 Person b=new Person(); b.name="哦哦"; b.age=20; b.address="北京市朝阳区"; b.introduce(); } }
生成子类对象,调用子类的方法,生成父类对象,调用父类的方法
覆盖方法的允许访问范围不能小于原方法。
(2)覆盖方法所抛出的异常不能比原方法更多。
(3)声明为final方法不允许覆盖。
例如,Object的getClass()方法不能覆盖。
(4)不能覆盖静态方法。(静态方法与静态变量一样是在写上static时就已经产生了而且唯一存在,不是在调用构造方法时产生的)
8.多态的最本质特征就是:子类对象可以被当成基类对象使用!父类(或接口)变量可以引用子类(或实现了接口的类)对象
子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行强制类型转换
其语法是:
子类对象变量=(子类名)基类对象名;
无关的两个类就是没有继承关系的两个类不能转换。
9.可以使用instanceof运算符判断一个对象是否可以转换为指定的类型
10.当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
package 继承与多态课件测验; class Parent2 { public int value=100; public void Introduce() { System.out.println("I'm father"); } } class Son extends Parent2 { public int value=101; public void Introduce() { System.out.println("I'm son"); } } class Daughter extends Parent2 { public int value=102; public void Introduce() { System.out.println("I'm daughter"); } } public class TestPolymorphism { public static void main(String args[]) { Parent2 p=new Parent2(); p.Introduce(); System.out.println(p.value); p=new Son(); p.Introduce(); System.out.println(p.value); p=new Daughter(); p.Introduce(); System.out.println(p.value); } }
11.有abstract修饰的类称为“抽象类”,它只定义了什么方法应该存在,不能创建对象,必须派生出一个子类,并在子类中实现其未实现的方法之后,才能使用new关键字创建对象。
在方法前加上abstract就形成抽象方法,只有方法声明,没有实现代码
一个抽象类中可以包含非抽象方法和成员变量。包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法
抽象类中的三种类型:
直接定义了一个抽象方法
继承了一个抽象父类,但没有完全实现父类包含的抽象方法
实现了一个接口,但没有完全实现此接口所包容的抽象方法
从抽象类继承的子类必须实现父类的所有抽象方法,否则,它仍然是抽象类
抽象类不能创建对象,一般用它来引用子类对象。
实例:(Peson为抽象类)
Person p;
p=new Employee();
抽象类 抽象类变量 = new 派生自抽象类的具体子类();
12.Java不支持多继承
在面向对象世界中,可以使用“接口(interface)”来抽象对象的行为特性。
public interface IFood {
public void Cook();
}
public class Duck extends Bird implements IFood{
public void Cook() {
……
}
……
}
interface OneInterface {
void f1();
}
interface TwoInterface extends OneInterface {
void f2();
}
定义一个接口,采用关键字interface,实现一个接口,采用关键字implements
接口的成员函数自动成为public的,数据成员自动成为
static和final的。
如果接口不声明为public的,则自动变为package。
一个类可以同时实现多个接口。
实现子接口的类,必须实现“父”“子”接口所定义的所有方法,才能被实例化(即new出一个对象)
public interface ArrayBound {
public static final int LOWBOUND=1;
public static final int UPBOUND=100;
}
只要一个类声明实现了这个接口,就可以直接使用这些常量名
在实际开发中,这种编程方式非常常见。
注意:定义在接口中的常量必须被初始化!
抽象类是一个不完全的类,而接口只是表明类应该具有哪些“外部”特征,不涉及任何实现细节。
接口基本上不具备继承的任何具体特点,它仅仅承诺了外界能够调用的方法。
一个类一次可以实现若干个接口,但一个类只能继承一个父类。