乐趣区

关于java:JAVA基础知识点之Java面向对象

特点:1: 将简单的事件简单化。

2: 面向对象将以前的过程中的执行者,变成了指挥者。

3: 面向对象这种思维是合乎当初人们思考习惯的一种思维。

过程和对象在咱们的程序中是如何体现的呢?

过程 其实就是函数;

对象 是将函数等一些内容进行了封装。

匿名对象应用场景:

1: 当对办法只进行一次调用的时候,能够应用匿名对象。

2: 当对象对成员进行屡次调用时,不能应用匿名对象。必须给对象起名字。

在类中定义其实都称之为成员。成员有两种:

1:成员变量:其实对应的就是事物的属性。

2:成员函数:其实对应的就是事物的行为。

所以,其实定义类,就是在定义成员变量和成员函数。然而在定义前,必须先要对事物进行属性和行为的剖析,才能够用代码来体现。

private int age;// 公有的拜访权限最低,只有在本类中的拜访无效。

留神: 公有仅仅是封装的一种体现模式而已。

公有的成员: 其余类不能间接创建对象拜访,所以只有通过本类对外提供具体的拜访形式来实现对公有的拜访,

能够通过对外提供函数的模式对其进行拜访。

益处: 能够在函数中退出逻辑判断等操作,对数据进行判断等操作。

总结: 开发时,记住,属性是用于存储数据的,间接被拜访,容易呈现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的拜访办法。

这个办法个别有两个,标准写法:对于属性 xxx,能够应用 setXXX(),getXXX()对其进行操作。

类中怎么没有定义主函数呢?

留神: 主函数的存在,仅为该类是否须要独立运行,如果不须要,主函数是不必定义的。

主函数的解释: 保障所在类的独立运行,是程序的入口,被 jvm 调用。

成员变量和局部变量的区别:

1: 成员变量间接定义在类中。

局部变量定义在办法中,参数上,语句中。

2: 成员变量在这个类中无效。

局部变量只在本人所属的大括号内无效,大括号完结,局部变量失去作用域。

3: 成员变量存在于堆内存中,随着对象的产生而存在,隐没而隐没。

局部变量存在于栈内存中,随着所属区域的运行而存在,完结而开释。

构造函数: 用于给对象进行初始化,是给与之对应的对象进行初始化,它具备针对性,函数中的一种。

特点:

1:该函数的名称和所在类的名称雷同。

2:不须要定义返回值类型。

3:该函数没有具体的返回值。

记住: 所有对象创立时,都须要初始化才能够应用。

注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会主动生成一个空参数的构造函数,

为了不便该类创建对象,实现初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,能够有多个构造函数,因为它们的函数名称都雷同,所以只能通过参数列表来辨别。所以,

一个类中如果呈现多个构造函数。它们的存在是以重载体现的。

构造函数和个别函数有什么区别呢?

1: 两个函数定义格局不同。

2: 构造函数是在对象创立时,就被调用,用于初始化,而且初始化动作只执行一次。

个别函数,是对象创立后,须要调用才执行,能够被调用屡次。

什么时候应用构造函数呢?

剖析事物时,发现具体事物一呈现,就具备了一些特色,那就将这些特色定义到构造函数内。

结构代码块和构造函数有什么区别?

结构代码块: 是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只有对象一建设。就会调用这个代码块。

构造函数: 是给与之对应的对象进行初始化。它具备针对性。

Person p = new Person();

创立一个对象都在内存中做了什么事件?

1: 先将硬盘上指定地位的 Person.class 文件加载进内存。

2: 执行 main 办法时,在栈内存中开拓了 main 办法的空间(压栈—进栈),而后在 main 办法的栈区调配了一个变量 p。

3: 在堆内存中开拓一个实体空间,调配了一个内存首地址值。new

4: 在该实体空间中进行属性的空间调配,并进行了默认初始化。

5: 对空间中的属性进行显示初始化。

6: 进行实体的结构代码块初始化。

7: 调用该实体对应的构造函数,进行构造函数初始化。()

8: 将首地址赋值给 p,p 变量就援用了该实体。(指向了该对象)

封 装(面向对象特色之一): 是指暗藏对象的属性和实现细节,仅对外提供公共拜访形式。

