接口的应用
暴露的规则 使用规则 实现规则
这些设备和电脑的耦合性降低了
interface USB //暴露的 规则
{
public void open();
public void close();
}
class BookPC
{
public static void main(String[] args)
{
useUSB(new UPan());
useUSB(new UsbMouse());//功能拓展了
}
//使用规则
public static void useUSB(USB u)//接口类型的引用,用于接收(指向)接口的子类对象
{
u.open();
u.close();
}
}
//一年以后----------
//实现规则
//这些设备和电脑的耦合性降低了
class UPan implements USB
{
public void open()
{
System.out.println("upan open");
}
public void close()
{
System.out.println("upan close");
}
}
class UsbMouse implements USB
{
public void open()
{
System.out.println("Mouse open");
}
public void close()
{
System.out.println("Mouseclose");
}
}
多态
定义:某一类事物的多种存在形态。
例:动物中猫,狗。
猫这个对象对应的类型是猫类型:猫 x = new 猫();
同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象。
多态性简单说就是一个对象对应着不同类型。
一个多态对应着不同类型
多态在代码中的体现
多态
好处: 提高了代码的扩展性,前期定义的代码可以使用后期的内容
弊端:前期定义的内容不能使用(调用)后期子类的特有内容
前提:
1, 必须有关系,继承,实现
2,有覆盖
/*多态
好处 提高了代码的扩展性,前期定义的代码可以使用后期的内容
弊端:前期定义的内容不能使用(调用)后期子类的特有内容
前提:
1,必须有关系,继承,实现
2,有覆盖
*/
abstract class Animal
{
abstract void eat();
}
class Dog extend Animal
{
void eat()
{
System.out.println("啃骨头");
}
void lookHome()
{
System.out.println("看家");
}
}
class Cat extend Animal
{
void eat()
{
System.out.println("吃鱼");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
// Cat c=new Cat();
// Dog d=new Dog();
// method(new dog());
Animal a=new Cat();/* 自动类型提升,猫对象提升了动物类型,但是特有功能无法访问
作用就是限制对特有功能的访问
专业讲:向上转型
*/
a.eat;
//如果还想用具体动物猫的特有功能
//你可以将该对象进行向下转型
Cat.c=(Cat)a;//向下转型的目的是为了使用子类中的特有方法
c.eat();
c.catchMouse();
//注意:对于转型,自始至终都是子类对象在做着类型的变化
}
public static void method(Animal a)
{
a.eat;
}
}
注意:
instanceof :用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性的判断。
多态时,成员的特点
1,成员变量
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败
运行时,参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量
简单说:编译和运行都参考等号左边
2,成员函数(非静态)
编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过,没有,编译失败
运行时:参考的是对象所属的类中是否有调用的函数
简单的说:编译看左边,运行看右边
3,静态函数
编译时:参考引用型变量所属的类中的是否有调用的静态方法
运行时:参考引用型变量所属的类中的是否有调用的静态方法
简单说,编译和运行都看左边
其实对于静态方法,是不需要对象的,直接用类名调用
/*多态时,成员的特点
1,成员变量
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败
运行时,参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量
简单说:编译和运行都参考等号左边
2,成员函数(非静态)
编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过,没有,编译失败
运行时:参考的是对象所属的类中是否有调用的函数
简单的说:编译看左边,运行看右边
3,静态函数
编译时:参考引用型变量所属的类中的是否有调用的静态方法
运行时:参考引用型变量所属的类中的是否有调用的静态方法
简单说,编译和运行都看左边
其实对于静态方法,是不需要对象的,直接用类名调用
*/
class Fu
{
// int num=3;
void show()
{
System.out.println("fu show");
}
static void method()
{
System.out.println("fu static method");
}
}
class Zi extends Fu
{
// int num=4;
void show()
{
System.out.println("zi show");
}
static void method()
{
System.out.println("zi static method");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
Fu f=new Zi();
f.method();
//f.show();
//System.out.println(f.num);
}
}