(引用类型作形参和返回值)(内部类)

一、类名作为形参和返回值

  • 方法的形参是类名,其实需要的是该类的对象
  • 方法的返回值是类名,其实返回的是该类的对象

二、抽象类名作为形参和返回值

  • 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
  • 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

三、接口名作为形参和返回值

  • 方法的形参是接口名,其实需要的是该接口的实现类对象
  • 方法的返回值是接口名,其实返回的是该接口的实现类对象。

四、内部类

内部类就是在一个类中定义一个类。

定义格式

1
2
3
4
5
public class Outer{
public class Inner{ //内部类

}
}

内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Outer {
private int a=10;
//内部类
public class Inner{
public void show(){
System.out.println(a);
}
}
//成员方法
public void method(){
Inner i=new Inner();
i.show();
}
}

按照内部类在类中的位置不同,可以分为如下两种形式

  • 在类的成员位置:成员内部类
  • 在类的局部位置:局部内部类

①成员内部类

成员内部类的外界创建对象是用格式:

1
2
3
//外部类.内部类名 对象名 = new 外部类.内部类对象

Outer.Inner oi=new Outer().new Inner();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package innerClass;

public class Outer {
private int a=10;
//内部类
public class Inner{
public void show(){
System.out.println(a);
}
}
public static void main(String[] args) {
Outer.Inner oi=new Outer().new Inner();
oi.show(); //输出10
}
}

实际的开发中并不会这样访问内部类,而是通过外部类的方法来间接访问,修改代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package innerClass;

public class Outer {
private int a=10;
//内部类
public class Inner{
public void show(){
System.out.println(a);
}
}
public void show(){
Inner i=new Inner();
System.out.println(a);
}
public static void main(String[] args) {
Outer o=new Outer();
o.show(); //输出10
}
}

②局部内部类

局部内部类是在方法中定义的类,所以外界无法直接使用,需要在方法内部创建对象并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package innerClass;

public class OuterDemo {
int num=10;

public void method(){

class Inner{
int num2=20;
public void show(){
System.out.println(num); //10
System.out.println(num2); //20
}
}
Inner i=new Inner();
i.show();
}
public static void main(String[] args) {
OuterDemo o=new OuterDemo();
o.method();
}

}

匿名内部类

匿名内部类属于局部内部类的一种,简单说就是没有名字的内部类

前提是存在一个类或者接口,这里的类可以是具体类也可以是抽象类

  • 格式

    1
    2
    3
    new 类名或接口名(){
    重写方法;
    }
  • 范例

    1
    2
    3
    4
    new Inter(){
    public void show(){
    }
    }

    匿名内部类的本质:是一个继承了该类或实现了该接口的子类匿名对象

开发中使用匿名内部类

满足下面条件使用匿名内部类比较合适:

  1. 只用到类的一个实例
  2. 类在定义后马上用的到
  3. 类非常小
  4. 给类命名并不会导致你的代码更容易被理解

使用原则

  1. 匿名内部类不能有构造方法
  2. 匿名内部类不能定义任何静态成员、方法和类
  3. 匿名内部类不能是public、protected、private、static
  4. 只能创建匿名内部类的一个实例
  5. 一个匿名内部类一定是在new的后面,用其隐含实现一个借口或实现一个类
  6. 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效

请我喝杯咖啡吧~

支付宝
微信