1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java开发中/final关键字/多态/抽象类/接口/形式参数与返回值/内部类/匿名内部类知识梳理

java开发中/final关键字/多态/抽象类/接口/形式参数与返回值/内部类/匿名内部类知识梳理

时间:2021-12-30 20:04:54

相关推荐

java开发中/final关键字/多态/抽象类/接口/形式参数与返回值/内部类/匿名内部类知识梳理

一,final关键字

1.final修饰类,该类不能被继承,

2.final修饰成员方法,该方法不能重写.

3.final修饰类的成员变量,该变量的值不能改变,

4.final修饰局部变量:

a,若该局部变量的类型为基本数据类型,该变量的值不能被改变.

b,若该变量的类型为引用类型,那么它不能再次被分配堆内存空间,但是该变量的值可以改变.

#当final修饰变量时,需要在对象创建创建之前进行初始化这个值:

a,构造代码块中进行初始化

b,构造方法中进行初始化

c,定义成员变量的时候,可以直接进行初始化.

注意:这三种方式只能同时使用一种.

#final修饰局部变量的综合应用:

packageDay_08_01;

public classFinalXiuShi {

intage;

public static voidmain(String[] args) {

/*intn=100;

n=200;

System.out.println(n);*/

final intn=100;

/*n=200;*/ //该变量被final修饰,其值不会发生改变

/*System.out.println(n);

System.out.println("---------------");*/

/* FinalXiuShifl=newFinalXiuShi();

fl.age=200;

System.out.println(fl.age);

System.out.println("---------------");*/

finalFinalXiuShi fl=newFinalXiuShi();//final修饰的是fl引用类型

fl.age=200;

fl.age=120;//当final修饰引用类型时,其值可以改变

System.out.println(fl.age);

System.out.println("---------------");

}

}

二:多态;

1. 对于多态的三个前提条件

1) 条件1:必须有继承关系(如果没有继承关系,谈不上多态!)

2) 条件2:必须有方法重写

3) 有父类引用指向子类对象:向上转型

Fu f = new Zi() ;

#多态的三个条缺一不可!

2. 多态的成员访问特点:

成员变量:编译看左边,执行看左边.

成员方法(非静态):编译看左边,执行看右边,由于存在方法重写,所以执行的是子类的成员方法,会将父类中同名的方法覆盖掉.

构造方法:还是对象进行初始化,由于是一种继承关系,还是分层初始化.

成员方法(静态):编译看左,执行看左,由于static随着类加载而加载,所以与类有关,与对象无关,也就不存在方法重写.

3. 多态的好处:

(1) 提高代码的维护性(有继承保证)

(2) 提高代码的扩展性(有多态保证)

#扩展性的综合应用:

packageDay_01_DuoTai;

public classKuoZhan {

public static voidmain(String[] args) {

Teacher te=newTeacher();

ITit=newIT ();

System.out.println("--------------");

PersonTools.UseWork(te);

PersonTools.UseWork(it);

}

}

classPerson{

public voidWork(){

System.out.println("人每天需要上班");

}

}

classTeacherextendsPerson{

public voidWork(){

System.out.println("老师需要站着上班");

}

}

classITextendsPerson{

public voidWork(){

System.out.println("程序员每天需要坐着上班");

}

}

classPersonTools{//将Teacher类和IT类中的方法封装在一个类中

private voidPersonTools(){//对构造方法进行私有化,防止外界创建对象

}

public static voidUseWork(Person a){//该方法定义为static修饰,直接用类名调用

a.Work();

}

}

4. 多态的弊端

(1) 不能访问子类的特有方法

解决方法:(1)创建子类的具体对象,来访问自己的特有功能,虽然可以解决多态的弊端,但是从内存角度考虑,需要创建子类对象,那么必须在堆和栈内开辟空间,浪费内存,不建议这么做.

#多态成员访问的综合应用:

packageDay_01_DuoTai;