益处: 将变动隔离;便于应用;进步重用性;安全性。

封装准则: 将不须要对外提供的内容都暗藏起来,把属性都暗藏,提供公共办法对其拜访。

this: 代表对象。就是所在函数所属对象的援用。

this 到底代表什么呢?哪个对象调用了 this 所在的函数,this 就代表哪个对象,就是哪个对象的援用。

开发时,什么时候应用 this 呢?

在定义性能时,如果该性能外部应用到了调用该性能的对象,这时就用 this 来示意这个对象。

this 还能够用于构造函数间的调用。

调用格局:this(理论参数):

this 对象前面跟上 . 调用的是成员属性和成员办法(个别办法);

this 对象前面跟上 () 调用的是本类中的对应参数的构造函数。

留神:用 this 调用构造函数,必须定义在构造函数的第一行。

因为构造函数是用于初始化的,所以初始化动作肯定要执行。否则编译失败。

static: 关键字,是一个修饰符,用于润饰成员(成员变量和成员函数)。

特点:

1: 想要实现对象中的共性数据的对象共享。能够将这个数据进行动态润饰。

2: 被动态润饰的成员,能够间接被类名所调用。也就是说,动态的成员多了一种调用形式。类名. 动态形式。

3: 动态随着类的加载而加载。而且优先于对象存在。

弊病:

1: 有些数据是对象特有的数据,是不能够被动态润饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的形容就出了问题。所以,在定义动态时,必须要明确,这个数据是否是被对象所共享的。

2:静态方法只能拜访动态成员,不能够拜访非动态成员。

因为静态方法加载时,优先于对象存在,所以没有方法拜访对象中的成员。

3:静态方法中不能应用 this,super 关键字

因为 this 代表对象,而动态在时,有可能没有对象,所以 this 无奈应用。

4: 主函数是动态的。

什么时候定义动态成员呢?或者说: 定义成员时,到底需不需要被动态润饰呢?

成员分两种:

1: 成员变量。(数据共享时动态化)

该成员变量的数据是否是所有对象都一样:

如果是,那么该变量须要被动态润饰,因为是共享的数据。

如果不是,那么就说这是对象的特有数据,要存储到对象中。

2: 成员函数。(办法中没有调用特有数据时就定义成动态)

如果判断成员函数是否须要被动态润饰呢?

只有参考,该函数内是否拜访了对象中的特有数据:

如果有拜访特有数据,那办法不能被动态润饰。

如果没有拜访过特有数据,那么这个办法须要被动态润饰。

成员变量和动态变量的区别:

1: 成员变量所属于对象。所以也称为实例变量。

动态变量所属于类。所以也称为类变量。

2: 成员变量存在于堆内存中。

动态变量存在于办法区中。

3: 成员变量随着对象创立而存在。随着对象被回收而隐没。

动态变量随着类的加载而存在。随着类的隐没而隐没。

4: 成员变量只能被对象所调用。

动态变量能够被对象调用,也能够被类名调用。

所以,成员变量能够称为对象的特有数据,动态变量称为对象的共享数据。

动态的留神: 动态的生命周期很长。

动态代码块:就是一个有动态关键字标示的一个代码块区域。定义在类中。

作用: 能够实现类的初始化。动态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。

Public: 拜访权限最大。

static: 不须要对象,间接类名即可。

void: 主函数没有返回值。

Main: 主函数特定的名称。

(String[] args): 主函数的参数,是一个字符串数组类型的参数,jvm 调用 main 办法时,传递的理论参数是 new String[0]。

jvm 默认传递的是长度为 0 的字符串数组,咱们在运行该类时,也能够指定具体的参数进行传递。能够在控制台,运行该类时,在前面退出参数。参数之间通过空格隔开。jvm 会主动将这些字符串参数作为 args 数组中的元素,进行存储。

动态代码块、结构代码块、构造函数同时存在时的执行程序:动态代码块 ———> 结构代码块 ———> 构造函数;

生成 Java 帮忙文档:命令格局:javadoc –d 文件夹名 –auther –version *.java

// 格局

/**   

* 类形容

*@author 作者名

*@version 版本号

*/

/**

* 办法形容

*@param  参数形容

*@return  返回值形容

*/
继 承(面向对象特色之一)

益处:

1: 进步了代码的复用性。

