内部类:
把类A定义在类B的内部,类A就被称为内部类。
访问特点:
(代码验证只要编译通过说明就是没有问题的)
A:内部类可以直接访问外部类的成员,包括私有。
B:外部类要访问内部类的成员,必须创建对象。
**内部类分类:**
成员位置:成员内部类
局部位置:局部内部类
成员内部类:
外界如何创建对象
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
局部内部类:
A:可以直接访问外部类的成员,包括私有
B:在成员方法中创建局部内部类的对象,调用局部内部类的功能
- 练习:
需求:请补齐代码,在控制台输出30,20,10
*/
class Outer {
public int num = 10;
private class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?);
System.out.println(?);
System.out.println(?);
}
}
public void method() {
Inner i = new Inner();
i.show();
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
解答:
System.out.println(?);//num
System.out.println(?);//this.num
System.out.println(?);//new Outer().num或者Outer.this.num
第一个在方法内被定义,直接调用即可;
第二个在内部类中定义,可使用this.来调用。
第三个在外嵌类中定义,而num不是被static修饰的,所以不能用类名.num来调用,应该用new Outer().num。
匿名内部类
没有名字的局部内部类,就是内部类的简化写法
前提:
存在一个类或者接口
这里的类可以是具体类也可以是抽象类。格式:
new 类名或者接口名() {
重写方法;
};本质:
是一个继承了类或者实现了接口的子类匿名对象。
练习:
按照要求,补齐代码
要求在控制台输出”HelloWorld”
*/
interface Inter {
void show();
}
class Outer {
//补齐代码
}
class InnerClassTest {
public static void main(String[] args) {
Outer.method().show();
}
}
解答:
class Outer {
//补齐代码
public static Inter method(){
return new Inter(){
public void show() {
System.out.println("HelloWorld");
}
};
}
}