栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
    }

}

测试结果:

 

好了,就说到这。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号