2: 让类与类之间产生了关系,提供了另一个特色多态的前提。

父类的由来:其实是由多个类一直向上抽取共性内容而来的。

java 中对于继承,java 只反对单继承。java 尽管不间接反对多继承,然而保留了这种多继承机制,进行改进。

单继承: 一个类只能有一个父类。

多继承: 一个类能够有多个父类。

为什么不反对多继承呢?

因为当一个类同时继承两个父类时,两个父类中有雷同的性能,那么子类对象调用该性能时,运行哪一个呢?因为父类中的办法中存在办法体。

然而 java 反对多重继承。A 继承 B  B 继承 C  C 继承 D。

多重继承的呈现,就有了继承体系。体系中的顶层父类是通过一直向上抽取而来的。它外面定义的该体系最根本最共性内容的性能。

所以,一个体系要想被应用,间接查阅该零碎中的父类的性能即可晓得该体系的根本用法。那么想要应用一个体系时,须要建设对象。倡议建设最子类对象,因为最子类不仅能够应用父类中的性能。还能够应用子类特有的一些性能。

简略说:对于一个继承体系的应用,查阅顶层父类中的内容,创立最底层子类的对象。

子父类呈现后,类中的成员都有了哪些特点:

1: 成员变量。

  当子父类中呈现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。

  如果想要调用父类中的属性值,须要应用一个关键字:super 

  This:代表是本类类型的对象援用。

  Super:代表是子类所属的父类中的内存空间援用。

  留神: 子父类中通常是不会呈现同名成员变量的,因为父类中只有定义了,子类就不必在定义了,间接继承过去用就能够了。

2: 成员函数。

当子父类中呈现了截然不同的办法时,建设子类对象会运行子类中的办法。如同父类中的办法被笼罩掉一样。所以这种状况,是函数的另一个个性:笼罩(复写,重写)

什么时候应用笼罩呢?当一个类的性能内容须要批改时,能够通过笼罩来实现。

3: 构造函数。

发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?

起因:子类的所有构造函数中的第一行,其实都有一条隐身的语句 super();

super(): 示意父类的构造函数,并会调用于参数绝对应的父类中的构造函数。而 super(): 是在调用父类中空参数的构造函数。

为什么子类对象初始化时,都须要调用父类中的函数?(为什么要在子类构造函数的第一行退出这个 super()?)

因为子类继承父类,会继承到父类中的数据,必须要看父类是如何对本人的数据进行初始化的。

所以子类在进行对象初始化时,先调用父类的构造函数,这就是 子类的实例化过程。

留神:

子类中所有的构造函数都会默认拜访父类中的空参数的构造函数,因为每一个子类结构内第一行都有默认的语句 super();

如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过 super 语句指定要拜访的父类中的构造函数。

如果子类构造函数中用 this 来指定调用子类本人的构造函数,那么被调用的构造函数也一样会拜访父类中的构造函数。

问题:super()和 this()是否能够同时呈现的构造函数中。

两个语句只能有一个定义在第一行,所以只能呈现其中一个。

super()或者 this(): 为什么肯定要定义在第一行?

因为 super()或者 this()都是调用构造函数,构造函数用于初始化,所以初始化的动作要先实现。

继承的细节

什么时候应用继承呢?

当类与类之间存在着所属关系时,才具备了继承的前提。a 是 b 中的一种。a 继承 b。狼是犬科中的一种。

英文书中,所属关系:” is a “

留神: 不要仅仅为了获取其余类中的已有成员进行继承。

所以判断所属关系,能够简略看,

如果继承后,被继承的类中的性能,都能够被该子类所具备,那么继承成立。如果不是,不能够继承。

细节二:

在办法笼罩时,留神两点:

1: 子类笼罩父类时,必须要保障,子类办法的权限必须大于等于父类办法权限能够实现继承。否则,编译失败。

2: 笼罩时,要么都动态,要么都不动态。(动态只能笼罩动态,或者被动态笼罩)

继承的一个弊病: 突破了封装性。对于一些类,或者类中性能,是须要被继承,或者复写的。

这时如何解决问题呢?介绍一个关键字,final: 最终。

final 特点:

1: 这个关键字是一个修饰符,能够润饰类,办法,变量。

2: 被 final 润饰的类是一个最终类,不能够被继承。

