接口interface:
父类可以看做父亲;接口,抽象类可以看做师父;父亲只有一个,师父可以有多个
可以从师父那扩展更多的功能。
接口好似一个特殊的抽象类。当抽象类中的方法都抽象时,可以将该类定义成另一个表现形式就是接口。
接口中的成员,最常见的有两种
1,变量。有固定的修饰符,public static final,其实是一个全局常量
2,函数,抽象的。public abstract——子类复写只能公有权限public
这些修饰符都是固定的。写上就是显示的,不写就是隐式的!但最好写上
接口不可以实例化,因为有抽象方法
子类必须覆盖所有的抽象方法后,子类才可以实例化,否则子类就是一个抽象类
类与类之间是继承extends关系
类与接口之间是实现implements关系
接口的出现可以解决多继承的问题,通过多实现的方式对多继承进行改良
多继承中不确定性的产生是由于父类中方法的方法体导致结果可能不同
多实现,一个类同时实现多个接口
接口的出现--多实现也避免了单继承的局限性,一个类在继承一个类的同时还可以去实现多个接口
1.1.2. 接口思想
1.接口的出现可以提高功能的扩展性
2.接口的出现是对外暴露的规则
3.接口的出现降低了耦合性(紧密联系程度)
举例:
USB接口,插座,
接口的出现就有两方,一方在使用接口,一方在实现接口
笔记本电脑在使用接口,其他设备在实现接口被笔记本电脑使用
笔记本电脑是不需要知道具体的USB设备是什么
所以笔记本和外围设备之间的耦合性降低了
1.1.3. 接口与抽象类
/*
接口与抽象类:
1,抽象类中可以包含抽象方法和非抽象方法,接口中只能定义非抽象方法
2,抽象类只能被继承,而且只能是单继承,接口可以被实现,而且可以被多实现
3,类与类之间世纪城关系,而且存在所属关系is a;
类与接口之间存在实现关系,关系是:like a
相同之处:
都是向上抽取而来的
类描述共性内容,接口描述额外功能
举例:
犬--搜爆犬,导盲犬
abstract class 犬
{
public abstract 吼叫();
}
interface 搜爆ablity
{
public abstract void 搜爆();
}
interface 导盲ability
{
public abstract void 导盲();
}
class 搜爆犬 extends 犬 implements 搜爆ability
{
//犬本有功能
public void 搜爆(){}
}
class 超级犬 extends 犬 implements 搜爆ability,导盲ability
{
//犬本有功能
public void 搜爆(){}
public void 导盲(){}
}
class 搜爆机器人 extends 机器人 implements 搜爆ability
{
//机器人本有功能
public void 搜爆(){}
}
*/
1.2. 多态
这里所学的是对象的多态性,函数的重载就是函数的多种形态(多态)。
1.2.1. 多态在程序中的体现:
接口的引用指向了自己的子类对象。
多态:父类引用指向子类对象,子类对象就被提升为父类型
这种提升的好处,就是使用父类型对子对象进行操作,提高扩展性
但是不能使用子对象的特有功能
如果要用到子类对象的特有方法时,可以对对象的类型进行将之类型的转换
转型之道的对象的类型就可以使用对象的特有方法了
//对具体对象类型进行判断,需要instanceof
//需要对其进行向下转型,在转型前一定要进行健壮性判断,用instanceof
//非符合类型会发生ClassCastException
1.2.2. 多态前提:
1,类之间需要存在关系(继承或者实现)
2,要有覆盖操作
1.2.3. 多态的局限性:
一旦父类引用指向了自己的子类对象,那么父类引用在调用时,只能调用父类中有的方法,不能调用子类特有的属性
1.2.4. 多态的好处:
提高了程序的扩展性,一种类型可以接受多种该类型的具体对象
比如父类类型可以接受其不同的子类对象
可以对具体事物的贡献类型类型进行统一操作,将复杂问题简单化
1.2.5. 多态调用当中,成员的特点
1.成员变量
编译时期:查看引用型变量所属的类中是否有被调用的成员变量。如果有,编译通过没有编译失败
运行时期:也是查看引用型变量所属的类中的成员变量
简单说:对于成员变量多态调用时,编译和运行都看等号左边
也就是成员变量不存在多态调用,直接看谁在调用。
2.成员函数
成员函数在多态调用在编译时看左边,运行时看右边
//编译是否通过,看左边有没有该方法
//运行时出什么结果,看右边对象中的方法,动态绑定---非静态方法最终绑定在当前对象上,this之对象
3.静态函数
静态函数随着类,绑定在所属类上,跟对象无关
对于静态函数多态调用时,编译和运行都看等号左边
例子:笔记本——接口+多态
/*
需求:笔记本电脑运行
需要笔记本可以使用一个鼠标
先定义规则
笔记本使用规则——具有操作这种设备的功能
其他设备实现该规则——符合该规则,成为这种设备
*/
interface USB
{
public abstract void open();
public abstract void close();
}
class NoteBook
{
public void run()
{
System.out.println("notebook run");
}
public void useUSB(USB u)
//笔记本在使用这个规则,其他设备来实现这个接口以符合规则方便笔记本使用
{ //使用这个功能说明笔记本具有操作USB设备的功能
if (u!=null)
{
u.open();
u.close();//使用设备功能
}
}
}
class USBMouse implements USB //实现了USB接口,说明该鼠标符合USB接口规范,是USB设备
{
public void open()
{
System.out.println("USBMouse open");
}
public void close()
{
System.out.println("USBMouse close");
}
}
class USBKey implements USB
{
public void open()
{
System.out.println("USBKey open");
}
public void close()
{
System.out.println("USBKey close");
}
}
class NoteBookExa
{
public static void main(String[] args)
{
NoteBook book=new NoteBook();
book.run();
book.useUSB(null);
book.useUSB(new USBMouse());
book.useUSB(new USBKey());
System.out.println();
}
}
1.2.6. Object类
Object类:是所有类的父类,这个类中如果有成员,那一定是对所有的类都可用
对于父类中已经有的功能,子类只需要复写(要跟父类完全一样),不需要自己定义
//想要比较两个对象,可以
public boolean equals(Object obj)
{
//复写内容//复写,多态,判断
}
public String toString()
{
//哈希算法