Java的内部类

Java的内部类

一. 内部类介绍

1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部类,嵌套其他类的称为外部类。内部类是类的五大成员之一(属性 方法 构造器 代码块 内部类)。

2.分类如图所示

在这里插入图片描述

二.成员内部类

1.非静态内部类

说明:

(1) 定义在成员位置中(方法或代码块外面) 无static修饰

(2) 可以直接访问外部类的所有的成员

(3) 可以添加任意权限修饰符

(4) 作用域和其他成员一样作用在整个外部类

代码如下

package com.wangwang;

public class localclass {//外部类
    //属性位置
    private int n1=10;
    class localN1{//局部类
        public void output(){
            //==1==.可以直接访问外部类的所有的成员,包括私有
            System.out.println("获取私有成员"+n1);
        }
    }
    //写一个方法来创建局部类的一个实列
    public void output(){
        localN1 LocalN1 = new localN1();
        LocalN1.output();
    }
}
public class Practice {
    public static void main(String[] args) {
  localclass A1 = new localclass();
       A1.output();
    }
}

在这里插入图片描述

2.静态内部类

说明:定义在成员位置中(方法块或代码块外面) 有或无static修饰

1.可以直接访问外部类的静态的成员 不能访问非静态成员

在这里插入图片描述

2.可以添加任意权限修饰符

3.作用域 和其他成员一样作用在整个外部类

代码如下

package com.wangwang;

public class static_localclass {//外部类
    private int n1=10;
    static int n2=20;
    static public class localN2{//静态局部类
        public void output(){
            //==1==.可以直接访问外部类的所有的成员,包括私有
            System.out.println("获取static_localclass私有成员"+n2);
            //System.out.println(n1);
        }
    }
    //写一个方法来创建局部类的一个实列
    public void output(){
        localN2 LocalN2 = new localN2();
        LocalN2.output();
    }
}
public class Practice {
    public static void main(String[] args) {
        static_localclass A1 = new static_localclass();
        A1.output();
    }
}

在这里插入图片描述

三.局部内部类

说明:

(1)局部类是定义在外部类的方法内或者代码块内。

(2)可以直接访问外部类的所有的成员。

(3)不能添加访问修饰符,局部内部类的地位就是一个局部变量(所以可以用fianl修饰)。

(4)作用域:作用在所定义的方法中或者代码块中。

(5)访问方式:局部内部类访问外部外部类成员可以直接访问。外部类访问局部内部类,在外部类作用域内先创建对象再访问。

(6)外部其他类不能访问内部类。

(7)外部类成员与内部类成员重名时,默认就近原则,如果想用外部类的话可以使用:外部类名.this.成员 。

代码如下

package com.wangwang;

public class Named_local_inner_class {//外部类
    private int a1 = 1;
    int a2 = 2;
    private void fun(){
        System.out.println("输出了私有方法");
    }
    //第一种情况 在方法中
    public void output(){
        class inner_class{//局部内部类
            private int a1 = 10;//内部类成员与外部类成员名相同
            //可以访问外部类的所有成员
            public void _output(){
                System.out.println("内部类的a1="+a1+"\t"+"外部类的a1="+Named_local_inner_class.this.a1);//访问的私有成员
                System.out.println("a2="+a2);
                fun();
            }
        }
    }
}

1.有名的局部内部类

  • 错误代码

package com.wangwang;

public class Named_local_inner_class {//外部类
    private int a1 = 1;
    int a2 = 2;

    private void fun() {
        System.out.println("输出了私有方法");
    }

    //第一种情况 在方法中
    public void m1() {
        class inner_class {...
        }
        //不能添加访问修饰符
    public class inner_class2{}//不能添加访问修饰符
        final class inner_class3{}//本质还是一个类
    }
}
  • 正确代码

package com.wangwang;

public class Named_local_inner_class {//外部类
    private int a1 = 1;
    int a2 = 2;

    private void fun() {
        System.out.println("输出了私有方法");
    }
    //第一种情况 在方法中
    //第二种情况 在代码块中
    //在此以方法中为例
   public void output(){//方法
        class inner_class{//局部内
            //可以访问外部类的所有成员

            public void _output(){
                System.out.println("a1=" +a1);//访问的私有成员
                System.out.println("a2="+a2);
                fun();
            }
        }
        //只需要实例化就行 然后调用output() 注意作用域
       inner_class Inner_class = new inner_class();
        Inner_class._output();
   }
}//外部类

public class Practice {
    public static void main(String[] args) {
        Named_local_inner_class A1 = new Named_local_inner_class();
        A1.output();
    }
}

在这里插入图片描述

2.匿名局部内部类

(1)本质还是一个内部类 就是一个类 该类没有名字 (其实是有名字的 但我们看不见 系统分配)

(2)同时还是一个对象

基本语法

new 类名或接口名(参数列表){
    类体
        };
interface A2{//接口
    public void output();
}

调用匿名内部类

//基于接口的匿名内部类A2
A2 A22 = new A2() {
    public void output() {
        System.out.println("A2接口匿名调用");
    }
};
A22.output();
  • 和有名的局部内部类的区分

1.A22对象只使用一次 以后不再使用时用匿名局部内部类

2.A22的编译类型和运行类型(匿名局部内部类 就是XXXXX.外部类名)

如图

package com.wangwang;

import sun.security.rsa.RSAUtil;

public class _main {
    public static void main(String[] args) {
        //有名的局部内部类
        Named_local_inner_class p1 = new Named_local_inner_class();
        p1.output();
        //匿名的局部内部类
        System.out.println("==========");
        //基于接口的匿名内部类A2
        A2 A22 = new A2(){
            public void output(){
                System.out.println("A2接口匿名调用");
            }
        };
        A22.output();
        System.out.println("A22的运行结果是"+A22.getClass());
    }
}

ystem.out.println(“==========”);
//基于接口的匿名内部类A2
A2 A22 = new A2(){
public void output(){
System.out.println(“A2接口匿名调用”);
}
};
A22.output();
System.out.println(“A22的运行结果是”+A22.getClass());
}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值