Java的内部类总结

 更新时间:2022年01月07日 14:45:15   作者:淡沫初夏Zz  
这篇文章主要为大家介绍了Java的内部类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

前言

最近看了内部类后,总结一下,首先内部类嵌套在其他内部的类,根据出现的位置和关键字,可以分为以下四种类:成员内部类,静态内部类,方法内部类,匿名内部类,接下来就介绍下这四种类,记得耐心看哦

一,成员内部类

1,成员内部类的特点

(1)private不可以用在外部类的声明,但可在内部类声明,成员变量可以是private

(2)内部类,外部类可以相互访问彼此的私有域

A:内部类访问外部类的私有域可以直接访问,因为成员内部类含有隐藏对象

B:外部类访问内部类的私有域通过内部类对象访问

(3)内部类可解决Java中单继承问题

(4)内部类可以对外部隐藏

2,成员内部类的实现

public class Outter {    // 成员变量    private int age = 12;    private String name = "zh";    private static final int A = 20;    //成员内部类    class Inner{        private String a = "hello";        private int age = 20;        public void test(){            System.out.println(a);            // 可以访问外部类的私有域age            System.out.println(Outter.this.age);            //访问自己的age            System.out.println(this.age);            System.out.println(A);        }    }    // 外部类成员方法    public void fun() {        int a = 0;        // 外部类内部创建内部类对象        Inner inner = new Inner();        System.out.println(inner.a);    }}class Test {    public static void main(String[] args) {    //外部类的外部创建内部类对象        Outter.Inner inner = new Outter().new Inner();    }}public class Outter {
    // 成员变量
    private int age = 12;
    private String name = "zh";
    private static final int A = 20;
    //成员内部类
    class Inner{
        private String a = "hello";
        private int age = 20;
        public void test(){
            System.out.println(a);
            // 可以访问外部类的私有域age
            System.out.println(Outter.this.age);
            //访问自己的age
            System.out.println(this.age);
            System.out.println(A);
        }
    }
    // 外部类成员方法
    public void fun() {
        int a = 0;
        // 外部类内部创建内部类对象
        Inner inner = new Inner();
        System.out.println(inner.a);
    }
}
class Test {
    public static void main(String[] args) {
    //外部类的外部创建内部类对象
        Outter.Inner inner = new Outter().new Inner();
    }
}

3,内部类和外部类的关系

A:成员内部类的创建需要依赖于外部类对象

B:内部类和外部类之间相互独立

C:两者的私有属性可以相互访问

D:语法

(1)外部类的内部创建内部类对象

Inner inner = new Inner();

(2)外部类的外部创建内部类对象

Outter.Intter intter = new Outter().new Intter();

E:在内部类的内使用隐藏的this

二,静态内部类

1,静态内部类的特点

(1)定义在外部类的内部使用static修饰,静态内部类无需外部类无需外部类产生对象就可以使用

(2)静态内部类的创建语法

  StaticInnerClass.Inner inner = new StaticInnerClass.Inner();

2,比较成员内部类和静态内部类

(1)成员内部类不能拥有静态域,但可以访问外部的静态域

(2)静态内部类可以拥有成员域,但不能访问外部的成员域

3,静态内部类的实现

public class StaticInnerClass {
    static int age;
    String name;
    //静态内部类--类比--静态变量
    static class Inner{
        private int age;
        public void test(){
            System.out.println(age);
//            System.out.println(name);不能访问外部成员域
        }
    }
    public void fun() {
        Inner inner = new Inner();
    }
}
class Test1 {
    public static void main(String[] args) {
        StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
    }
}

三,方法内部类

1,方法内部类的特点

(1)方法内部类定义在方法内部

(2)对外部完全隐藏,因此不能有任何访问修饰

(3)若要方法的形参只能用,不能改(形参的隐式final声明)

2,方法内部类的实现

//方法内部类
public class FunClass {
    private int age;
    public void fun(int age) {
        class Inner {
            void fun() {
//                System.out.println(age);
            }
        }
        age = 10;
    }
}

四, 匿名内部类

1,匿名内部类的特点

(1)匿名内部类定义在方法内部,类没有名字

(2)必须继承一个抽象类或者实现一个接口

(3)没有构造方法

2,匿名内部类的实现

//实现接口interface IMessage {    void fun();}public class NonNameClass {    public static void main(String[] args) {        //匿名内部类        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                System.out.println("hello A");            }        });        Thread thread1 = new Thread({                System.out.println("hello ");        } );        thread.start();        thread1.start();    }}//实现接口
interface IMessage {
    void fun();
}
public class NonNameClass {
    public static void main(String[] args) {
        //匿名内部类
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello A");
            }
        });
        Thread thread1 = new Thread({
                System.out.println("hello ");
        } );
        thread.start();
        thread1.start();
    }
}

总结

朋友们,看到最后是不是对内部类有了新的认识?

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • SpringBoot整合Thymeleaf小项目及详细流程

    SpringBoot整合Thymeleaf小项目及详细流程

    这篇文章主要介绍了SpringBoot整合Thymeleaf小项目,本项目使用SpringBoot开发,jdbc5.1.48,主要涉及到Mybatis的使用,Thymeleaf的使用,用户密码加密,验证码的设计,图片的文件上传(本文件上传到本地,没有传到数据库)登录过滤,需要的朋友可以参考下
    2022-03-03
  • Spring bean加载控制实现方法

    Spring bean加载控制实现方法

    很多时候我们需要根据不同的条件在容器中加载不同的Bean,或者根据不同的条件来选择是否在容器中加载某个Bean,这就是Bean的加载控制,一般我们可以通过编程式或注解式两种不同的方式来完成Bean的加载控制
    2022-12-12
  • SpringBoot居然有44种应用启动器,你都知道吗

    SpringBoot居然有44种应用启动器,你都知道吗

    很多人都不知道SpringBoot应用启动器竟然有44个,本文就一起来介绍一下,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-01-01
  • 详解微信开发之Author网页授权

    详解微信开发之Author网页授权

    微信开发中,经常有这样的需求:获得用户头像、绑定微信号给用户发信息,那么实现这些的前提就是授权!本文对此进行系统介绍,需要的朋友一起来看下吧
    2016-12-12
  • SpringSecurity-2.7中跨域问题解析

    SpringSecurity-2.7中跨域问题解析

    这篇文章主要介绍了SpringSecurity-2.7中跨域问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • SpringBoot登录验证token拦截器的实现

    SpringBoot登录验证token拦截器的实现

    本文主要介绍了SpringBoot登录验证token拦截器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • mybatis-plus动态数据源读写分离方式

    mybatis-plus动态数据源读写分离方式

    在分布式项目开发中,动态数据源的配置与使用至关重要,通过创建DynamicDatasourceService,实现数据源的动态添加与调用,有效管理主从库操作,减轻数据库压力,此外,通过配置类与@DS注解,实现了灵活的分库查询功能,为高效处理数据提供了强有力的支持
    2024-10-10
  • 关于SpringCloud整合RabbitMQ的实例

    关于SpringCloud整合RabbitMQ的实例

    这篇文章主要介绍了关于SpringCloud整合RabbitMQ的实例,消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,是在消息的传输过程中保存消息的容器,需要的朋友可以参考下
    2023-07-07
  • spring cloud feign实现远程调用服务传输文件的方法

    spring cloud feign实现远程调用服务传输文件的方法

    这篇文章主要介绍了spring cloud feign实现远程调用服务传输文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Java运算符从见过到掌握上

    Java运算符从见过到掌握上

    计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量,本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09

最新评论