java语言第十一篇(内部类)

主要内容:

分类

特点

Lambda 表达式

有名内部类:

内部类是指在一个外部类内定义的类。

按照是否有类名分为有名内部类和匿名内部类。

有名内部类

  先创建外部类对象                 this可以省略

说明:全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围;

匿名内部类:

      匿名内部类

1.匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:

   new 父类构造器([参数列表])|接口(){   

       //匿名内部类类体

   }

   普通类:普通类匿名内部类实质为普通类的子类

调用Mammal中的无参构造方法

 抽象类:抽象类匿名内部类实质为抽象类的子类

调用Mammal中的有参构造方法

 接口:接口匿名内部类实质为接口的实现类。

匿名内部类特点:

Ø匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类;

Ø匿名内部类不能有构造方法,但是可以通过非静态代码块初始化成员变量;

Ø匿名内部类一定不能是抽象类;

Ø可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用,例如:

                     

同一个匿名内部类对象只能调用一个新增的属性或方法,无法再调用实现的抽象方法、重写的方法或继承的方法,也无法调用继承的属性

按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,非静态内部类前面已经讲过,这里不再赘述。

静态有名内部类

                    本类使用则无须使用外部类类名

 

body:跨类使用则须“外部类类名.内部类名

静态匿名内部类:

注意

Ø如果为static内部类只能直接定义在外部类中。

Ø静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。

1、由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对象。

2、由于print方法为静态方法,所以可以直接使用。

Ø在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。

程序出错,因为内部类作用范围无法作用到这里。

Ø只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。

特点:

内部类特点

Ø内部类是一个独立的类编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名+$+内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类的类名+$+数字;

Ø普通外部类、抽象类和接口可以有内部类(匿名的或有名的);

Ø内部类可以直接定义在类中,也可以定义在方法或代码块中;其中直接定义在外部类中的内部类可以有publicprotected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用publicdefault修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);但是定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。

Ø内部类可以访问外部类的所有访问权限的成员变量,如下例:

Ø在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。

由于局部变量weight要在InClass内部类中使用,所以需要加final

由于局部变量name要在InClass内部类中使用,所以需要加final;方法参数前面加final修饰表示只能在调用方法时为该参数指定值,不允许再在方法体中进行二次修改

       注意:从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以使用final修饰。

Lambda 表达式:

Java支持Lambda 表达式始于Java 8,它的出现简化函数式接口匿名内部类的语法,其表达式语法如下:([参数1], [参数2], [参数3],.... [参数n])->{代码块}

示例

匿名内部类                                                                                  Lambda 表达式

                   

如果方法没有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->单行语句,如下例:

示例

如果方法返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->表达式,如下例:

示例

        匿名内部类                                                                      Lambda 表达式

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值