public classKongZiZhuangDie {

public static voidmain(String[] args) {

Father fu=newKongZi();//向上转型:有父类的引用指向子类的对象

System.out.println("输出的年龄为:" + fu.age);//多态中成员变量的访问:编译看左,执行看左,所以打印出Father的年龄

System.out.println("讲课的内容为:" );

fu.Teacher();//因为多态中,存在方法重写,当通过子类对象访问相同方法时,子类的方法会覆盖父类的方法,所以编译看左,执行看右

System.out.println("--------------");

KongZi zi=(KongZi)fu;//向下转型:父类的引用强制转换为子类的引用,(前提是必须有向上转型):可以通过子类的引用调用子类的特有方法.

System.out.println("孔子还会玩:");

zi.Play();

}

}

classFather {

public intage=40;

public voidTeacher(){

System.out.println("孔子爹讲国语");

}

}

classKongZiextendsFather{

public intage=26;

public voidTeacher(){

System.out.println("孔子讲论语");

}

public voidPlay(){

System.out.println("孔子会玩游戏");

}

}

5. 异常

(1) 向下转型使用不当会出现一个异常:class cast exception

(2) 数组角标越界异常:Array Pointer Exception

(3)空指针异常(解决方案:给对象做非空判断 if(对象名 != null) {给对象进行操作}):Null Pointer Exception

6.抽象类

(1)概念: 1.每一个动物的吃和睡的功能不一样,不应该把动物类定义为一个具体类,而是给出一个声明(abstract)

(2) 当一个类中如果有抽象功能(抽象方法)的时候,那么这个类一定要定义为抽象类!(一个类中既可以有抽象方法,也可以有非抽象方法)

(3) 抽象类的子类的特点: 抽象类的子类是抽象类,那么没有意义! 最终使用的就是通过子类进行对象初始化的,如果子类都被抽象修饰了,那么也不能创建对象,所以没意义

抽象类多态: 强制子类必须重写当前抽象的父类中所有的抽象方法

* 还可以提高代码的维护性(里面继承关系保证!)

#抽象类不能实例化:抽象类不能创建对象

抽象类如何进行实例化: 通过抽象类多态形式:父类的引用指向子类对象,通过子类进行初始化!

(3) 抽象类成员特点:

a, 成员变量:可以是变量也可以是自定义常量.

b, 构造方法:抽象类可以有构造方法,包括有参构造和无参构造.

作用:通过抽象类多态的形成,让子类进行数据的初始化.

#:abstract不能与以下关键字共同使用:

Private finalstatic

#抽象类与多态的综合应用:

packageDay_01_DuoTai;

public classChouXiangLei {

public static voidmain(String[] args) {

Employee sc=newIT2("王抢","9527",2000);//向上转型:父类的引用指向子类的对象

IT2 it=(IT2)sc;//向下转型:父类的引用强制转换为子类的引用

it.GetInformation();//通过子实现类的对象调用子类的特有方法

it.work();//通过子实现类的对象调用子类的特有方法

System.out.println("----------------");

Employee an=newManager("上官万成","9528",2000,50);

Manager mg =(Manager)an;

mg.GetInformation();

mg.work();

}

}

abstract classEmployee{//一个类中有抽象方法时,该类一定是抽象方法,抽象类中可以没有抽象方法

publicString name;

publicString number;

public intsalary;

publicEmployee() {

super();

//TODO自动生成的构造函数存根

}

publicEmployee(String name, String number,intsalary) {

super();

this.name = name;

this.number = number;

this.salary = salary;

}

publicString getName() {

returnname;

}

public voidsetName(String name) {

this.name = name;

}

publicString getNumber() {

returnnumber;

}

public voidsetNumber(String number) {

this.number = number;

}

public intgetSalary() {

returnsalary;

}

public voidsetSalary(intsalary) {

this.salary = salary;

}

public abstract voidwork();

}

