1.接口(interface)
(1)接口的由来 当抽象方法中定义的成员方法全是抽象方法时,这是可以定义成接口
(2)解决了java中单继承的问题,对多继承进来了优化
a.类与类只能单继承,extends
b.接口与接口,可以单继承,也可以多继承
c.类与接口,可以单实现,也可以多实现,implements
(3)成员特点
a.只有成员变量和成员方法
b.成员变量 public static final(系统默认)
c.成员方法 public abstract (系统默认)
(4)接口的特点
a.接口是对外曝入的规则
b.接口是功能的扩展
c.侠义:Java中的接;广义:任何定义有规范的接口
(5)接口和抽象类的区别:
A:抽象类只能被单继承;接口可以被多实现。
B:抽象类中的成员:成员变量:可以是常量,也可以是变量。
成员方法:可以是抽象的,也可以是非抽象的。
构造方法:虽然不可以创建对象,但是可以给子类实例化用。
接口中的成员:成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象的。默认修饰符 public abstract
C:抽象类中定义的是体系结构中的共性的内容。
接口中定义的是对象的扩展功能。
D:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。
接口被实现表示的是: "like a"的关系。xx像yy中的一种。
学生:Student
A:属性:学号,姓名,年龄
B:方法:学习(study),吃饭(抽象eat),抽烟(是不是所有的学员都抽烟呢?),
篮球(是不是所有的人都会打篮球呢?)
分析:学员都具备学习的行为和吃饭的行为,但是并不是所有的学员都抽烟,也不是所有的学员都打篮球
interface Smoking {
public abstract void smoking();
}
interface Sport{
public abstract void playBasketBall();
}
描述的是即会抽烟又会打篮球的学生:SmokeStudent extends Student implements Smoking,Sport
一个类只能继承一个类,但是可以实现多个接口,每实现一个接口,功能就扩展了一部分
SmokeStudent ss = new SmokeStudent();
ss.eat();
ss.study();
ss.smoking();
ss.playBasketBall();
2:多态
(1)某一类事物的多种存在形态。
**方法重载(静态多态)
**方法重写(动态多态,对象多态)
(2)对象多态的前提
A:类与类(或接口)要有继承(或实现)关系。
B:一定要有方法的重写。
C:一定要有父类或者接口的引用指向子类的对象。Person p = new SuperMan();
SuperMan sm = (SuperMan)p;
(3)多态思想:可以指挥同一类型的一批对象做事情。多态的出现让我们复杂的问题简单化了。
A:Animal Cat Dog
**method(Animal a){a.eat();}//Animal a = new Cat();
(4)多态中成员的特点:(我们只研究特殊的,就是说名字一样的东西)
Fu f = new Zi();
A:成员变量:编译和运行都看Fu。
B:非静态方法:编译看Fu,运行看Zi。
C:静态方法:编译和运行都看Fu。
举例: 动物的例子:
向上转型
Animal a = new Cat();
a.eat();
//a.catchMouse();
向下转型
Cat c = (Cat)a;
c.eat();
c.catchMouse();
//向上转型
Animal a = new Dog();
//向下转型 转换异常
//Cat c = (Cat)a;
Dog d = (Dog)a;
超人的例子:
person :谈生意();
SuperMan:谈生意();fly();
Person p = new SuperMan();//超人没变身之前就是普通人一个,只能调用Person里的方法
//在运行的时候发现有SuperMan这个子类继承了他,会去看里面是否有和你调用Person里相同的方法
//如果有运行就执行子类重写的方法(成员函数的特性,覆盖)
p.谈生意();
SuperMan sm= (SuperMan)p;//内裤外穿,变身超人
sm.谈生意();
sm.fly();
总结:无论是向上转型还是向下转型,变化的都是子类对象,绝对不能把父类对象强转为子类类型