首页 > 其他分享 >Day37--N种内部类

Day37--N种内部类

时间:2024-11-23 11:33:06浏览次数:10  
标签:Outer 内部 -- Day37 void class public out

Day37--N种内部类

内部类

内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

  1. 成员内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类

示例:

创建外部类Outer,并设置属性private int id;方法public void out System.out.println("这是外部类的方法");

设置内部类Inner,内部类的方法in,输出“这是内部类的方法”

package com.liu.oop.demo10;

//Outer  外部类
public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }

    //Inner   这是内部类的方法
    public class Inner{
        public void  in(){
            System.out.println("这是内部类的方法");
        }
    }
}

如何在Application里面创建内部类的对象、使用内部类的方法?

package com.liu.oop;

import com.liu.oop.demo10.Outer;

public class Application {
    public static void main(String[] args) {
        //创建内部类的对象
        //1. 创建外部类的对象
        Outer outer = new Outer();
        //2.通过外部类来实例化内部类
        //outer.new Inner();
        Outer.Inner inner = outer.new Inner();
        //使用内部类的方法
        inner.in();//这是内部类的方法
    }
}

内部类有哪些作用?

内部非静态类可以访问外部类的属性(包括私有属性)。

package com.liu.oop.demo10;

//Outer  外部类
public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }

    //Inner   这是内部类的方法
    public class Inner{
        public void  in(){
            System.out.println("这是内部类的方法");
        }

        //获得内部类的私有属性
        public void getId(){
            System.out.println(id);
        }
    }
}

package com.liu.oop;

import com.liu.oop.demo10.Outer;

public class Application {
    public static void main(String[] args) {
        //创建内部类的对象
        
        //1. 创建外部类的对象
        Outer outer = new Outer();
        
        //2.通过外部类来实例化内部类
        //outer.new Inner();
        Outer.Inner inner = outer.new Inner();
        
        //使用内部类的方法
        inner.getId();//10
    }
}

内部类可以访问外部类的私有方法

package com.liu.oop.demo10;

//Outer  外部类
public class Outer {
    private int id=10;
    public void out1(){
        System.out.println("这是外部类的方法1");
    }
    private void out2(){
        System.out.println("这是外部类的方法2");
    }

    //Inner   这是内部类的方法
    public class Inner{
        public void  in(){
            System.out.println("这是内部类的方法");
        }

        //获得内部类的私有属性
        public void getId(){
            System.out.println(id);
        }
        
        //获得内部类的私有方法
        public  void getOut2(){
            Outer.this.out2();
        }
    }
}

详细解释:

  1. Outer.this的含义
    • 当在内部类中使用Outer.this时,Outer.this指的是外部类(Outer类)的当前实例。
    • 例如,在Inner类的callOuterOut2方法中:
public void getOut2() {
    Outer.this.out2();
}
  • Outer.this表示获取外部类Outer的当前实例。然后通过这个实例来调用外部类的out2方法。如果没有Outer.this,编译器可能会混淆,不知道你要调用的是哪个out2方法(因为内部类可能也有自己的方法,或者存在名称冲突的情况)。

比如:

  • 当内部类和外部类有同名的成员变量或方法时,使用Outer.this可以明确地访问外部类的成员。
  • 例如,如果Inner类也有一个名为id的变量,而你想访问外部类Outerid变量,你可以这样写:
public class Inner{
    private int id = 20;
    public void printIds() {
        System.out.println("Inner id: " + this.id);
        System.out.println("Outer id: " + Outer.this.id);
    }
}
  • 这里this.id访问的是内部类Innerid变量,而Outer.this.id访问的是外部类Outerid变量。

总之,Outer.this是在内部类中访问外部类当前实例的一种方式,用于明确地调用外部类的成员。

与上面相反,内部静态类不能直接调用外部类的非静态属性。

例如:将内部类属性改为static,立刻报错

package com.liu.oop.demo10;

//Outer  外部类
public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法1");
    }
   

    //Inner   这是内部类的方法
    public static class Inner{
        public void  in(){
            System.out.println("这是内部类的方法");
        }

        //获得内部类的私有属性
        public void getId(){
            System.out.println(id);//报错
        }

        
    }
}

image-20241123110211524

一个Java文件只能有一个public class文件(非内部类),但是可以有多个class文件

package com.liu.oop.demo10;


public class Outer {

}

class A{
    
}

此时,在项目列表里面,就可以看到

image-20241123110548691

局部内部类:类可以写在方法里面

package com.liu.oop.demo10;


public class Outer {

    public void method(){
    
        class A{
            
        }
        
    }
}

没有名字初始化类,不用将类保存到变量中

package com.liu.oop.demo10;

public class Test {
    public static void main(String[] args) {
        //没有名字初始化类,不用将类保存到变量中
        new Apple().eat();
    }
    
}


class Apple{
    public void eat(){
        System.out.println("1");
    }
}

匿名内部类:

package com.liu.oop.demo10;

public class Test {
    public static void main(String[] args) {
        //没有名字初始化类,不用将类保存到变量中
        new Apple().eat();

        UserService userService=new UserService(){
            @Override
            public void hello() {

            }
        };

    }

}


class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface UserService{
    void hello();
}

对代码的解释:

  • UserService userService = new UserService() {... };
    

    这行代码中:

    • 创建接口的实例:虽然接口本身不能被实例化(因为它没有构造函数且只定义了方法规范),但在这里通过使用匿名内部类的方式,实际上是在创建一个实现了 UserService 接口的匿名类的实例。
    • 实现接口方法:紧跟在 new UserService() 后面的大括号内的代码 { @Override public void hello() { } } 就是在实现 UserService 接口中的 hello 方法。这里虽然方法体暂时为空,但按照要求必须提供 hello 方法的具体实现,因为要创建的是 UserService 接口的一个有效实现类的实例。
    • 赋值给变量:最后将创建的这个实现了 UserService 接口的匿名类的实例赋值给变量 userService,这样就可以在后续的代码中通过这个变量来调用该匿名类实现的方法(在这里就是 hello 方法)。

接口不能初始化,但可以通过实现接口的类来使用接口。例如,创建一个实现Animal接口的Cat类:

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("喵喵!");
    }
}
  • 然后可以在其他代码中使用这些实现类:

    public class Main {
        public static void main(String[] args) {
            Animal cat = new Cat();
            cat.makeSound();
        }
    }
    
    • 在这里,Animal接口本身没有被初始化,而是通过Cat类(Animal接口的实现类)的实例化来使用接口中定义的方法。

标签:Outer,内部,--,Day37,void,class,public,out
From: https://www.cnblogs.com/xiaokunzhong/p/18564264

相关文章

  • 全面解析Shodan:网络安全中的设备扫描与漏洞识别利器
    声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站......
  • x-cmd pkg | chatgpt - ChatGPT 聊天助手,带你体验高效的多轮对话,智能上下文记忆
    目录简介快速上手安装使用功能特点竞品和相关项目进一步阅读简介chatgpt是由github.com/j178使用Go开发的用于ChatGPT的CLI,支持GPT-3.5-turbo和GPT-4。快速上手安装eval"$(curlhttps://get.x-cmd.com)"#安装x-cmdxenvusechatgpt......
  • x-cmd pkg | nexttrace - 可视化路由跟踪工具,支持多种 IP 数据库,助你深入解析网络路径
    目录简介快速上手安装使用功能特点竞品和相关作品进一步阅读简介nexttrace是github.com/nxtrace用Go开发的可视化路由跟踪工具,用于分析从源到目标的网络路径。它默认使用ICMP协议发起TraceRoute请求,支持IPv4和IPv6,支持指定网卡进行路由跟踪,支持TTL控......
  • flask框架独立学院资产管理系统(毕设源码+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于独立学院资产管理系统的研究,现有研究多集中于综合性大学或企业的资产管理,专门针对独立学院资产管......
  • flask框架度假村住宿服务平台(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于度假村住宿服务平台的研究,现有研究多侧重于住宿服务行业的宏观层面,如市场供需分析、发展趋势预测等[2] 。专门针对度假村住宿服......
  • 蓝易云 - opengauss高可用之主备分开搭建教程。
    在部署OpenGauss高可用环境时,主备分开搭建是一种常见的实践方法。下面是一个教程,演示了如何分开搭建OpenGauss主备服务器的过程。确保服务器环境准备就绪:在主备服务器上安装操作系统和必要的依赖项,确保网络连接正常。下载并安装OpenGauss软件:从OpenGauss官方网站下载适合你......
  • 蓝易云 - Ubuntu安装Net-tools和SSH
    在Ubuntu上安装Net-tools和SSH是常见的操作。下面是一个简单的教程:安装Net-tools:打开终端,并使用root权限登录到Ubuntu。运行以下命令以安装Net-tools:apt-getupdateapt-getinstallnet-tools​安装完成后,Net-tools的命令(如ifconfig、netstat等)将可用于网络配置和监控。......
  • 蓝易云 - linux基本功系列之mv命令实战
    mv命令是Linux系统中的一个常用命令,用于移动文件或重命名文件。下面是对mv命令的一些实战用法:移动文件或目录:mv源路径目标路径​源路径:要移动的文件或目录的路径。目标路径:移动后的目标路径。例如,要将文件 file.txt移动到目录 /path/to/destination/中,可以执行以下命......
  • #渗透测试#SRC漏洞挖掘#网络运维# 黑客脚本编写06之if条件判断与for循环判断
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。                            ......
  • ssm毕设云端电子书阅读系统程序+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的飞速发展,互联网在人们的生活中扮演着越来越重要的角色。在阅读领域,传统的纸质阅读逐渐向电子阅读转变,而云端技术的出现更是为电子......