classIT2extendsEmployee{

publicIT2() {

super();

//TODO自动生成的构造函数存根

}

publicIT2(String name, String number,intsalary) {

super();

this.name = name;

this.number = number;

this.salary = salary;

}

public voidsetName(String name) {

this.name = name;

}

publicString getName() {

returnname;

}

public voidsetNumber(String number) {

this.number = number;

}

publicString getNumber() {

returnnumber;

}

public voidsetSalary(intsalary) {

this.salary = salary;

}

public intgetSalary() {

returnsalary;

}

voidGetInformation(){

System.out.println(this.name + "的编号是:" +this.number + ";它的工资是:" +this.salary );

}

@Override

public voidwork() {

System.out.println("程序员每天敲代码");//TODO自动生成的方法存根

}

}

classManagerextendsEmployee{

public intbonus;

publicManager() {

super();

//TODO自动生成的构造函数存根

}

publicManager(String name, String number,intsalary,intbonus) {

super();

this.name = name;

this.number = number;

this.salary = salary;

this.bonus = bonus;

}

public voidsetName(String name) {

this.name = name;

}

publicString getName() {

returnname;

}

public voidsetNumber(String number) {

this.number = number;

}

publicString getNumber() {

returnnumber;

}

public voidsetSalary(intsalary) {

this.salary = salary;

}

public intgetSalary() {

returnsalary;

}

public voidsetBonus(intbonus) {

this.bonus = bonus;

}

public intgetBonus() {

returnbonus;

}

@Override

public voidwork() {

System.out.println("经理每天待办公室");//TODO自动生成的方法存根

}

voidGetInformation(){

System.out.println(this.name + "的编号是:" +this.number + ";它的工资是:" +this.salary );

}

}

7.接口

(1) 概念: 接口体现的是一种:扩展功能;

(2) 如何表示接口: interface 接口名{ }

a. 接口里面的方法只能是抽象方法

b. 接口中不能有构造方法

c. 接口不能实例化(不能直接创建对象)

d. 接口的实例化:就是通过子实现类对数据进行初始化!

接口的子实现类: 1)接口的子实现类是抽象类,没有意义,子类都不能创建对象了;实际开发中用的就是子类的对象进行初始化!

2) 接口的子实现类是非抽象类

(3)接口的子实现类和接口的关系:implements

Class 子实现类 implements 接口名{ }

(4)接口成员的特点:

a.成员变量: 只能是常量:存下默认修饰符:public static final (永远建议自己给出默认修饰符)

b.构造方法: 接口是没有构造方法的

c.成员方法: 接口中的成员方法默认修饰符:public abstract(永远建议自己给出默认修饰符)

(5)类与接口之间的相互联系

a. 类与类的关系: 继承关系:extends,java中只支持单继承,不支持多继承,但是可以多层继承!

b. 类与接口的关系: 实现关系:implements,并且,一个类在继承另一个类的同时,可以实现多个接口

(class 子实现类名 enxtends Object implements 接口名1,接口名2...)

a. 接口与接口的关系: 继承关系:extends,可以支持单继承,也可以多继承!

(5)接口与抽象类的区别:

a.成员的区别

成员变量: 抽象类:可以是变量也可以是自定义常量

接口:只能是常量:存下默认修饰符:public static final (永远建议自己给出默认修饰符)

构造方法: 抽象类:可以有无参构造和有参构造.作用:通过子类进行数据的初始化

接口:没有构造方法

成员方法的区别: 抽象类:可以是抽象方法也可以是非抽象方法

接口:只能是抽象方法.且存在默认修饰符(abstract)

b, 关系的区别: 类与类的关系:继承关系,extends----java中只支持单继承,不支持多继承,但可以多层继承.

类与接口的关系:实现关系,implements----一个类在继承另一个类的同时,可以实现多个接口(class 子实现类名 extends object implements 接口1,接口2.......)

接口与接口的关系:继承关系,可以支持单继承,也可以支持多继承.

c. 设计原理的区别:

抽象类:体现的是一种"is-a"的关系,存在继承关系(抽象类多态)

