多态
1.引用多态:1)父类的引用可以指向本类的对象;2)父类的引用可以指向子类的对象
public static void main(String[] args) {
Animal obj1 = new Animal(); //父类的对象指向本类
Animal obj2 = new Dog(); //父类的引用可以指向子类的对象
//Dog obj3 = new Animal(); 不可以使用子类的引用指向父类
}
2.方法多态 1)创建本类对象时,调用的方法为本类方法;2)创建子类对象时,调用的方法为子类重写的方法或者继承的方法
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal obj1 = new Animal(); //父类的对象指向本类
Animal obj2 = new Dog(); //父类的引用可以指向子类的对象
//Dog obj3 = new Animal(); 不可以使用子类的引用指向父类
obj1.eat();
obj2.eat();
}
}
注意:如果是子类中独有的方法,则不能通过“父类的引用指向子类的对象”
3.引用类型转换
1)向上类型转换(隐式/自动类型转换)——小类型到大类型
2)向下类型转换(强制类型转换)——大到小
3)instanceof运算符,解决引用对象类型,避免类型转换的安全问题——判断某个类型是否是某个类型的子类型,返回一个bool值
Dog dog = new dog();
Animal animal = dog; //自动类型提升 向上转换
Dog dog2 = (Dog)animal; //向下类型转换
Cat cat = (Cat)animal;//强制类型转换Cat,编译器不会报错;但是animal对象在内存中是dog类型,强制转换成cat类型会造成类型不匹配——cat已经不是animal的子类型了
//使用instanceof
Dog dog = new Dog();
Animal animal = dog;
if(animal instanceof Dog){
Dog dog2 = (Dog)animal;
}else{
System.out.println("无法dog");
}
if(animal instanceof Cat){
Cat cat = (Cat)animal;
}else{
System.out.println("无法进行类型转换---");
}
4.Java中的抽象
1)语法定义:使用abstract修饰
2)场景:a)父类只是知道子类包含的方法,无法确切子类的方法如何实现——子类必须有那些方法;b)从多个具有相同特征类中抽象一个抽象类,以抽象类作为子类模版
3)作用:限制规定子类必须实现的某些方法,但不关注实现细节
4)使用规则:a.abstractd 定义抽象方法,只有声明,不需要实现;b.包含抽象方法的类是抽象类;c.抽象类中可以包含普通方法,也可以没有抽象方法;d.抽象类不能直接创建,可以定义引用变量
抽象类:
package com.imooc;
public abstract class Telephone {
public abstract void call();
public abstract void message();
}
子类1:
package com.imooc;
public class SmartPhone extends Telephone {
public void call() {
// TODO Auto-generated method stub
System.out.println("通过语音电话");
}
public void message() {
// TODO Auto-generated method stub
System.out.println("通过语音短信");
}
}
子类2:
package com.imooc;
public class CellPhone extends Telephone {
public void call() {
// TODO Auto-generated method stub
System.out.println("通过键盘电话");
}
public void message() {
// TODO Auto-generated method stub
System.out.println("通过键盘短信");
}
}
接口函数:
package com.imooc;
public class Initial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Telephone tel = new CellPhone();
tel.call();
tel.message();
Telephone tel2 = new SmartPhone();
tel2.message();
tel2.call();
}
}
5.Java中的接口
1)接口:接口定义了某一些类所遵循的规范,接口不关心类的内部数据,不关心类的方法实现细节,只规定类里必须提供的方法。
2)使用interface关键字,而类用class。接口中都是常量或抽象方法
3)接口用来被继承和被实现的,使用public,不能使用private和protect,interface前面使用abstract,abstract、public static final可以省略
public abstract interface IPlayGame {
public static final int a = 8;
public abstract void playGame(); // 不能 ...playGame(){};
}
注意:接口中方法不能有方法体 例如:错-void gg(){} 对-void gg();
定义接口:
public abstract interface IPlayGame {
public static final int a = 6;
public abstract void playGame();
}
继承接口:
public class psp implements IPlayGame {
public void playGame() {
// TODO Auto-generated method stub
System.out.println("具有玩游戏的功能");
}
}
转载于:https://blog.51cto.com/ankneo/1568007