Java内部类的分类

内部类分类:

  • 成员内部类
  • 匿名内部类
  • 局部内部类

一、成员内部类

是指可以用private protect default public任意一个进行修饰的,类文件名:外部类$内部类.class
a)非静态内部类
外部类可以使用内部类和我们平时使用其它的类没什么区别。
1)非静态内部类必须寄存在。因此如果有一个非静态内部类对象被创建,那么它的外部类对象一定会被创建,非静态内部类对象单独属于外部类的某个对象。
2)非静态内部类对象可以单独访问外部类成员,但外部类对象不能直接访问非静态内部类的成员。
3)非静态内部类是属于外部类的某个对象,因此不能有静态方法,属性,静态初始化块。
4)外部类的静态方法不能使用非静态内部类(因为非静态内部类是属于对象的,外部类的静态方法是属于外部类的,外部类对象还未被创建,因此不能用),包括不能使用非静态内部类定义变量,创建实例,但非静态内部类可以使用外部类的属性及方法。
内部类的成员变量访问要点
1)内部类方法的局部变量:直接访问。
2)内部类属性:this.属性名
3)内部类访问外部类属性:外部类.this.属性名
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass {
   
    public static void main(String[] args) {
   
        //生成内部类对象
        Outer.inner inner = new Outer().new inner();
        inner.show();

    }
}

class Outer{
   
    public  int age = 100;
    void testOuter(){
   
        System.out.println("外部类对象");
    }
    class inner{
   
        int ageInner = 80;
        public void show(){
   
            int ageFun = 300;
            System.out.println("外部类成员变量:"+Outer.this.age);
            System.out.println("内部类成员变量:"+this.ageInner);
            System.out.println("内部类成员变量:"+ageFun);
        }

    }
}

b)静态内部类

static  class   ClassName {
   
//类体
}

静态内部类使用要点
1)当一个静态内部类存在时并不一定存在外部类对象,内部类属于外部类,不属于外部类对象,因此,静态内部类的实例方法不能直接访问外部类的实例和方法。
2)静态内部类属于外部类的一个静态成员,因此外部类可以通过 “静态内部类.名字”的方式访问静态内部类的静态成员,通过new静态内部类访问静态内部类的实例。
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass02 {
   
    public static void main(String[] args) {
   
        //创建静态内部类对象
        Outer2.Inner2 inner2 = new Outer2.Inner2();
        inner2.show();

        //执行外部了的方法
        new Outer2().show();
    }
}

class Outer2{
   

    String name;
    int age;
    public void show(){
   
        System.out.println("外部类访问内部类成员"+new Inner2().age);
    }
    //静态内部类
    static class Inner2{
   

        int age = 100;
        public void show(){
   
            /** * 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 * 因此,静态内部类的实例方法不能直接访问外部类的实例方法。 */
            //System.out.println(Outer2.this.age);
            System.out.println("staic inner2");
        }
    }
}

二、匿名内部类

匿名内部类使用要点
1)匿名内部类没有访问修饰符
2)匿名内部类没有构造方法,因为它连名字都没有哪来的构造器

package com.liuzeyu12a.OOT;

public class TestAnonymousInner {
   

    public static void main(String[] args) {
   
        /** * 这里说明一下为什么System.out.println("测试匿名内部类"); * 没有被实现,因为这个是new 接口实现类的时候必须实现的方法 * 但是这个方法并没有被调用,所以并不会被运行 */
        TestAnonymousInner.test(new AA() {
   
            @Override
            public void aa() {
   
                System.out.println("测试匿名内部类");
            }
        });
    }

    static void test(AA aa){
   
        System.out.println("test AA ==>" + AA.aa);
    }
}
//接口AA
interface AA{
   
    int aa = 100;
    void aa();
}

二、局部内部类

还有一种内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。

  局部内部类的的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。

  局部内部类在实际开发中应用很少。
public class Test2 {
   
    public void show() {
   
        //作用域仅限于该方法
        class Inner {
   
            public void fun() {
   
                System.out.println("helloworld");
            }
        }
        new Inner().fun();
    }
    public static void main(String[] args) {
   
        new Test2().show();		//输出helloworld
    }
}
全部评论

相关推荐

07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
asdasdasda...:19岁,不容易啊可能升个本会好点,现在学历歧视太严重了
点赞 评论 收藏
分享
06-14 19:09
门头沟学院 Java
darius_:给制造业搞的,什么物料管理生产管理,设备管理点检,最最关键的就是一堆报表看板。个人觉得没啥技术含量都是些基本的crud,但是业务很繁琐那种
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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