什么是内部类?
放在一个类的内部的类,我们称之为内部类
为什么使用内部类?
1.内部类提供了更好的封装,只有外部类才可以直接访问内部类。
2.内部类可以继承和实现接口,不收外部类的影响。
3.内部类的方法和属性即使是外部类也不能直接访问,而内部类却可以随时访问外部类的属性和方法。
4.有利于回调函数的编写
Java内部类共分为4种
成员内部类
方法(局部)内部类
匿名内部类
静态内部类
使用方法
成员内部类
/**
* 成员内部类
* 1.不能有static修饰的变量和方法,如果有必须加上final修饰
* 2.成员内部类是依附外部类的,只有创建外部类才能创建内部类
* 3.外部类不能直接访问内部类的属性和方法,需要一个内部类的一个实例来访问
*
* @author Administrator
*
*/
public class Outer {
private int num=5;
class Inner{
private int num=10;
public void print(){
//调用内部类变量
System.out.println("内部类方法"+num);
//调用外部类变量
System.out.println("外部类方法"+Outer.this.num);
}
}
public void print(){
System.out.println("外部类方法");
}
public static void main(String[] args) {
//方式一
//创建外部类对象
Outer out=new Outer();
//创建内部类对象
Inner inner = out.new Inner();
inner.print();
//外部类方法
out.print();
//方式二
//创建内部类对象
Outer.Inner in=new Outer().new Inner();
//调用内部类方法
in.print();
}
}
方法(局部)内部类
/**
* 方法内部类
* 1.不可以有静态变量
* 2.只能调用方法内的常量
* 3.不能有访问修饰符
* @author Administrator
*
*/
public class Outer1 {
public void print(){
final int nums=5;
class Inner{
private int num=10;
public void print(){
System.out.println("内部类方法变量"+this.num);
//调用方法内变量
System.out.println("外部类方法变量"+nums);
}
}
//调用内部类方法
new Inner().print();
}
public static void main(String[] args) {
new Outer1().print();
}
}
匿名内部类
/**
* 匿名内部类
* 1.必须继承一个抽象类或接口
* 2.不能有static修饰的成员变量和方法,只能用final修饰
* 3.所在方法内变量都必须使用final修饰
* 4.没有访问修饰符
* 5.没有构造,因为他没有类名
* @author Administrator
*
*/
public class Outer2 {
private int num=5;
public void print(){
final int num=10;
new Inner(){
public void print() {
System.out.println("外部类"+Outer2.this.num);
System.out.println("内部类"+num);
}
}.print();
}
//定义一个接口
interface Inner{
void print();
}
public static void main(String[] args) {
new Outer2().print();
}
}
静态内部类
/**
* 静态内部类
* 1.不需要依赖外部类,可以直接创建
* 2.静态内部类不能使用外部类的非静态成员和方法,而内部类可以
* 3.不能使用 外部类名.this.属性名/方法
* @author Administrator
*
*/
public class Outer3 {
private static int nums=5;
//创建静态内部类
static class Inner{
private int num=10;
public void print(){
System.out.println("内部类"+num);
System.out.println("外部类"+nums);
}
}
public static void main(String[] args) {
Inner in=new Inner();
in.print();
}
}