1.定义:把类定义在其他类的内部,这个类就被称为内部类。
class Outer{
class Inter{
}
}
2.内部类的访问特点
(1)内部类可以直接访问外部类的成员,包括私有的;
(2)外部类要想访问内部类的成员,必须先创建对象。
3.内部类的位置
* 成员位置:在成员位置定义类,被称为成员内部类;
* 局部位置:在局部位置定义类,被成为局部内部类。
class Outer{
// 成员内部类
class Inter{
}
//局部内部类
public void demo() {
class Inter{
}
}
}
4.如何直接访问成员内部类的成员
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
package interclass;
/*
* 直接访问成员内部类的成员
*/
class Outer{
//成员内部类
class Inter{
public void show() {
System.out.println("Hello");
}
}
}
public class test1 {
public static void main(String[] args) {
//格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inter oi = new Outer().new Inter();
oi.show();
}
}
5.成员内部类的修饰符:
(1)private:为了保证数据的安全性;
(2)static:为了方便数据访问(静态内部类访问的外部类数据必须用静态修饰)。
成员内部类被静态修饰后的访问格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名
Outer.Inter oi = new Outer.Inter();
6.如何访问局部内部类的成员
/*
* 访问局部内部类
*/
class Outer{
private int num = 10;
public void method() {
//局部内部类
class Inter{
public void show() {
System.out.println(num);
}
}
Inter i = new Inter();
i.show();
}
}
public class test1 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
7.匿名内部类
(1)内部类的简化写法;
(2)前提:存在一个类或者接口(这里的类可以是具体类,也可以是抽象类);
(3)格式:
new 类名或者接口名() {
重写方法;
};
(4)本质:是一个继承了该类或者实现了该接口的子类的对象。
8.匿名内部类的方法调用(存在一个方法和存在多个方法时)
package interclass;
interface Interr{
public abstract void show();
public abstract void show2();
}
/*
* 只有一个方法时
class Outerr{
public void show2() {
new Interr() {
public void show() {
System.out.println("Hello");
}
}.show();
}
}
*/
//有多个方法时
class Outerr {
public void show3() {
Interr i = new Interr() {
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
};
i.show();
i.show2();
}
}
public class Test2 {
public static void main(String[] args) {
Outerr o = new Outerr();
o.show3();
}
}