一.静态内部类
1)内部类之前修饰static关键字
2)特性:
◆可以有实例,静态成员(字段,方法)
◆实例方法中,无法访问外部实例成员
实例:静态内部类特性测试
public class StaticInnerClass{
public static void main(String []args){
//Outer2.Inner2 inner=new Outer2.Inner2();//构造一个静态内部类对象
Outer2 outer=new Outer2();
outer.outerShow();
}
}
class Outer2{
private String name="张三";
private int num1=10;
private static int num3=100;
public void outerShow(){
System.out.println(name);
System.out.println(num1);
Inner2 inner2=new Inner2();
System.out.println(inner2.name);
System.out.println(Inner2.num3);
}
public static class Inner2{
private String name="李四";
private int num2=20;
private static int num3=10;
public void innerShow(){
//System.out.println(Outer2.this.name);
//静态内部类不能访问外部类的非静态成员
System.out.println(Outer2.num3);
System.out.println(num2);
}
}
}
二、匿名内部类
(1)匿名内部类概念
匿名类是没有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。
(2)匿名内部类语法
new interfacename(or superclass) { //方法重写 }
当某个方法的参数是接口或者抽象类时,调用这个方法时除了可以直接new一个接口的实现类或者抽象类的子类之外,还可以使用匿名内部类的语法实现临时方法重写(只用一次)。
实例:匿名内部类特性测试
public class AnonymousInnerClass{
public static void main(String []args){
Person p=new Person();
new IAnimal(){
private String name="aa";
{
name="哈哈";//代码块优先于构造方法先执行,不能定义静态代码块
}
public void eat(){
System.out.println("啃骨头");
}
public void show(){
System.out.println(name);
}
}.show();
p.feed(new IAnimal(){
public void eat(){
System.out.println("吃鱼肉");
}
});
}
}
class Person{
public void feed(IAnimal animal){
animal.eat();
}
}
interface IAnimal{
public abstract void eat();
}
三、局部内部类
(1)局部内部类特点:
①定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
②局部内部类访问外部类的属性和方法使用“外部类名.this.属性名”和“外部类名.this.方法名(参数)”的形式。
③对外部世界完全隐藏,只能在其作用域内生成对象。
(2)局部内部类有以下限制:
①局部类不能加访问修饰符,因为它们不是类成员。
②成员内部类不能与外部类重名。
③局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰
实例:局部内部类特性测试
public class LocalInnerClass{
public static void main(String []args){
Outer3 outer=new Outer3();
outer.showOuter();
}
}
class Outer3{
private String name="zhangsan";
private int num1=10;
private static int num2=20;
public void showOuter(){
final int num4=50;
//局部内部类不能加访问修饰符
class Inner3{
private int num3=30;
private int num1=20;
public void showInner(){
System.out.println(num3);
System.out.println(num1);
System.out.println(Outer3.this.num1);
System.out.println(Outer3.num2);
System.out.println(num4);
//局部内部类只能访问声明其方法中的常量.
}
}
Inner3 inner=new Inner3();
inner.showInner();
}
}