内部类专题(自学)

1.方法内部能不能定义类?


可以,是方法内部类。


2.请说明定义内部类的方式,并说明适用于什么情况?


(1)成员内部类:定义在另一个类(外部类)的内部,而且与成员方法和属性平级,属于类的一个成员,可以用private,默认,protected,public四个访问修饰符修饰。
外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
调用方式:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。
(2)静态内部类:被static修饰的成员内部类叫静态内部类。
调用方式:外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)。
(3)局部内部类:定义在代码块或方法体内的类叫局部内部类。
局部内部类只能在代码块和方法体内使用(如创建对象和使用类对象等)。
(4)匿名内部类:特殊的局部内部类。
必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
只能使用一次,创建实例之后,类定义会立即消失。创建:父类(接口) 实例名 = new 父类(){
//匿名内部类需要实现的功能。
}
匿名内部类不能再是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
匿名内部类不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是,匿名内部类拥有与父类相同的所有构造方法。
可以定义代码块,用于实例的初始化。

3.普通成员内部类能不能直接访问外部类的普通成员?


普通成员内部类可以直接访问外部类的成员,如上例:内部类中的innerMethod()方法:
public void innerMethod(){
int num = 40;
System.out.println(OuterClass.this.num);//外部类的成员变量;
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}

4.【上机】写出:调用普通成员内部类的典型方式。


创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。

(1)创建包含内部类的外部类:
public class OuterClass {
//成员变量
private int num=20;
private String name;
//构造方法
public OuterClass() {
super();
}
public OuterClass(String name) {
super();
this.name = name;
}
//成员方法
public void execInnerClass(){
this.name = "abc";
InnerClass ic = new InnerClass();
//ic.num=30;
ic.innerMethod();
}
//内部类
public class InnerClass{
private int num=30;
public InnerClass() {
super();
}
public InnerClass(int num) {
super();
this.num = num;
}
public void innerMethod(){
int num = 40;
System.out.println(OuterClass.this.num);//20
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}
}
}

(2)调用成员内部类:两种常用方法;
1)先创建外部类对象,由外部类对象创建内部类对象
格式:外部类名.内部类名对象名 = 外部类对象.内部类对象;
OuterClass oc2 = new OuterClass();
OuterClass.InnerClass ic = oc2.new InnerClass();

2)创建外部类对象,外部类的方法操作内部类
OuterClass oc = new OuterClass();
oc.execInnerClass();

5.静态成员内部类能不能直接访问外部类普通成员?能不能访问外部类静态成员?


静态内部类
1.不能访问外部类的非静态成员(变量或者方法)。
2.可以访问外部类的静态成员。


6.【上机】写出:调用静态内部类的典型方式。


(1)创建包含静态内部类的外部类:
public class OuterClass{
//成员变量
private static int num=20;
private static String name;
//构造方法
public OuterClass() {
super();
}
public OuterClass(String name) {
super();
this.name = name;
}
//成员方法
public void execInnerClass(){
this.name = "abc";
InnerClass ic = new InnerClass();
//ic.num=30;
ic.innerMethod();
}
//内部类
public static class InnerClass{
private int num=30;
public InnerClass() {
super();
}
public InnerClass(int num) {
super();
this.num = num;
}
public void innerMethod(){
int num = 40;
//System.out.println(OuterClass.this.num);//20
System.out.println(OuterClass.num);
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}
}
}
(2)静态内部类对象可以直接创建实例,不必依附于外部类实例:
OuterClass.InnerClass ic = new OuterClass.InnerClass();
格式:外部类名.内部类名对象名 = new 外部类名.内部类名();

7.什么时候会使用匿名内部类?


有些情况下,某些类创建对象一次后再也不使用了。这种情况下就可以不提供有名字的类,而是使用匿名内部类。

原文地址:https://www.cnblogs.com/ren549047861/p/11294224.html