java学习之局部内部类

目录

一、内部类简介

二、内部类的分类 

三、局部内部类

第一点

第二点

第三点

第四点

第五点

第六点

第七点


一、内部类简介

 类的五大成员:属性、方法、构造器、代码块、内部类

package com.hspedu.innerclass;

public class InnerClass01 {
    public static void main(String[] args) {

    }
}
class Outer{//外部类
    private int n1 = 100;//属性
    public Outer(int n1) {//构造器
        this.n1 = n1;
    }
    public void m1() {//方法
        System.out.println("m1()");
    }
    {//代码块
        System.out.println("代码块...");
    }
    class Inner{//内部类

    }
}

二、内部类的分类 

三、局部内部类

第一点

局部内部类是定义在外部类的局部位置,通常在方法
package com.hspedu.innerclass;

public class LocalInnerClass {
    public static void main(String[] args) {

    }
}
class Outer02{//外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类Outer02的private方法m2()");
    }
    public void m1(){
        //局部内部类:定义在外部类的局部位置,通常是方法
    
        class Inner02{//局部内部类

          

        }
    }
}

第二点

1.可以直接访问外部类的所有成员,包括private成员
package com.hspedu.innerclass;

public class LocalInnerClass {
    public static void main(String[] args) {

    }
}
class Outer02{//外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类Outer02的private方法m2()");
    }
    public void m1(){
        //1.局部内部类:定义在外部类的局部位置,通常是方法
        
        class Inner02{//局部内部类
            //2.可以直接访问外部类的所有成员,包括private成员
       
            public void f1(){
                System.out.println("n1=" + n1);
                m2();
            }

        }
    }
}

第三点

3.不能添加访问修饰符,但是可以使用 final 修饰

 

  

可以用final来修饰,这样局部内部类Inner03就不可以被继承 

 

第四点

4.作用域:仅仅在定义它的方法或代码块中,类Inner02的作用域仅仅在方法m1()中

    public void m1(){
        //1.局部内部类:定义在外部类的局部位置,通常是方法

        //3.不能添加访问修饰符,但是可以用final修饰
        //用final修饰之后,该类就不能被继承
        //4.作用域:仅仅在定义它的方法或代码块中,类Inner02的作用域仅仅在方法m1()中
         final class Inner02{//局部内部类(本质仍然是一个类)
             //2.可以直接访问外部类的所有成员,包括private成员
            public void f1(){
                
                System.out.println("n1=" + n1);
                m2();
            }
        }
    }

如果在类的代码块中定义一个局部内部类,那么这个局部内部类的作用域就在这个代码块中

 //代码块
    {
        //在代码块中写一个局部内部类,Inner03的作用域仅限于这个代码块
        class Inner04{

        }
    }

 

第五点

5. 局部内部类可以直接访问外部类的成员, 比如 下面 直接访问外部类 n1 和 m2()
class Outer02{//外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类Outer02的private方法m2()");
    }
    public void m1(){
        //1.局部内部类:定义在外部类的局部位置,通常是方法

        //3.不能添加访问修饰符,但是可以用final修饰
        //用final修饰之后,该类就不能被继承
        //4.作用域:仅仅在定义它的方法或代码块中,类Inner02的作用域仅仅在方法m1()中
         final class Inner02{//局部内部类(本质仍然是一个类)
             //2.可以直接访问外部类的所有成员,包括private成员
            public void f1(){
                //5. 局部内部类可以直接访问外部类的成员, 比如 下面 直接访问外部类 n1 和 m2()
                System.out.println("n1=" + n1);
                m2();
            }
        }
        
    }

   
}

第六点

6. 外部类访问内部类的成员: 在方法m1()中, 可以创建 Inner02 对象, 然后调用方法即可
package com.hspedu.innerclass;

public class LocalInnerClass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.m1();
    }
}
class Outer02{//外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类Outer02的private方法m2()");
    }
    public void m1(){
        
         final class Inner02{//局部内部类(本质仍然是一个类)
           
            public void f1(){
                
                System.out.println("n1=" + n1);
                m2();
            }
        }

        //6. 外部类访问内部类的成员: 在方法m1()中, 可以创建 Inner02 对象, 然后调用方法即可
        Inner02 inner02 = new Inner02();
         inner02.f1();
    }


   
}

