内部类的定义
何为内部类,内部类就是在一个类或者一个方法或者一个代码块中定义的类。
内部类的作用
- 封装。将不想公开的实现细节封装到一个内部类中,内部类可以声明为私有的,只能在所在外
部类中访问。 - 提供命名空间。静态内部类和外部类能够提供有别于包的命名空间。
- 便于访问外部类成员。内部类能够很方便访问所在外部类的成员,包括私有成员也能访问。
内部类的分类
成员内部类
实例内部类与实例变量类似,可以声明为公有级别、私有级别、默认级别或保护级别,即4种访问级别都可以,而外部类只能声明为公有或默认级别。
package com.a51Work6;
//外部类
public class Outer {
//外部类成员变量
private int x=10;
//外部类方法
private void print(){
System.out.println("调用外部类方法");
}
//测试调用内部类方法
public void test(){
Inter inter=new Inter();
inter.display();
}
//内部类
class Inter{
//内部类成员变量
private int x=5;
//内部类方法
void display(){
//访问外部类的成员变量x
System.out.println("外部类册成员变量x="+Outer.this.x);
//访问内部类的成员变量x
System.out.println("内部类成员变量x="+this.x);
System.out.println("内部类成员变量x="+x);
//调用外部类的成员方法
Outer.this.print();
print();
}
}
}
package com.a51Work6;
public class Main {
public static void main(String[] args) {
//通过外部类访问内部类
Outer outer =new Outer();
outer.test();
System.out.println("----------直接访问内部类-------------");
//直接访问内部类
Outer.Inter inter= outer.new Inter();
inter.display();
}
}
静态内部类
静态内部类与静态变量类似,在声明的时候使用关键字static修饰,静态内部类只能访问外部类静态成员,所以静态内部类使用的场景不多。但可以提供有别于包的命名空间。
package com.a51Work7;
//外部类
public class View {
//外部类实例变量
private int x=20;
//外部类静态变量
private static int staticX=10;
//静态内部类
static class Button{
//内部类方法
void onClick(){
//访问外部类的静态成员
System.out.println("staticX:"+staticX);
}
}
}
package com.a51Work7;
public class Main {
public static void main(String[] args) {
//直接访问内部类
View.Button button=new View.Button();
button.onClick();
}
}
局部内部类
局部内部类就是在方法体或代码块中定义的内部类,局部内部类的作用域仅限于方法体或代码块中。局部内部类访问级别只能是默认的,不能是公有的、私有的和保护的访问级别,即不能使用public、privateprotected修饰。局部内部类也不能是静态,即不能使用static修饰。局部内部类可以访问外部
类所有成员。
//Outer.java文件
package com.com.a51Work8;
//外部类
public class Outer {
// 外部类成员变量
private int value = 10;
// 外部类方法
public void add(final int x, int y) {
//局部变量
int z = 100;
// 定义内部类
class Inner {
// 内部类方法
void display() {
int sum = x + z + value;
System.out.println("sum = " + sum);
}
}
//声明匿名对象
new Inner().display();
}
}
package com.com.a51Work8;
public class Main {
public static void main(String[] args) {
Outer outer=new Outer();
outer.add(100,300);
}
}
匿名内部类
匿名内部类是没有名字的内部类,本质上是没有名的局部内部类,具有局部内部类所有特征。例如:可以访问外部类所有成员。如果匿名内部类在方法中定义,它所访问的参数需要声明为final的。
package com.a51Work9;
public interface OnClickListener {
void onClick();
}
package com.a51Work9;
public class View {
public void handler(OnClickListener listener){
listener.onClick();
}
}
package com.a51Work9;
public class Main {
public static void main(String[] args) {
View v=new View();
v.handler(new OnClickListener() {
@Override
public void onClick() {
System.out.println("实现接口的匿名内部类。。。");
}
});
}
}
点击链接加入群聊【程序员技术交流群】:添加链接描述