3: 被 final 润饰的办法是一个最终办法,不能够被笼罩。

4: 被 final 润饰的变量是一个常量,只能赋值一次。

其实这样的起因的就是给一些固定的数据起个浏览性较强的名称。

不加 final 润饰不是也能够应用吗?那么这个值是一个变量,是能够更改的。加了 final,程序更为谨严。常量名称定义时,有标准,所有字母都大写,如果由多个单词组成,两头用 _ 连贯。

抽象类:abstract

形象: 不具体,看不明确。抽象类表象体现。

在一直抽取过程中,将共性内容中的办法申明抽取,然而办法不一样,没有抽取,这时抽取到的办法,并不具体,须要被指定关键字 abstract 所标示,申明为形象办法。

形象办法所在类肯定要标示为抽象类,也就是说该类须要被 abstract 关键字所润饰。

抽象类的特点:

1: 形象办法只能定义在抽象类中,抽象类和形象办法必须由 abstract 关键字润饰(能够形容类和办法,不能够形容变量)。

2: 形象办法只定义方法申明,并不定义方法实现。

3: 抽象类不能够被创建对象(实例化)。

4: 只有通过子类继承抽象类并笼罩了抽象类中的所有形象办法后,该子类才能够实例化。否则,该子类还是一个抽象类。

抽象类的细节:

1: 抽象类中是否有构造函数?有,用于给子类对象进行初始化。

2: 抽象类中是否能够定义非形象办法?

能够。其实,抽象类和个别类没有太大的区别,都是在形容事物,只不过抽象类在形容事物时,有些性能不具体。所以抽象类和个别类在定义上,都是须要定义属性和行为的。只不过,比个别类多了一个形象函数。而且比个别类少了一个创建对象的局部。

3: 形象关键字 abstract 和哪些不能够共存?final , private , static

4: 抽象类中可不可以不定义形象办法?能够。形象办法目标仅仅为了不让该类创建对象。
接 口:

1:是用关键字 interface 定义的。

2:接口中蕴含的成员,最常见的有全局常量、形象办法。

留神:接口中的成员都有固定的修饰符。

成员变量:public static final

成员办法:public abstract

interface Inter{

public static final int x = 3;

public abstract void show();

}

3:接口中有形象办法,阐明 接口不能够实例化。接口的子类必须实现了接口中所有的形象办法后,该子类才能够实例化。否则,该子类还是一个抽象类。

4:类与类之间存在着继承关系,类与接口两头存在的是 实现 关系。

继承用 extends;实现用 implements;

5:接口和类不一样的中央,就是,接口能够被多实现,这就是多继承改进后的后果。java 将多继承机制通过多事实来体现。

6:一个类在继承另一个类的同时,还能够实现多个接口。所以 接口的呈现防止了单继承的局限性。还能够将类进行性能的扩大。

7:其实 java 中是有多继承的。接口与接口之间存在着继承关系,接口能够多继承接口

接口都用于设计上,设计上的特点:(能够了解主板上提供的接口)

1:接口是对外提供的规定。

2:接口是性能的扩大。

3:接口的呈现升高了耦合性

抽象类与接口:

抽象类:个别用于形容一个体系单元,将一组共性内容进行抽取,特点:能够在类中定义形象内容让子类实现,能够定义非形象内容让子类间接应用。它外面定义的都是一些体系中的根本内容。

接口:个别用于定义对象的扩大性能,是在继承之外还需这个对象具备的一些性能。

抽象类和接口的共性: 都是一直向上抽取的后果。

抽象类和接口的区别:

1: 抽象类只能被继承,而且只能单继承。

接口须要被实现,而且能够多实现。

2: 抽象类中能够定义非形象办法,子类能够间接继承应用。

接口中都有形象办法,须要子类去实现。

3: 抽象类应用的是  is a 关系。

接口应用的 like a 关系。

4: 抽象类的成员修饰符能够自定义。

接口中的成员修饰符是固定的, 全都是 public 的。

在开发之前,先定义规定,A 和 B 别离开发,A 负责实现这个规定,B 负责应用这个规定。至于 A 是如何对规定具体实现的,B 是不须要晓得的。这样这个接口的呈现就升高了 A 和 B 间接耦合性。

