内部类、匿名内部类、引用类型用法总结、匿名对象、对象数组、可变参数

内部类

(实际中很少使用,只需了解)

什么是内部类:

在一个类中又写了另外一个类(类中类)。

什么时候使用内部类:

一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用。

内部类的分类(按位置划分):

  1. 成员内部类:写在类中方法外的类。
  2. 局部内部类:写在类中方法中的类。

成员内部类的使用:

  • 1)创建外部类对象。例如:

Body  b  =  new  Body();

  • )根据外部类对象创建内部类对象。例如:

Body.Heart  h  =  b.new  Heart();

也可以写在一起:

外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

成员内部类的好处:

可以直接使用外部类的成员,包括私有成员。

成员内部类编译后的结果:

外部类名$内部类名.class.

在内部类的方法中,调用外部类的成员变量:

外部类名.this.成员变量

局部内部类的作用:

在定义好类后,立马创建对象,并使用。

  • 创建好的对象跟着类后面写,也在方法里

局内内部类的好处:

可以直接使用外部类的成员,包括私有成员。

局部内部类编译后的特点:

外部类名  $  数字  内部类名.class

  • 数字的意思是,该方法中,该类的编号。
  • 一个方法可能有几个内部类。

匿名内部类(重点)

概述:

没有名字的内部类。

  • 它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。

前提:

匿名内部类必须继承一个父类或者实现一个父接口。

格式:

new 父类名或者接口名(){
    // 方法重写
    @Override
    public void method() {
        // 执行语句
    }
};

  • 大括号后记得加 ;
  • 此父类不能用final修饰。

保存对象:

  1. ​​​​​​​接口  变量名  =  new 接口();
  2. 父类  变量名  =  new 父类();
  • ​​​​​​​多态

若只是调用方法,则可以不创建保存对象:

new 父类名或者接口名(){
    // 方法重写
    @Override
    public void method() {
        // 执行语句
    }
}.方法名();

本质:

  1. 定义一个没有名字的内部类。
  2. 没有名字的类  实现接口/继承父类。
  3. 创建这个没有名字的类的对象。

优点:

简化接口的使用,一步到位。

缺点:

只能使用一次。(可以创建对象保存)

使用场景:

作为参数传递。

注意事项:

匿名内部类也能定义成员变量。

引用类型用法总结

class作为成员变量

概述:

自定义类型也是类型,和int double是一样的。​​​​​​​

格式:

数据类型  变量名;

注意事项:

  1. 类名作为参数,要传入这个类的对象。
  2. 类名作为成员变量,需要这个类的对象。
  3. 类名作为返回值需要返回这个类的对象。

interface作为参数和返回值

注意事项:

  1. 接口作为参数,传入实现类对象。
  2. 接口作为返回值。需要返回接口的实现类对象。

匿名对象

概述:

没有名字的对象。

创建格式:

new  类名()

有名对象和匿名对象的对比:

  • 代码长短问题
  1. ​​​​​​​有名对象代码长。
  2. 匿名对象代码短。
  • 调用问题​​​​​​​
  1. 有名对象通过名称可以多次调用。
  2. 匿名对象没有名字只能调用一次。

好处:

代码少一点。

使用场景:

  1. 调用一次方法的时候。
  2. 作为参数传递。
  3. 作为方法的返回值。

对象数组

回顾引用数据三种类型:

  1. 数组
  2. 接口

数组格式:

数据类型【】  数组名  =  new 数据类型【长度】;

  • 数组用来存储多个数据的。数组中可以存储基本数据类型,也可以存储对象。
  • 存进对象数组的,就是对象的地址。

可变参数

概述:

  1. JDK1.5的新特性。
  2. 参数个数可以是任意个(0到n个)。

本质:

数组

格式:

数据类型...变量名  【实质上是数组,所以也能说是数组名】

  • 注意,是三个 . 

注意事项:

方法中最多只能有一个可变参数且必须出现在参数列表的最后面。​​​​​​​

猜你喜欢

转载自blog.csdn.net/weixin_41630924/article/details/81393838
今日推荐