1.在方法m1()(作用域)中创建局部内部类Inner02的对象实例inner02

2.然后调用局部内部类的方法f1()

3.在main方法中创建外部类Outer02的对象实例outer02

4.调用外部类Outer02中的方法m1()

第七点

7.外部其他类不能访问局部内部类

 第八点

如果外部类和局部内部类的成员重名时, 默认遵循就近原则, 如果想访问外部类的成员,
使用  外部类名.this.成员  去访问
 

package com.hspedu.innerclass;

public class LocalInnerClass {//外部其他类
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.m1();
        System.out.println("outer02的hashCode()=" + outer02);
        //7.外部其他类不能访问局部内部类
        //Inner02 inner021 = new Inner02();
    }
}
class Outer02{//外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类Outer02的private方法m2()");
    }

    public void m1(){
        
         final class Inner02{//局部内部类(本质仍然是一个类)
             private int n1 = 200;
             //2.可以直接访问外部类的所有成员,包括private成员
            public void f1(){
                
                //8.如果外部类和局部内部类的成员重名时, 默认遵循就近原则, 如果想访问外部类的成        员,
                // 使用 外部类名.this.成员  去访问
                //分析:Outer02.this 本质就是外部类的对象, 即哪个对象调用了 m1, Outer02.this 就是哪个对象

                // Outer02.this指的是外部类Outer02的对象,
                // 在这个例子中对象outer02在main方法中调用了m1()方法
                //所以Outer02.this和对象outer02的hashCode值是一样的

                System.out.println("Inner02的n1=" + n1 + "\tOuter02的n1" +     Outer02.this.n1);
                m2();
                System.out.println("Outer02.this的hashCode()=" + Outer02.this);
            }
        }



        //6. 外部类访问内部类的成员: 在方法m1()中, 可以创建 Inner02 对象, 然后调用方法即可
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }

  
}

Outer02.this 本质就是外部类的对象, 即哪个对象调用了 m1, Outer02.this 就是哪个对象

           1)Outer02.this指的是外部类Outer02的对象,
          2)在这个例子中对象outer02在main方法中调用了m1()方法
          3)所以Outer02.this和对象outer02的hashCode值是一样的

运行结果如下:

 

 


                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/12311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AOP与SpringBoot使用AOP实例

AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。 动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过…

Windows使用Dockers+battery historian踩坑记

1、首先,需要翻墙。 2、然后安装Dockers,网上好多博客说安装Docker Toolbox,我亲测无效,卸载后安装Docker for Windows,安装完成后打开,会提示: Hardware assisted virtualization and data e…

Mybatis03学习笔记

目录 使用注解开发 设置事务自动提交 mybatis运行原理 注解CRUD lombok使用(偷懒神器,大神都不建议使用) 复杂查询环境(多对一) 复杂查询环境(一对多) 动态sql环境搭建 动态sql常用标签…

大数据实战 --- 淘宝用户行为

目录 开发环境 数据描述 功能需求 数据准备 数据清洗 用户行为分析 找出有价值的用户 开发环境 HadoopHiveSparkHBase 启动Hadoop:start-all.sh 启动zookeeper:zkServer.sh start 启动Hive: nohup hiveserver2 1>/dev/null 2>…

生成树端口选举

所有交换机运行RSTP,SW1优先级4096,SW2优先级4096,SW3优先级8192,SW1的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW1的G0/0/3、G0/0/4接口通过手动模式加入Eth-Trunk 2,SW2的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW3的G0/0/1、G0/0/2接口通过手动模式…

【Python】Python读写.xlsx文件(基本操作、空值补全等)

【Python】Python读写.xlsx文件(Pandas) 文章目录 【Python】Python读写.xlsx文件(Pandas)1. 介绍2. Pandas读写xlsx文件2.1 基本操作2.1.1 实现任务2.1.2 代码2.1.3 结果 2.2 进阶操作2.2.1 写操作2.2.2 查看数据表的基本信息2.2…

电脑有自带的录屏功能吗?电脑录屏如何录人脸