接口:体现的是一种"like-a"的关系,由于接口的一种扩展功能.

#一个类的无参构造私有化之后,不能创建对象,也不能通过(对象名.方法())进行调用,此时,应将方法用static修饰,应此需要用(类名.方法())直接调用.

#老师和学生案例,加入抽烟的额外功能自己分析成员:

测试类:packageday_01_Smokeing;

public classSmokeingDemo {

public static voidmain(String[] args) {

System.out.println("-----------以下是通过接口的具体类对象形式进行调用子实现类的方法");

TeacherSmoking ts=newTeacherSmoking();//此时的TeacherSmoking是一个具体的类,它包含的功能最多,可以直接用该类创建对象,用对象直接调用方法

ts.setAge(32);

ts.setName("王抢");

ts.setOccupation("小导员");

ts.GetInformation();

ts.work();

ts.Smoking();

ts.Smoke();

//TODO自动生成的方法存根

}

}

Person类:packageday_01_Smokeing;

public abstract classPerson {

public intage;

publicString name;

publicPerson() {

super();

//TODO自动生成的构造函数存根

}

publicPerson(intage, String name) {

super();

this.age = age;

this.name = name;

}

public voidsetAge(intage) {

this.age = age;

}

public intgetAge() {

returnage;

}

public voidsetName(String name) {

this.name = name;

}

publicString getName() {

returnname;

}

public abstract voidSmoking();

}

Teacher类:packageday_01_Smokeing;

classTeacherextendsPerson {

public intage;

publicString name;

publicString occupation;

publicTeacher() {

//TODO自动生成的构造函数存根

}

publicTeacher(intage, String name, Stringoccupation) {

super();

this.age = age;

this.name = name;

this.occupation = occupation;

}

public voidsetAge(intage) {

this.age = age;

}

public intgetAge() {

returnage;

}

public voidsetName(String name) {

this.name = name;

}

publicString getName() {

returnname;

}

public voidsetOccupation(String occupation) {

this.occupation = occupation;

}

publicString getOccupation() {

returnoccupation;

}

public voidwork(){

System.out.println("老师工作负责教学生");

}

@Override

public voidSmoking() {

System.out.println("老师比学生早抽烟");

//TODO自动生成的方法存根

}

public voidGetInformation(){

System.out.println(this.name + "在" +this.age + "岁的时候开始抽烟");

}

}

Student类:packageday_01_Smokeing;

classStudentextendsPerson {

public intage;

publicString name;

publicString occupation;

publicStudent() {

//TODO自动生成的构造函数存根

}

publicStudent(intage, String name, Stringoccupation) {

super();

this.age = age;

this.name = name;

this.occupation = occupation;

}

public voidsetAge(intage) {

this.age = age;

}

public intgetAge() {

returnage;

}

public voidsetName(String name) {

this.name = name;

}

publicString getName() {

returnname;

}

public voidsetOccupation(String occupation) {

this.occupation = occupation;

}

publicString getOccupation() {

returnoccupation;

}

public voidwork(){

System.out.println("学生的任务就是每天学习");

}

public voidGetInformation(){

System.out.println(this.name + "在" +this.age + "岁的时候开始抽烟");

}

@Override

public voidSmoking() {

System.out.println("学生普遍在小学的时候开始抽烟");

//TODO自动生成的方法存根

}

}

接口类:packageday_01_Smokeing;

public interfaceSmoke {

public voidSmoke();//接口中的方法只能是抽象方法,且存在默认修饰符:abstract

}

子实现类:packageday_01_Smokeing;

public classTeacherSmokingextendsTeacherimplementsSmoke {

publicTeacherSmoking() {

//TODO自动生成的构造函数存根

}

publicTeacherSmoking(intage, Stringname, String occupation) {

super(age, name, occupation);

//TODO自动生成的构造函数存根

}

@Override

public voidSmoke() {

System.out.println("老师学会抽烟呢");

//TODO自动生成的方法存根

}

}

