Java内部类

(一)简单内部类(直接定义在外部类的域中)

简单内部类相当于外部类的一个普通成员,因此内部类可以访问到外部类的所有成员(包括private成员)

而外部类一旦有一个内部类的对象,就可以访问该对象的所有成员(包括private成员)

需要注意的是如果只是定义了内部类,那么在外部类中是没有该内部类的对象实例的,需要在外部类中声明该内部类对象然后将其初始化

public class A{
    ...
    public class InnerA{
         ...
    }
    ...
}

1.内部类访问外部类

内部类可访问外部类所有成员

public class A{
    //外部类成员
    private int a1=1;
    private static int a2=1;
    //外部类方法
    private int getA1(){return a1;}
    private static int getA2(){return a2;}
    
    public class InnerA{
        //内部类可访问外部类所有成员
        private int ia=a1+a2+getA1()+getA2()+A.getA2();
    }
}

可以直接使用外部类成员名来访问

private int ia=a1+a2+getA1()+getA2()+A.getA2();

但严谨一点可使用外部类引用(OuterClass.this)来访问

private int ia=A.this.a1+A.this.a2+A.this.getA1()+A.this.getA2();

2.外部类访问内部类

外部类也可以访问到内部类的所有成员(包括private),但必须通过内部类对象来访问

    //外部类访问内部类
    public int getInnerAia(){
        //获得内部类对象
        InnerA innerA=new InnerA();
        return innerA.ia;
    }

3.内部类访问另一内部类

内部类之间也可以相互访问私有成员,但是必须要有实体对象才能访问

    public class InnerA{
        private int ia=A.this.a1+A.this.a2+A.this.getA1()+A.this.getA2();
        private int getIa(){return ia;}
    }
    
    private class InnerB{
        //错误访问
        //private int ib=ia
        //正确访问,实例对象
        private int ib=new InnerA().ia;
    }

4.其他类访问内部类

把内部类看成一个外部类的成员,那么其他类就只能访问到public的内部类(同一包下default和proteced也可以)

public class A{
    ...

    public class InnerA{
        private int ia=A.this.a1+A.this.a2+A.this.getA1()+A.this.getA2();
        public int getIa(){return ia;}
    }

    private class InnerB{
        ...
    }
}

class otherClass{
    public void getAInnerClass(){
        A aClass=new A();
        A.InnerA aInnnerClass=aClass.new InnerA();
aInnerClass.getIa();
     //不能访问到private的InnerB
    }
}

 5.嵌套内部类

public class A{
    ...
    public class InnerA{
        private int ia=A.this.a1+A.this.a2+A.this.getA1()+A.this.getA2();
        public int getIa(){return ia;}

        //嵌套内部类
        public class InnerC{
            private int ic=ia;
        }
    }

嵌套内部类InnerC相当于InnerA的成员,因此它只能访问InnerA的所有成员,而不能访问到A

 

(二)局部内部类

当只需要使用一次时,在一个方法中定义的内部类,不能有public或private修饰,作用域被限制在这个局部类的块中,因此外部类的其他成员也无法访问它,但是它却可以访问除了该方法外的其他外部成员

    public void testMethodInnerClass(){
        int methodId=1;
        class c{
            int getMethodId(){
                return methodId+a1;
            }
        }
    }

 

(三)匿名内部类

 当只需创建一个类的对象就不需要命名的类

 构造函数的小括号后跟的一个大括号,里面定义的就是匿名内部类

    public static void main(String[] argv){
        A a=new A()
        {
            int myA=10086;
            int getMyA(){return myA;}
        };
        
        //双括号初始化,创建一个只是用一次的匿名arrayList
        //第一个括号说明是匿名内部类,第二个括号是初始化块:嗲用ArrayList的add方法添加元素
        new ArrayList<String>(){{add("1");add("2");}};
    }

 

 (四)静态内部类

当内部类不需要引用外部类的成员时,可设为static

最景帝啊的运用是用作对象返回多个值,此例子遍历一次数组可返回最大最小值,就是通过内部类对象存储两个值然后返回实现

/**
 * @ClassName Arraylg
 * @Description TODO
 * @Author cherry
 * @Date 2018/6/11 11:23
 * @Update 2018/6/11 11:23
 **/
public class Arraylg{
    /**
     * 用于存放两个double值,当外部类方法需要返回两个值时返回它即可
     */
    public static class Pair{
        private double first;
        private double second;

        public Pair(double f,double s){
            this.first=f;
            this.second=s;
        }

        public double getFirst(){
            return first;
        }

        public double getSecond(){
            return second;
        }
    }

    /**
     * 返回Pair可以求得double数组的最大最小值
     * @param values
     * @return
     */
    public static Pair minmax(double[] values){
        double min=Double.POSITIVE_INFINITY;
        double max=Double.NEGATIVE_INFINITY;
        for(double v:values){
            if(min>v)min=v;
            if(max<v)max=v;
        }
        return new Pair(min,max);
    }
}

class Test{
    public static void main(String[] argv){
        Arraylg.Pair pair=Arraylg.minmax(new double[]{5.0,10.0,1.0,4.5,9.1});
        System.out.println("max:"+pair.getSecond());
        System.out.println("min:"+pair.getFirst());
    }
}

 

 

 

注意事项

  • 内部类不允许有static方法和static数据域
  • 所有类只有内部类可以是private的
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务