1多态性:即:对象的多态性。对象属于子类,同时也属于父类。(我是人,然后才是中国人)
2写法格式:父类名称 对象名=new 子类名称();或 接口名称 对象名=new 实现类名称();
也就是父类引用指向子类对象 翻译:一个中国人被当做人来看待
3多态成员变量的访问特点:(重名状态下)
1直接通过对象名查找成员变量:看等号左边是谁,就从谁的类里面找,没有则向上查找
2间接通过成员方法查找:new的是谁就从谁找,覆盖重写后从覆盖重写处找
4多态中成员方法的使用特点:编译错误看等号左边找原因,运行成功看等号右边找结果
5多态的作用:以老板的眼光看员工:我不管你是属于什么工种,我只知道你是我的员工
所以调用方法的时候,左边的“员工父类”都不用变。员工 名字=new 工种
6对象的转型:1向上转型(就是一个多态):父类名称 对象名=new 子类名称();
等号右侧创建一个子类对象当做父类来看待,向上转型一定是安全的
2向下转型(还原操作):子类名称 对象名=(子类名称)父类对象,
从哪来回哪去,从哪个子类向上的,就必须向下还原到那个子类。否则
就会出现运行错误classcast exception“类转换错误”(但编译不会提示有错误)
7instance of关键字:格式 :对象名 instanceof 类名称 其结果是一个布尔值。判断是不是从后面
的类中所向上转型而来的。假如实现方法需要一个animal参数,而我们并
不知道animal具体是什么的时候,就需要instanceof关键字对传入参数进行
判断,然后再执行相对应的方法
案例1 笔记本电脑的usb接口
//创建一个电脑类 电脑类使用USB接口
package ComputerUSB;
public class LapTop {
public void poweron(){
System.out.println("打开电脑");
}
public void poweroff(){
System.out.println("关闭电脑");
}
public void shiYongSheBei(USB usb){
//注意!是将usb接口父类传进来。因为电脑并不需要知道要用的具体是哪个设备
usb.open();//打开设备
if(usb instanceof Mouse){//判是否来自Mouse实现类?
Mouse mouse=(Mouse)usb;//是,将该usb参数向下转型
mouse.click();//调用方法
}else if (usb instanceof KeyBoard){//判是否来自Keyboard实现类?
KeyBoard keyBoard=(KeyBoard)usb;//是,将该usb参数向下转型
keyBoard.type();//调用方法
}
usb.close();//关闭设备
}
}
//创建USB接口并定义其中的抽象方法
package ComputerUSB;
public interface USB {
//此处用抽象类方法,因为不知道具体是哪个设备
public abstract void open();//打开设备
public abstract void close();//关闭设备
}
//创建鼠标实现类,并从USB中覆盖重写抽象方法
package ComputerUSB;
public class Mouse implements USB {
@Override
public void open() {
System.out.println("打开鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
public void click() {
System.out.println("点击鼠标");
}
}
//创建键盘实现类,并从USB中覆盖重写抽象方法
package ComputerUSB;
public class KeyBoard implements USB {
@Override
public void open() {
System.out.println("打开键盘");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
public void type() {
System.out.println("键盘输入");
}
}
//执行代码
package ComputerUSB;
public class Demo01Computer {
public static void main(String[] args) {
LapTop computer=new LapTop();
computer.poweron();
USB mouseusb=new Mouse();//将mouse类向上转型,以备LapTop进行调用
computer.shiYongSheBei(mouseusb);
KeyBoard keyBoard=new KeyBoard();
computer.shiYongSheBei(keyBoard);
/*此处keyboard实现类可以直接调用,因为keyboard参数是属于(小于)接口USB的,
所以电脑自动对keyboard进行了安全的向上转型*/
computer.poweroff();
}
}
二、final关键字(可以修饰:1类2方法3局部变量4成员变量)
1final用来修饰类:public final class 类名称{ };含义:当前类不能有任何子类,因此其中的所有
方法也不能进行覆盖重写(abstract和final冲突)
2final用来修饰成员方法:public final 返回值类型 方法名称(参数列表){ };该方法就是一个
最终方法,不能进行覆盖重写(abstract和final冲突)
3final用来修饰局部变量:final 数据类型 数据名称=变量值 那么一次赋值 终生不变
注:当此时的数据类型为基本数据类型时,其中的数值永不变。
但是当数据类型为引用类型时,不能改变的是其中的地址值,
然而地址值中存储的数据还是可以改变的
4final用来修饰成员变量:1由于成员变量具有默认值,所以用了final之后必须手动赋值
2final成员变量可直接赋值,或通过构造方法赋值,二者选其一
5四种权限修饰符的调用范围:
6每种类所能使用的修饰符:外部类:public;(default)
成员内部类:public;protected;(default);private
局部内部类:什么都不能写