8.API文档的制作:

#关于数组的自定义类:

(1)测试类:packageday_01_APIDemo;

/**

*@authorLenovo

*@version1.0

*

* */

public classApiDemo {

public static voidmain(String[] args) {

int[] array={26,9,16,24,62,56};

intan=ArraysTools .GetMax(array);

inta=ArraysTools .PrintArray(array, 56);

System.out.println("该数组的最大值为:" + an);

System.out.println("传入数的下标为:" + a);

//TODO自动生成的方法存根

}

}

(2)数组工具类

packageday_01_APIDemo;

/**该类是定义的一个数组工具类

*@authorLenovo

*@version1.0

*

* */

public classArraysTools {

privateArraysTools() {//将该构造方法私有化,防止外界创建对象访问它.

super();

//TODO自动生成的构造函数存根

}

/**

*@paramarray:需要求最大值的数组

*

* */

public static intGetMax(int[]array){

intmax=array[0];

for(inti=0;i<array.length;i++){

if(array[i]>array[0]){

max=array[i];

break;

}

}

returnmax;

}

/**

*@paramarray:需要求数组下标的原始数组

*@paramvalue:该数组中元素的下标

*@return:以形参传入该方法,若数组中找到该元素,则返回该元素的下标,若没有找到,则返回默认值-1;

*

* */

public static intPrintArray(int[]array,intvalue){

intindex=-1;

for(inti=0;i<array.length;i++){

if(array[i]==value){

index=i;

break;

}

}

returnindex;

}

}

9. 形式参数和返回值问题研究:

(1)形式参数:

基本数据类型:需要什么数据类型,在实际传参的时候就传什么数据类型;形式参数的改变对实际参数没有影响(String是引用类型和基本数据类型的效果一样Strings ="abc")

引用类型: 具体类:如果形式参数是一个具体类,需要创建该类的对象.

抽象类: 如果形式参数是抽象类,需要创建一个抽象类的子类来进行实例化.

接口:如果一个方法的形式参数是一个接口,需要创建该接口的子实现类,然后通过接口多态的形式给接口进行初始化;

(2) 返回值:

具体类: 直接返回该类对象(通常实际开发中使用的是匿名对象)

抽象类: 返回值如果是抽象类,需要的返回是该抽象类的子类对象

接口:如果一个方法的返回值类型为接口时,需要返回的是该接口的子实现类的对象

#形式参数是抽象类的综合应用:

packageday_01_XingCan;

public classChouXiangLei {

public static voidmain(String[] args) {

System.out.println("----------以下是创建AnimalDemo类的具体对象,直接调用Method方法");

AnimalDemo ad=newAnimalDemo();

ad.method(newBirdie());

System.out.println("----------以下是链式编程");

newAnimalDemo().method(newBirdie());//链式编程

}

}

abstract classAnimal{

public abstract voidEat();

}

classAnimalDemo{

public voidmethod(Animal an){//当形式参数是抽象类时,需要创建子实现类的具体对象:Animal an1=new Birdie();

an.Eat();//因为存在方法重写,所以此对象调用的是子类的方法

}

}

classBirdieextendsAnimal{

Birdie() {

super();

//TODO自动生成的构造函数存根

}

@Override

public voidEat() {

System.out.println("小鸟饿了,会找虫子吃");

//TODO自动生成的方法存根

}

}

#形式参数是接口时的综合应用:

packageday_01_XingCan;

public classJieKou {

public static voidmain(String[] args) {

System.out.println("------------通过具体类的对象,将接口类多态进行传参");

JieKouDemo jd=newJieKouDemo();//通过创建JieKouDemo类的具体对象,之后直接调用Method方法

jd.Method(newStudent());//当一个方法的参数是接口时,需要创建该接口的子实现类的对象,也就是接口类多态的形式:sleep s=new Student();

System.out.println("------------链式编程");

newJieKouDemo().Method(newStudent());

//TODO自动生成的方法存根

}

}

