JAVA学习三

来源:互联网 发布:jas37战斗机 知乎 编辑:程序博客网 时间:2024/05/20 19:31

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();























原创粉丝点击