您的位置:首页 > 其它

静态内部类、匿名内部类、局部内部类

2016-03-05 22:48 363 查看

一.静态内部类

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: