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

一.静态内部类

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值