一. 多态
1. 子类的对象可以直接赋值给父类的引用,但是父类的对象不能直接赋值给子类的引用
2. 如果将子类对象赋值给了父类的引用,那么这个引用只能看到(访问到)父类里面有的属性和方法,对于子类里面新加的属性和方法不能访问到(不能看到)
3. 调用子类新加的方法和属性需要强制类型转换
/*
Student stu = new Student();
Person p = new Person();
p = stu;
p.sing();
*/
/*
Person p = new Student(); ----子类对象直接赋值给父类引用
p.sing();
*/
/*
Student stu = new Student();
Person p = new Person();
stu = p;
stu.sing();
*/
Person p = new Student();
((Student)p).drink(); ----------强制类型转换 需要括号
强制类型转换:
1. 父子之间可以用强制类型转换,兄弟之间不能用强制类型专家会抛出一个异常(classcastexception)
2. 在同一个类型下可以直接赋值
3. 强制类型转换的类型
向上的类型转换(upcast): 把子类对象赋值给一个父类的引用,不需要写前面的强制类型转换-也有人称为隐式类型转换
向下的类型转换(downcast):把父类的引用转化为子类的引用,必须要自己手写强制类型转换
4. 在编译的时候只检测类型是否匹配,不检测当前的父类引用到底指向了哪个子类
Person p = new Student();
Student stu = (Student)p;
Person p1 = new Teacher();
//stu = (Student)p1; 错误的
p = p1;
p.sing();
class Person {}
class Student extends Person{}
class Teacher extends Person{}
二。抽象类:使用了 abstract 关键字所修饰的类叫做抽象。 抽象类无法实例化,也就是说不能 new 出来一个抽象类 。
1. 抽象的方法 -- 用来规范子类的行为 --做父类
2. 抽象的方法必须要用abstract 修饰
3. 抽象的方法没有方法体
4. 抽象类的子类必须要取实现抽象类的抽象方法
5. 抽象类里面可以有抽象方法,也可以有具体的方法,但是具体的类里面不能有抽象的方法
6. 子类如果是抽象类,那么你可以不用实现父类里面的抽象方法,如果不是抽象类那么必须要实现
abstract class Fruit ---抽象类
{ public abstract void down();
}
三。接口:接口的地位等同于 class 接口中的所有方法都是抽象方法 。声明方法都用 abstrct 修饰 但都省略不写。
1. 定义接口的时候不能在使用class关键字了,只能使用interface
2. 接口里面所有的方法都是abstract的,但是我们一般在写接口里面的方法的时候都会省略abstract关键字
3. 接口里面的方法没有方法体
4. 接口的实现使用的是implements(实现),而abstract的实现用的是extends(继承)
public interface PersonInterface
{
public void eat();
public void sing();
}
如果一个类实现多个接口的时候,接口与接口之间用逗号来分割
抽象类和接口里面都可以定义成员变量,但是接口里面定义的变量必须要初始化并且一旦初始化以后就不能修改了(全是常量)
public class LianXi implements Person,Student