java之匿名对象,成员内部类,局部类部类,匿名内部类

整体分析如下:

匿名对象大致内存空间:

下面说一下成员内部类的用法:

先看一个inner.java:

package innner;

public class Inner1 {
    int age = 25;
    String name = "孙悟空";
    String skill = "我能吹牛逼";


    public Inner1() {
    }

    public Inner1(int age, String name) {
        this.age = age;
        this.name = name;
    }

    //成员内部类,此类是default属性,在同一个包中能被继承与访问,挎包之后不能被继承,也不能被访问
    class Son{
        int age = 1;
        String name = "猪八戒";


        public Son() {
        }

        public Son(int age, String name) {
            this.age = age;
            this.name = name;
        }

        //成员内部类访问内部成员
        void sayOut() {
            System.out.println(name);//就近原则,存在同名成员,优先访问内部类的
            System.out.println(Inner1.this.name);//存在同名成员时这样访问
            System.out.println(skill);//不同名,直接可以调用内部类成员
            System.out.println(Inner1.this.skill);//这样访问也可以
        }

    }
}

 在来一个她的获取文件InnerGet.java:

package innner;

public class InnerGet {
    public static void main(String[] args) {
        //成员内部类的获取方式
        Inner1.Son son = new Inner1().new Son();
        son.sayOut();
    }
}

运行结果:

成员内部类独特的一点说明:

当内部类成员存在静态成员的时候,该内部类也要用static修饰:

上面就是age用static修饰了,它的外部类也要用static修饰,后面再说原因,这个时候如内部类设置成了static,那么我们里面的函数,就不能访问非静态成员,不能有this。

上面就会报错,因为你加了this,还访问了外部类的一个成员skill,为什么skill访问也出错,因为你整个类是先于外部类存在的。

代码修改:

 这个时候,访问内部类数据是可以的。那么我们如何去访问静态变量age:

上面就能打印出结果,那么现在就来说一下,为什么当成员内部类出现一个静态成员时候,该类也要用静态修饰的原因:

首先age可以是Son.age访问,那么Son就必须Inner.Son访问。Son不设置成静态,Inner怎么通过类名访问Son,所以,通过访问方式也要知道它必须被设置成静态的原因。

 局部内部类就不多了,去参考我java第一篇中就可以了。注意一点就是一旦类去访问了函数的局部变量,这个变量就必须被final修饰,表明它的生命周期被延长了。

下面说一下匿名内部类:

可以有名字也可以没名字

前提:必须存在继承与实现的关系

那我们来看一个接口:

FunctionInterface1.java:

@FunctionalInterface
public interface FunctionInterface1 {
    void say();
}

然后我们用这个来实例一下匿名内部类的用法:Simple1.java:

public class Simple1 {
    public static void main(String[] args) {

        String str1 = "i";
        String str2 = "love";
        String str3 = "you";

        //做一个匿名内部类
        new FunctionInterface1(){
            @Override
            public void say() {
                System.out.println("这是一个说话的方法");
                System.out.println(str1 + str2 + str3);//可以调用函数定义的变量
            }
        }.say();

        FunctionInterface1 fi = new FunctionInterface1(){
            @Override
            public void say() {
                System.out.println("这是另外一个可以说话的方法");
            }
        };

        fi.say();

        //匿名内部类
        printStr(new FunctionInterface1() {
            @Override
            public void say() {
                System.out.println(str1 + " " + str2 + " " + str3);
            }
        });

    }

    //将匿名内部类用作函数参数来表示
    public static void printStr(FunctionInterface1 fi) {
        fi.say();
    }

}

测试结果:

 

好了,就说到这。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值