interfacesleep{

public abstract voidsleep();

}

classJieKouDemo{

public voidMethod(sleep s){

s.sleep();

}

}

classStudentimplementssleep{

@Override

public voidsleep() {

System.out.println("学生学习一天之后,需要早点休息");

//TODO自动生成的方法存根

}

}

#返回值是抽象类的综合应用:

packageday_01_FanHuiZhi;

public classChouXiangLei {

public static voidmain(String[] args) {

ChouXiangLeiDemo cld=newChouXiangLeiDemo();//创建ChouXiangLeiDemo该类的具体对象

cld.method().life();//实际是创建 Person p=newTeather();多态的形式;

System.out.println("------------以下是链式编程");

newChouXiangLeiDemo().method().life();

//TODO自动生成的方法存根

}

}

abstract classPerson{

public abstract voidlife();

}

classChouXiangLeiDemo{

publicPerson method(){//该方法的返回值是一个抽象类

return newTeather();//需要创建该抽象类的子实现类,直接返回抽象类的子类的对象

}

}

classTeatherextendsPerson{

@Override

public voidlife() {

System.out.println("老师的生活很丰富");

//TODO自动生成的方法存根

}

}

#返回值是接口的综合应用:

packageday_01_FanHuiZhi;

public classJieKou {

public static voidmain(String[] args) {

System.out.println("以下是创建JieKouDemo类的具体对象,直接调用该方法");

JieKouDemo jkd=newJieKouDemo();

jkd.method().Eat();

System.out.println("以下是链式编程");

newJieKouDemo().method().Eat();

//TODO自动生成的方法存根

}

}

interfaceSpeak{

public abstract voidEat();

}

classJieKouDemo{

publicSpeak method(){

return newStudent();

}

}

classStudentimplementsSpeak{

@Override

public voidEat() {

System.out.println("学生饿了,需要吃营养餐");

//TODO自动生成的方法存根

}

}

10.内部类

:在一个类中定义的另一个类;

a. 内部类可以访问外部内的成员,包括私有.

b. 外部内想要访问内部类的成员,必须通过创建内部类的对象,通过对象访问内部类的成员方法.

分类:1.成员内部类:在外部类的成员位置定义的另一个类

2.局部内部类:在外部类的局部位置定义的另一个类

(1).成员内部类(非静态):

在测试类中需要访问成员内部类中的成员的方法:

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

例: Body.Inner bo = new Body().newInner() ;

#成员内部类的成员方法访问的综合应用:

packageday_01_NeiBuLei;

public classCeShiLei {

public static voidmain(String[] args) {

System.out.println("--------------");

Person.Animal pa=newPerson().newAnimal();//内部类访问外部类的成员,调用内部类的成员方法

pa.speak();

System.out.println("--------------");

Person p=newPerson();//创建外部类的对象,直接调用外部类的成员方法,然后在此方法中创建内部类的对象,通过内部类的对象访问内部类的成员方法

p.talk();

//TODO自动生成的方法存根

}

}

classPerson{

private intage=34;//外部类的私有成员变量

String name="王抢";//外部类的成员变量

classAnimal{

public voidspeak(){

intage2=33;//内部类的成员变量

Stringname2="上官万成";//内部类的成员变量

System.out.println(name + "的年龄是" + age);//内部类可以访问外部类的成员,包括私有.

}

}

public voidtalk(){

Animal a=newAnimal();

a.speak();

}

}

成员内部类的修饰符:

private:为了保证数的安全性

static修饰:为了方便调用(如果成员内部类被static修饰,那么要访问外部类的成员变量,这个变量必须被static修饰)

静态的成员内部类访问该类中的成员方法:

格式:外部类名.内部类名 对象名 = new 外部类名.内部类名() ;

例: Outer4.Inner4 oi = newOuter4.Inner4() ;

#静态成员内部类访问外部成员的综合应用:

packageday_01_NeiBuLei;

