多态的概念
一个对象可以被多个类型引用,因而不同类型的引用变量可以以不同的形式引用对象里的方法
//example //子类Student 父类Person //父类有方法talk //子类有方法talk(对父类方法talk的重写)和方法laugh Student s1=new Student(); Person s2=new Student(); Object s3=new Student(); s1.talk(); //可运行,而且talk经过了Student子类的重写 s2.talk(); //倘若子类中的talk没有重写,则使用的就是父类方法talk内的方法体内容,若已经被重写,则使用的是子类中被重写的方法体内容 s2.laugh(); //不可编译,如需编译则需要进行类型的强制转换,即向下转型,见下面内容
对象可以执行哪些方法,与左边的类型有关,和右边的对象关系不大
多态是方法的多态,和属性无关
提一嘴:如果方法是1. static类型 2. final常量 3. private方法,则无法进行重写,也自然不存在多态
类型转换
向上转型
代码例子
class Person{ public void run(){ ... } } class Student extends Person{ public void teach(){ ... } } public class Application{ public static void main(Strimg[] args){ Student student = new Student(); //此时子类的引用指向子类的对象(即Student类型) Person person=student; //此时将子类的引用向上转换为父类的引用person,不需要强制转换,即由Student类型 } }
向下转型
class Person{ public void run(){ ... } } class Student extends Person{ public void teach(){ ... } } public class Application{ public static void main(Strimg[] args){ Person person = new Student(); //此时父类的引用指向子类的对象(即Person类型) //如果person想要使用Student类中的方法,就得需要进行向下转型,即强制转为Student类型的引用变量 (Student)person.teach(); //可以直接转换后使用子类的方法teach //或者用"Student std=(Student)person;"语句重新设置一个person引用给std赋值的语句,然后直接用std.teach();进行使用 } }
- 注意!父类向子类向下转型可能会丢失一些方法,因此不建议随意的向下转型
instanceof
- instanceof 实际上是在判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。
- instanceof 无法让两个同级的类进行比较和转换
- instanceof 编译通过的条件是:X instanceof Y----X和Y有父子关系
多态的用处
- 方便方法的调用,减少重复代码,使其变得简洁
抽象概念
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但是由抽象方法的类一定要声明为抽象类。
- 抽象类不存在用new关键字来创建对象,它是用于给子类进行继承的。
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
- 子类继承抽象类,那么必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
- 抽象类里面可以书写非抽象方法。
- 抽象方法不需要书写方法体。
普通类,抽象类和接口的区别。
- 普通类:只有具体的实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范(抽象方法),即无法在自己的内部写方法体
接口的概念
- 接口所定义的是一组规则,可以跟我们生活中的法律一起比较
- 面向对象的精髓是对对象的抽象,而最能体现这一点的就是接口。
接口的声明
用interface来声明一个接口
用class来声明一个类
多继承
- 普通类和抽象类都使用extends来进行父子类继承,但是接口和其他类则采用implements来进行继承,继承后可以对接口内的方法进行重写和使用。
// 普通类 extends 抽象类或者普通类 implements 接口 // 这样就可以实现多继承了
接口的一些注意点
- 接口中的方法是默认以"public abstract "为修饰词的
- 接口中的一些属性是以常量的形式存在的,而且被分配在静态区中,默认为"public static final"为修饰词的。
- 接口起到的是约束的作用
- 接口可以定义一些方法,然后让不同的人对其实现
- 接口不能被实例化,因为其接口中没有构造方法
- implements可以实现多个接口
- 接口中的方法必须在其他类中进行重写