多态对象的多中形态
1.引用的多态
1.父类的引用可以指向本类的对象
2.父类的引用可以指向子类的对象
2.方法的多态
1.创建本类对象时,调用的方法为本类的方法。
2.创建子类对象时,调用的方法为子类重写的方法或继承的方法
父类
package com.imooc;
public class Animal {
public int age=10;
public String name;
public void eat(){
System.out.println("动物具有吃的能力");
}
}
子类
package com.imooc;
public class Dog extends Animal {
public int age=20;
public void eat(){
System.out.println("狗爱吃骨头");
}
public void method(){
System.out.println(age);
System.out.println(super.age);
}
}
主方法
package com.imooc;
public class Initial {
public static void main(String[] args) {
Animal obj1=new Animal(); //父类的引用可以指向本类的对象
Animal obj2= new Dog(); //父类的引用可以指向子类的对象
obj1.eat(); //调用本类中的方法
obj2.eat(); //调用的方法为子类重写的方法或继承的方法
obj2.method();//不能调用子类中独有的方法 ,错误写法
}
}
3.多态中引用类型的转换
1.向上类型的转换,是小类型向大类型转换
2.向下类型的转换,是大类型向小类型转换存在一定的风险。
通常会用instanceof关键字来判断是否包含某种类型,返回一个boolean值
package com.imooc;
public class Initial {
public static void main(String[] args) {
Dog dog=new Dog();
Animal animal=dog;//向上类型的转换
Dog dog2=(Dog)animal;//向下类型转换,强制转换
if(animal instanceof Cat){
Cat cat=(Cat)animal;
}else{
System.out.println("无法进行类型转换");
}
}
}
4.抽象类
抽象类前使用abstract关键字修饰的类,为抽象类
抽象类的作用:限制规定子类必须实现某些方法,但不必关注细节
1.应用场景
1.在某些情况下,某个父类只知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
2.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类一个模板,从而避免了设计子类的随便性
3.使用规则
a.abstract定义抽象类
b.abstract定义抽象的方法,只有声明,不需要实现。
c.包含抽象方法的类是抽象类。
d.抽象类中可以包含普通的方法,也可以包含抽象方法
e.抽象类不可以直接创建,可以定义引用变量。
5.接口
接口可以理解为一种特殊的类,由全局常量和公共抽象方法组成。
类是一种具体的实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法实现细节,它只规定这些类里必须提供某些方法
1.接口的定义
和类的定义不同,接口的定义不在使用class关键字,而是使用interface关键字。
2.接口的基本语法
注意:接口一般是用来被继承和被实现的,修饰符一般用public,接口中的1.属性是常量,即使定义时不添加 public static final ,系统也会自动加上。
2.接口中的方法只能是抽象方法,在使用时即使不添加public abstract ,系统也会自动加上。
3.接口也是抽象的在修饰符后面需要加上abstract,如果不加系统会给我们自动加上。
3.使用接口
一个类可以实现一个或多个接口,实现一个接口用implements关键字,java中一个类只能继承一个父类,不够灵活,通过多个接口可以做补充。
4.抽象类图形分析
可以定义一个Telphone抽象类,用CellPhone和Smartphone继承抽象类。
抽象类
package com.xhouxiang;
public abstract class TelePhone {
public abstract void message();
public abstract void tell();
}
CellPhone继承
package com.xhouxiang;
public class CellPhone extends TelePhone {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过键盘发短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通过键盘打电话");
}
}
SmartPhone继承
package com.xhouxiang;
public class SmartPhone extends TelePhone {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过语音发短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通过语音打电话");
}
}
主函数
package com.xhouxiang;
public class initialmian {
public static void main(String[] args) {
// TODO Auto-generated method stub
CellPhone obj1=new CellPhone();
SmartPhone obj2=new SmartPhone();
obj1.message();
obj1.tell();
obj2.message();
obj2.tell();
}
}
5.接口图形化分析
智能手机也可以玩游戏,Psp也可以玩游戏,PsP不能继承TelPhone这个类,只有写一个接口让他们各自实现。
接口
package com.xhouxiang;
public interface InterPlaygame {
public void playgame();
}
智能手机玩游戏
package com.xhouxiang;
public class SmartPhone extends TelePhone implements InterPlaygame {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过语音发短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通过语音打电话");
}
@Override
public void playgame() {
// TODO Auto-generated method stub
System.out.println("智能手机打游戏");
}
}