1,接口:
初期理解——当抽象类中的方法都市抽象的,则该类可以通过接口的形式来表示。
定义时,格式特点:
1,接口中常见定义——常量,抽象方法
2,接口中的成员都有固定修饰符
常量:public static final
方法:public abstract
记住:接口中的成员都为public 。
接口需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则 子类是一个抽象类。
注:子类覆盖抽象方法的方法权限得相同,为public 。
接口可以被类多实现 即一个类可以同时实现多个接口,也是对不支持类多继承的转换形式。
接口之间可以多继承。但类之间只支持单继承。
接口特点:
以CPU同主板举例 插槽(即接口),对外暴露的规则,提供了主板功能的扩展性,降低CPU与主板的耦合性(即)。
基本功能定义在类(一个体系中)中 扩展功能定义在接口(体系外)中。
2,多态
可以理解为事物存在的多种体现形态。
人:男人 女人
动物:猫 狗
猫 x = new 猫(); 动物 x = new 猫();
函数多态性体现——重载和覆盖。
1,多态的体现——父类的引用可以接收子类对象
2,多态的前提——必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处——大大的提高了程序的扩展性。
4,多态弊端——提高了扩展性,但是只能 使用父类的引用访问父类中的成员。
5,多态的应用
6,多态的出现 代码中的特点(多态使用的注意事项)
class DuotaiDemo
{
public static void main(String[] args)
{
Animal a = new Cat();//类型提升,即向上转型
a.eat();
//如果想要调用猫的特殊方法,该如何操作?
//可以强制将父类引用,转成子类类型。
Cat c = (Cat)a;
c.catchMouse();
//注意不要将父类对象转化为子类类型
//Animal a = new Animal();
//Cat c = (Cat)a;
//我们能转换的是 指向了自己子类对象的父类引用,该引用可以被提升,也可被强制转换
//多态自始至终都市子类对象在做着变化。
/*
function(new Cat());
function(new Dog());
function(new Pig());
*/
}
//运行时 才开辟函数空间(栈) 函数里的功能才开始执行
public static void function(Animal a)
{
a.eat();
//如果a是Cat的一个实例 注意不要写成if(a == Cat) 因为==只适用于基本类型
//instanceof用于判断所属类型 使得可以调用特殊类型的特殊方法
if(a instanceof Cat)
{Cat c= (Cat)a;
c.catchMouse();}
else if(a instanceof Dog)
{Dog d= (Dog)a;
d.catchMouse();}
}
}
在多态(此处专指 父引用=子类对象)中成员函数(非静态)的特点——
编译时期:参阅 引用型变量所属类中 是否有该函数。若有 则编译通过,否则 失败。
运行时期:参阅 对象所属类中 是否有该函数。
总结:成员函数在多态调用时,编译看左边,运行看右边。
(多出现在面试中的问题)
在多态中 成员变量特点——
无论编译还是运行 都参考左边(引用型变量所属类)。
在多态中 静态成员函数特点——
无论编译还是运行 都参考左边
多态应用:PCI p = new NetCard() 接口型引用指向自己的子类对象.——属于多态
3,Object,
是所有对象的直接或者间接父类,传说中的上帝。定义的是所有对象都具备的功能。
equals()——比较对象是否相等 其实比较的是地址(同==)
应用(复写父类):
public boolean equals(Object obj)//Object obj = new Demo();
{
if(!(obj instanceof Demo)) //需注意加上
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
String:(字符串最大特点:一旦被初始化就不可以被改变。——存在于常量池中)
String s1 = "abc";//s1 是一个类类型变量 "abc"是一个对象
String s2 = new String("abc");
String s3 = "abc"; // s1==s3 = true
//s1 s2 的区别:s1在内存中有一个对象 s2 在内存中有两个对象。
== 用法不变——仍比较地址
equals —— 判断字符串是否相同(并非比较地址)——String类复写了Object类中的equals方法
4,内部类
访问规则——
1、内部类可以直接访问外部类中的成员,包括私有;——因为内部类中持有了一个外部类的引用,格式为 外部类名.this。
2、 外部类要访问内部类,必须建立内部类对象。
3,、直接访问内部类的成员 格式 Outer.Inner in = new Outer().new Inner(); in.function();——该访问方式几乎使用不到,因为通常会声明为private。
访问格式——
1,当内部类定义在外部类的成员位置上,且非私有,则
在外部其他类中 直接建立成员内部类对象 格式——外部类名.内部类名 变量名 = 外部类对象.内部类对象。Outer.Inner in = new Outer().new Inner();
2,内部类在成员位置上 才可以被成员修饰符所修饰。
private:将内部类进行封装。
static:内部类就具备了static的特性,只能访问外部类中的static成员,出现访问局限性。
在外部其他类中,直接访问静态内部类的非静态成员函数 方式——new Outer.Inner().function();
在外部其他类中,直接访问静态内部类的静态成员函数 方式——Outer.Inner.function();
注意:当内部类中定义了静态成员,该内部类必须是静态的。
当外部类中的静态方法访问内部类时,内部类也必须是静态的。
1,2,——在开发上几乎用不上。
3,局部内部类 仍可正常访问外部类数据成员,但不可被static修饰。
当描述事物时,事物的内部还有事物,该事物用内部类来描述。——因为内部事务在使用外部事物的内容。
以下代码 通常用于程序设计上
class Body
{
private classXinZang
{
}
public void show()
{
new XinZang();
}
}
5,匿名内部类
1,其实就是内部类的简写格式。
2,定义内部类的前提——内部类必须是继承一个类或实现接口。
3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。这个对象有点胖。
5,匿名内部类中,定义的方法最好不超过3个。
用法:
当方法使用的参数类型是一个接口类型时,且该接口方法不超过三个,则可定义一个匿名内部类,将其作为参数传入。
面试题——若无父类 且无接口 还可以使用匿名内部类吗?
答案是可以的。通过超级父类Object。
new Object()
{
void abc(){System.out.println("abc");}
}.abc();