多 态(面向对象特色之一): 函数自身就具备多态性,某一种事物有不同的具体的体现。

体现 : 父类援用或者接口的援用指向了本人的子类对象。//Animal a = new Cat();

多态的益处 : 进步了程序的扩展性。

多态的弊病 : 当父类援用指向子类对象时,尽管进步了扩展性,然而只能拜访父类中具备的办法,不能够拜访子类中特有的办法。(后期不能应用前期产生的性能,即拜访的局限性)

多态的前提:

1: 必须要有关系,比方继承、或者实现。

2: 通常会有笼罩操作。

多态的呈现思维上也做着变动: 以前是创建对象并指挥对象做事件。有了多态当前,咱们能够找到对象的共性类型,间接操作共性类型做事件即可,这样能够指挥一批对象做事件,即通过操作父类或接口实现。

——————————————————————————————————————————————————————

class 毕姥爷{

void 讲课(){

System.out.println(“ 企业治理 ”);

}

void 钓鱼(){

System.out.println(“ 钓鱼 ”);

}

}

class 毕老师 extends 毕姥爷{

void 讲课(){

System.out.println(“JAVA”);

}

void 看电影(){

System.out.println(“ 看电影 ”);

}

}

class {

public static void main(String[] args) {

毕姥爷 x = new 毕老师(); // 毕老师对象被晋升为了毕姥爷类型。

// x. 讲课();

// x. 看电影();  // 谬误.

毕老师 y = (毕老师)x; // 将毕姥爷类型强制转换成毕老师类型。 

y. 看电影();// 在多态中,一如既往都是子类对象在做着类型的变动。

}

}

——————————————————————————————————————————————————————

如果想用子类对象的特有办法,如何判断对象是哪个具体的子类类型呢?

能够能够通过一个关键字 instanceof ;// 判断对象是否实现了指定的接口或继承了指定的类

格局:<对象 instanceof 类型>,判断一个对象是否所属于指定的类型。

Student instanceof Person = true;//student 继承了 person 类

多态在子父类中的成员上的体现的特点:

1: 成员变量:在多态中,子父类成员变量同名。

在编译期间: 参考的是 援用型变量所属的类 中是否有调用的成员。(编译时不产生对象,只查看语法错误)

运行期间: 也是参考 援用型变量所属的类 中是否有调用的成员。

简略一句话: 无论编译和运行,成员变量参考的都是援用变量所属的类中的成员变量。

再说的更容易记忆一些:成员变量 ——— 编译运行都看 = 右边。

2: 成员函数。

编译期间: 参考援用型变量所属的类中是否有调用的办法。

运行事件: 参考的是对象所属的类中是否有调用的办法。

为什么是这样的呢?因为在子父类中,对于截然不同的成员函数,有一个个性: 笼罩。

简略一句: 成员函数,编译看援用型变量所属的类,运行看对象所属的类。

更简略:成员函数 ——— 编译看 = 右边,运行看 = 左边。

3: 动态函数。 

编译期间: 参考的是援用型变量所属的类中是否有调用的成员。

运行期间: 也是参考援用型变量所属的类中是否有调用的成员。

为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该办法所在的类。

调用动态的办法援用是哪个类的援用调用的就是哪个类中的静态方法。

简略说:动态函数 ——— 编译运行都看 = 右边。

——————java.lang.Object
Object: 所有类的间接或者间接父类,Java 认为所有的对象都具备一些根本的共性内容,这些内容能够一直的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的性能。

具体方法:

1:boolean equals(Object obj): 用于比拟两个对象是否相等,其实外部比拟的就是两个对象地址。

而依据对象的属性不同,判断对象是否雷同的具体内容也不一样。所以在定义类时,个别都会复写 equals 办法,建设本类特有的判断对象是否雷同的根据。

public boolean equals(Object obj){

if(!(obj instanceof Person))

return false;

Person p = (Person)obj;

return this.age == p.age;

}

2:String toString(): 将对象变成字符串;默认返回的格局:类名 @哈希值 = getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

为了对象对应的字符串内容有意义,能够通过复写,建设该类对象本人特有的字符串表现形式。

public String toString(){

return “person : “+age;

}

3:Class getClass(): 获取任意对象运行时的所属字节码文件对象。

