内部类专题(自学)
Posted ren549047861
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类专题(自学)相关的知识,希望对你有一定的参考价值。
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.什么时候会使用匿名内部类?
有些情况下,某些类创建对象一次后再也不使用了。这种情况下就可以不提供有名字的类,而是使用匿名内部类。
以上是关于内部类专题(自学)的主要内容,如果未能解决你的问题,请参考以下文章