案例:所有电脑都有自带的录屏功能吗? “在网上了解到电脑有录屏功能,但是我在我的电脑上又找不到。想问问小伙伴们是所有的电脑都有自带的录屏功能吗?怎样才能找到电脑自带的录屏功能?” 在日常使用电脑时&#xff0…

Python 无监督学习实用指南:1~5

原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关…

封装通用el-form表单(2种方式)

1、序言 项目地址:git clone form-demo: 封装通用el-form 一个后台管理系统最常见的是表单,表单最常见的是输入框、下拉选择、日期选择、单选、复选框等等, 系统添加若干模块,就复制粘贴若干个el-form、el-form-item,有…

重学Java设计模式-行为型模式-责任链模式

重学Java设计模式-行为型模式-责任链模式 内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-18-重学 Java 设计模式《实战责任链模式》.html#重学-java-设计模式-实战责任链模式「模拟618电商大促期间-项目上线流程多级负责人审批场景」 责任链模…

Shell 脚本编程

1. shell 概述 🥞 shell 是一个命令行解释器,它能接受应用程序、用户 的命令,然后调用操作系统内核。 ⭐ 还是一门 功能强大的编程语言,易编写、易调试、灵活性强。 2. shell入门 (1)脚本格式 &#x1f…

js中 = 等号赋值的问题,Js中对象的引用问题,深浅拷贝

js "" 赋值符号 在js中 “”对于基本数据类型是赋值符号,比较( 或 )的时候是值;对于引用数据类型-对象来说 是地址引用,比较的时候是比较的地址。 基本数据类型和引用数据类型的比较 let a 3; let b a;…

离散数学_九章:关系(1)

关系 9.1关系及其性质 1、二元关系 2、集合A上的关系 3、n元素集合 有多少个关系? 4、关系的性质 1. 自反 2. 对称 3. 反对称 4. 传递 5、关系的组合 关系的合成 关系的幂 9.1关系及其性质 1、二元关系 设A和B是集合,一个从 A 到 B 的二元关…

stm32当中GPIO输出知识点汇总(GPIO的八种模式及其原理)

一、GPIO工作模式. 1. 四种输入模式 GPIO_Mode_IN_FLOATING 浮空输入模式 GPIO_Mode_IPU 上拉输入模式 GPIO_Mode_IPD 下拉输入模式 GPIO_Mode_AIN 模拟输入模式 2. 四种输出模式 GPIO_Mode_Out_OD 开漏输出模式 GPIO_Mode_Out_PP 推挽输出模式 GPIO_Mod…

CentOS7-部署Tomcat并运行Jpress

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8,配置服务启动脚本,部署jpress应用。1、简述静态网页和动态网页的区别 静态网页: 请求响应信息,发给客户端进行处理,由浏览器进…

目标检测基础之IOU计算

目标检测基础之IOU计算 概念理解——什么是IOUdemo后记 概念理解——什么是IOU IOU 交并比(Intersection over Union),从字面上很容易理解:计算交集在并集的比重。从网上截张图看看 I O U A ∩ B A ∪ B IOU \frac{A \cap B}…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试 安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQL BenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测…

[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

文章目录 一、前言二、SQL Server 主从同步的原理介绍三、具体的搭建过程3.1 准备工作3.1.1 卸载旧版本(如果有,可选,非必须)3.1.2 安装 Docker3.1.3 验证本地 Docker 是否安装成功 3.2 创建 Docker 网络3.3 创建主从节点的 SQL S…

[Linux系统]系统安全及应用一

系统安全及应用 一、账号安全基本措施1.1系统账号清理1.1.1将非登录用户的shell设为/sbin/nologin1.1.2锁定长期不使用的账号1.1.3删除无用的账号1.1.4锁定账号文件文件chattr1.1.5查看文件校验和md5sum 1.2密码安全控制1.2.1设置密码有效期 1.3历史命令限制1.3.1 减少记录命令…

C语言笔记 | 一元三次方程

文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 在 1545 年,意大利学者卡丹所写的《关于代数的大法》中,提出了一元三次方程的求根公式。人们将其称为卡丹公式。对于标准型的一…