4:int hashCode(): 返回该对象的哈希码值。反对此办法是为了进步哈希表的性能。

通常 equals,toString,hashCode,在利用中都会被复写,建设具体对象的特有的内容。

外部类:如果 A 类须要间接拜访 B 类中的成员,而 B 类又须要建设 A 类的对象。这时, 为了不便设计和拜访,间接将 A 类定义在 B 类中。就能够了。A 类就称为外部类。外部类能够间接拜访外部类中的成员。而外部类想要拜访外部类,必须要建设外部类的对象。

class Outer{

int num = 4;

class  Inner {

void show(){

System.out.println(“inner show run “+num);

}

}

public void method(){

Inner in = new Inner();// 创立外部类的对象。

in.show();// 调用外部类的办法。

}

}

当外部类定义在外部类中的成员地位上,能够应用一些成员修饰符润饰 private、static。

1: 默认修饰符。

间接拜访外部类格局: 外部类名. 外部类名 变量名 =  外部类对象. 外部类对象;

Outer.Inner in = new Outer.new Inner();// 这种模式很少用。

然而这种利用不多见,因为外部类之所以定义在外部就是为了封装。想要获取外部类对象通常都通过外部类的办法来获取。这样能够对内部类对象进行管制。

2: 公有修饰符。

通常外部类被封装,都会被私有化,因为封装性不让其余程序间接拜访。

3: 动态修饰符。

如果外部类被动态润饰,相当于外部类,会呈现拜访局限性,只能拜访外部类中的动态成员。

留神;如果外部类中定义了动态成员,那么该外部类必须是动态的。

外部类编译后的文件名为:“外部类名 $ 外部类名.java”;

为什么外部类能够间接拜访外部类中的成员呢?

那是因为外部中都持有一个外部类的援用。这个是援用是 外部类名.this

外部类能够定义在外部类中的成员地位上,也能够定义在外部类中的部分地位上。

当外部类被定义在部分地位上,只能拜访部分中被 final 润饰的局部变量。

匿名外部类 :没有名字的外部类。就是外部类的简化模式。个别只用一次就能够用这种模式。匿名外部类其实就是一个匿名子类对象。 想要定义匿名外部类:须要前提,外部类必须继承一个类或者实现接口。

匿名外部类的格局:new 父类名 & 接口名(){ 定义子类成员或者笼罩父类办法}. 办法。

匿名外部类的应用场景:

当函数的参数是接口类型援用时,如果接口中的办法不超过 3 个。能够通过匿名外部类来实现参数的传递。

其实就是在创立匿名外部类时,该类中的封装的办法不要过多,最好两个或者两个以内。

//E.G:

//1

new Object(){

void show(){

System.out.println(“show run”);

}

}.show();

//2

Object obj = new Object(){

void show(){

System.out.println(“show run”);

}

};

obj.show();

1 和 2 的写法正确吗?有区别吗?说出起因。

写法是正确,1 和 2 都是在通过匿名外部类建设一个 Object 类的子类对象。

区别:

第一个可是编译通过,并运行。

第二个编译失败,因为匿名外部类是一个子类对象,当用 Object 的 obj 援用指向时,就被晋升为了

Object 类型,而编译时查看 Object 类中是否有 show 办法,所以编译失败。

class InnerClassDemo6 {

+(static)class Inner{

void show(){}

}

public void method(){

this.new Inner().show();// 能够

}

public static void main(String[] args) {//static 不容许 this

This.new Inner().show();// 谬误,Inner 类须要定义成 static

}

}

interface Inter{

void show();

}

class Outer{// 通过匿名外部类补足 Outer 类中的代码。

public static Inter method(){

return new Inter(){

public void show(){}

};

}

}

class InnerClassDemo7 {

public static void main(String[] args) {

Outer.method().show();

/*

Outer.method(): 意思是:Outer 中有一个名称为 method 的办法,而且这个办法是动态的。

Outer.method().show(): 当 Outer 类调用动态的 method 办法运算完结后的后果又调用了 show 办法,意味着:method()办法运算完一个是对象,而且这个对象是 Inter 类型的。

*/

function (new Inter(){

public void show(){}

}); // 匿名外部类作为办法的参数进行传递。

}

public static void function(Inter in){

in.show();

}

}

退出移动版