public classJingTaiCe {

public static voidmain(String[] args) {

System.out.println("-----------");

Animal.ChuSheng cs=newAnimal.ChuSheng();//该内部类被static修饰,要访问外部类的成员变量,必须要被static修饰

cs.work();//静态内部类的非静态方法

cs.show();//静态内部类的静态方法

//TODO自动生成的方法存根

}

}

classAnimal{

public staticStringname="王抢";//外部类的成员变量需要被static修饰

public static intage=35;//外部类的成员变量需要被static修饰

static classChuSheng{

public static voidshow(){

System.out.println(name+ "的年龄为:" +age);

}

public voidwork(){

System.out.println(name+ "工作为学校卖命");

}

}

}

(3) 局部内部类: 定义在外部类的局部位置

Question:当局部内部类访问外部类的局部变量时,需要加final修饰,不然会报错

事由于局部变量时随着方法调用而产生的,随着调用完毕而消失,而现在局部位置有一个局部内部类,它主要在自己的成员方法位置访问当前的局部变量,必须把变量编程一个常量(需要通过final修饰,自定义常量)这样的一个变量的值永远是固定的.

#局部内部类访问局部变量的综合应用:

packageday_01_jubuneibulei;

public classJuBuCeShi {

public static voidmain(String[] args) {

Occupation oc=newOccupation();//创建外部类的对象,直接调用外部类的成员方法

oc.method();

//TODO自动生成的方法存根

}

}

classOccupation{

privateString vary="teacher";

publicString vary2="student";

public voidmethod(){

finalString vary3="singer";//外部类的局部变量必须要被final修饰

classPerson{

public voidwork(){

System.out.println("学校的工作只要" + vary+ "和" + vary2);

System.out.println("学校的工作不需要" + vary3);//局部类中访问外部类的局部变量,次变量需要加final修饰

}

}

Person p=newPerson();//创建局部内部类的对象,

p.work();//直接调用局部内部类的方法

}

}

11.匿名内部类:是内部类的简化形式

前提条件:必须存在一个接口或者是一个类(可以是具体类,也可以是抽象类)

书写格式:new 接口名或者类名(){方法重写}

匿名内部类的实质:继承了该类(抽象类)或者实现了该接口的子实现类

#匿名内部类的综合应用:

packageNiMing;

public classNiMing {

public static voidmain(String[] args) {

//TODO自动生成的方法存根

NiMIngDemo.method().Run();//用NiMIngDemo类名直接调用Method方法,返回一个接口的对象,然后用接口对象直接调用Run()方法

}

}

interfaceInter{//匿名内部类必须存在一个接口或者一个类

public abstract voidRun();

}

classNiMIngDemo{

public staticInter method(){//该方法的返回值是一个接口

return newInter(){//相当于创建了接口多态的形式:Interi=newInter();

@Override

public voidRun() {//重写了接口中的方法

System.out.println("狗急跳墙");

//TODO自动生成的方法存根

}

};//return后面的代码实质是返回了一个接口对象

}

}

#匿名内部类与接口多态形式调用方法:

packageNiMing;

public classNiMingCeShi {

public static voidmain(String[] args) {

//TODO自动生成的方法存根

System.out.println("-------------通过创建接口的子实现类来访问方法");

inter1 tt=newPerson();

tt.Entertain();

System.out.println("-----------通过匿名内部类调用方法");

NiMingCeShiDemo ncd=newNiMingCeShiDemo();

ncd.method(newinter1(){

@Override

public voidEntertain() {

System.out.println("我的生活中会选择健身来休闲");

//TODO自动生成的方法存根

}

});

}

}

interfaceinter1{

public abstract voidEntertain();

}

classNiMingCeShiDemo{

public voidmethod(inter1 t){

t.Entertain();

}

}

classPersonimplementsinter1{//通过创建接口的子实现类

@Override

public voidEntertain() {

System.out.println("我的生活中会选择健身,打球,玩吉他来休闲");

//TODO自动生成的方法存根

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。