花几千上万学习Java,真没必要!(二十六)

news2024/11/15 13:44:37

1、成员内部类:

package internalclass.com;
//在Java中,成员内部类(也称为非静态内部类)是定义在另一个类(外部类)内部的类。
//成员内部类可以访问外部类的所有成员(包括私有成员),并且每个成员内部类的实例都隐式地与其外部类的实例相关联。
//Phone的外部类中定义一个成员内部类,表示手机的不同配置或特性(例如,Camera类作为Phone的成员内部类)。
//Camera是Phone的成员内部类。Camera类的实例总是与Phone类的某个实例相关联。
//在Camera的takePhoto方法中,能够访问Phone类的私有成员brand,表示成员内部类可以访问外部类私有成员的特性。
//成员内部类的实例不能独立于其外部类的实例存在。
//通过Phone类的实例phone来创建Camera类的实例camera。
//如果直接实例化Camera(比如,Phone.Camera camera = new Phone.Camera(12);),将导致编译错误,因为Camera是一个非静态内部类,它需要外部类的一个实例来与之关联。
//成员内部类可以有自己的构造方法、字段和方法,就像任何其他类一样。
//但是,由于它与外部类紧密相关,因此可以访问外部类的所有成员(包括私有成员)。
public class Phone {  
    // 外部类的私有成员  
    private String brand;  
  
    // 外部类的构造方法  
    public Phone(String brand) {  
        this.brand = brand;  
    }  
  
    // 成员内部类 Camera  
    public class Camera {  
        // 成员内部类的成员  
        private int megapixels;  
  
        // 成员内部类的构造方法  
        public Camera(int megapixels) {  
            this.megapixels = megapixels;  
        }  
  
        // 成员内部类的方法  
        public void takePhoto() {  
            System.out.println(brand + " phone is taking a photo with " + megapixels + " megapixels camera.");  
        }  
    }  
  
    // 外部类的方法,用于创建和返回Camera实例  
    public Camera getCamera(int megapixels) {  
        return new Camera(megapixels);  
    }  
  
    public static void main(String[] args) {  
        // 创建Phone实例  
        Phone phone = new Phone("Apple");  
  
        // 通过Phone实例创建Camera实例  
        Phone.Camera camera = phone.getCamera(12);  
  
        // 调用Camera实例的方法  
        camera.takePhoto();  
    }  
}

运行结果如下:

 

 

2、 局部内部类;

package internalclass.com;
//在Java中,局部内部类是定义在方法或代码块内部的类。
//与成员内部类不同,局部内部类不能包含静态成员,并且只能在其被定义的代码块或方法中访问。
//电脑类(Computer)作为外部类,并在其中一个方法中定义局部内部类。
//在一个电脑类中定义一个方法,该方法用于根据不同的配置(通过局部内部类表示)来构建并描述电脑的不同版本。
//Configuration是一个局部内部类,它被定义在describeConfiguration方法内部。
//这个局部内部类代表电脑的配置,并包含了CPU和RAM等属性。
//在describeConfiguration方法中,根据传入的configName参数创建Configuration实例,并调用它的printConfiguration方法打印配置信息。
//局部内部类Configuration的实例只能在describeConfiguration方法内部被创建和使用。
//一旦离开这个方法,Configuration的实例就不再可用,且Configuration类本身也不再可见。
//这就是局部内部类的作用域限制。
public class Computer {  
    // 外部类的成员变量  
    private String brand;  
  
    // 外部类的构造方法  
    public Computer(String brand) {  
        this.brand = brand;  
    }  
  
    // 一个包含局部内部类定义的方法  
    public void describeConfiguration(String configName) {  
        class Configuration {  
            // 局部内部类的成员变量  
            private String cpu;  
            private int ram;  
  
            // 局部内部类的构造方法  
            public Configuration(String cpu, int ram) {  
                this.cpu = cpu;  
                this.ram = ram;  
            }  
  
            // 局部内部类的方法,用于描述配置  
            public void printConfiguration() {  
                System.out.println("Configuration: " + configName);  
                System.out.println("Brand: " + brand);  
                System.out.println("CPU: " + cpu);  
                System.out.println("RAM: " + ram + " GB");  
            }  
        }  
  
        // 根据传入的configName参数创建不同的Configuration实例  
        // 基于configName创建一个固定的配置  
        // 在实际应用中,可能需要根据configName动态构建配置  
        if ("High-End".equals(configName)) {  
            Configuration highEndConfig = new Configuration("Intel Core i9", 32);  
            highEndConfig.printConfiguration();  
        } else if ("Budget".equals(configName)) {  
            Configuration budgetConfig = new Configuration("AMD Ryzen 3", 8);  
            budgetConfig.printConfiguration();  
        } else {  
            System.out.println("Unknown configuration: " + configName);  
        }  
    }  
  
    public static void main(String[] args) {  
        Computer appleComputer = new Computer("Apple");  
        appleComputer.describeConfiguration("High-End");  
  
        Computer lenovoComputer = new Computer("Lenovo");  
        lenovoComputer.describeConfiguration("Budget");  
    }  
}

运行结果如下:

3、匿名内部类:

测试代码1:

package internalclass.com;
import javax.swing.*;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
 //在Java开发中,匿名内部类常用于只需要使用一次的类实现,特别是当你想要实现某个接口或继承某个类(通常是抽象类)并立即使用其对象时。
//这种方式可以避免创建大量仅用于一次的单独类文件,从而使代码更加简洁。
//假设正在开发一个GUI应用程序,并且想要为某个按钮添加一个点击事件监听器。
//使用Swing库中的JButton和ActionListener接口实现匿名内部类的使用。
//ActionListener是一个接口,它有一个actionPerformed方法需要被实现。
//通过匿名内部类的方式实现ActionListener接口,并重写actionPerformed方法。
//当按钮被点击时,就会触发这个方法,显示一个对话框。
//使用匿名内部类的好处是,它允许直接在需要的地方实现接口或创建类的匿名子类,而无需先声明一个单独的类。
public class AnonymousInnerClassExample {  
  
    public static void main(String[] args) {  
        // 创建 JFrame 实例  
        JFrame frame = new JFrame("Anonymous Inner Class Example");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        frame.setSize(300, 200);  
  
        // 创建 JButton 实例  
        JButton button = new JButton("Click Me!");  
  
        // 为 JButton 添加 ActionListener,使用匿名内部类  
        button.addActionListener(new ActionListener() {  
            @Override  
            public void actionPerformed(ActionEvent e) {  
                // 当按钮被点击时,执行这里的代码  
                JOptionPane.showMessageDialog(frame, "Button was clicked!");  
            }  
        });  
  
        // 将 JButton 添加到 JFrame  
        frame.getContentPane().add(button);  
  
        // 设置 JFrame 可见  
        frame.setVisible(true);  
    }  
}

 测试代码2:

package internalclass.com;
//在Java中,匿名内部类是一种没有名称的内部类,通常用于简化代码,特别是当只需要使用某个类的子类一次时。
//使用鞋子类(Shoe)作为外部类,并在其中演示匿名内部类用法。
//假设有一个Shoe类,它有一个抽象方法describe,用于描述鞋子的特性。
//然后,通过匿名内部类的方式来实现这个抽象方法。
//Shoe是一个抽象类,它有一个抽象方法describe。
//但是,没有直接继承Shoe类创建子类,而是通过在需要Shoe类实例的地方直接使用匿名内部类的方式来实现describe方法。
//这样可以为每个特定的Shoe实例提供不同的describe实现,而无需创建多个具体的子类。
//通过匿名内部类,可以使代码更加紧凑和易于理解,特别是在只需要某个类的简单实现时。
//当实现变得复杂时,考虑使用具体的子类可能是一个更好的选择,以保持代码的清晰和可维护性。
abstract class Shoe {  
    // 抽象方法,用于描述鞋子的特性  
    public abstract void describe();  
  
    // 可能有其他方法和字段...  
}  
  
public class MainTest {  
    public static void main(String[] args) {  
        // 使用匿名内部类来创建 Shoe 的一个实例  
        Shoe sneaker = new Shoe() {  
            // 实现抽象方法  
            @Override  
            public void describe() {  
                System.out.println("This is a sneaker with stylish design and comfortable fit.");  
            }  
  
            // 这里不能定义额外的抽象方法或静态成员  
            // 但可以定义其他非抽象方法和字段  
        };  
  
        // 调用 describe 方法  
        sneaker.describe();  
  
        // 再创建一个不同类型的鞋子实例,也使用匿名内部类  
        Shoe formalShoes = new Shoe() {  
            @Override  
            public void describe() {  
                System.out.println("These are formal shoes with classic styling.");  
            }  
        };  
  
        // 调用 describe 方法  
        formalShoes.describe();  
    }  
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】网络层——IPv4地址(个人笔记)

学习日期:2024.7.24 内容摘要:IPv4地址,分类编址,子网,无分类编址 IPv4地址概述 在TCP/IP体系中,IP地址是一个最基本的概念,IPv4地址就是给因特网上的每一台主机的每一个接口分配一个在全世界…

ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间

前言 在做数据库设计时,为了方便进行数据追踪,通常会有几个字段是每个表都有的,比如创建时间、创建人、更新时间、更新人、备注等,在存储这些时间时,要么存储 WEB 服务器的时间,要么存储数据库服务器的时间…

Java之数组应用-冒泡排序-二分查找

冒泡排序 冒泡(Bubble Sort)排序是一种简单排序算法,它通过依次比较交换两个相邻元素实现功能。每一次冒泡会让至少一个元素移动到它应该在的位置上,这样 n 次冒泡就完成了 n 个数据的排序工作。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”…

python实现图像缩放算法

图像缩放算法 1.最近邻插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点2.双线性插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点3.双三次插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点 1.最近邻插值图像缩放算法详解 最近邻插值(Near…

【网络】计算机网络基础——计算机网络背景和发展、认识网络协议、OSI七层模型、TCP/IP四层模型、网络的传输

文章目录 Linux网络1. 计算机网络背景和发展2. 认识网络协议3. OSI七层模型3.1 物理层3.2 数据链路层3.3 网络层3.4 传输层3.5 会话层3.6 表示层3.7 应用层 4. TCP/IP四层模型5. 网络的传输 Linux网络 1. 计算机网络背景和发展 开始的计算机都是独立模式(计算机之间…

与众不同的社交体验:Facebook的新功能与新变化

在快速变化的社交媒体领域,Facebook不断引入创新功能和变化,以满足用户日益增长的需求,并提供与众不同的社交体验。从增强现实到数据隐私,Facebook的新功能和更新正在塑造一个全新的社交平台。本文将深入探讨这些新功能和变化&…

3W单声道关断模式音频功率放大器AD4150B

前言: 国产功放介绍 NS4890C 2.4W 单声道AB类音频放大器 AD4150B 3W单声道关断模式音频功率放大器 参考价格0.3元 产品概述 AD4150B是一款单声道带关断模式,桥式音频功率放大器。在5.5V工作电压时,平均驱动功率为:3W&#xff08…

计算机网络之http和https的区别(外加http详解)

http协议和各种协议之间的关系 1、DNS解析,获取到访问服务器的IP 2、HTTP生成请求报文请求,请求访问页面资源 3、TCP协议将报文切割成一份一份报文段后,以可靠的方式进行传输 4、IP协议边搜索边中转,将这些数据包传输给接受方…

关于c#的简单应用三题

#region 输入一个正整数&#xff0c;求1~这个数的阶乘 public static void Factorial(int a) { int result 1; for (int i 1; i < a; i) { result result * i; } Console.WriteLine(result); } #endregion #region 一个游戏&#…

详解Stable Diffusion 原理图

参考英文文献&#xff1a;The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. 在这个Stable Diffusion模型的架构图中&#xff0c;VAE&#xff08;变分自编码器&#xff09;模型对应的是图中的 E 和 D 部分。 具体来说…

keystone学习小结2

简介 通过源码 官方文档 进行学习 官方文档 架构 identity 提供user和group的鉴权及数据 可以用这些数据处理增删改查的请求 这些服务在某些情况也可以托管在授权的服务中&#xff0c;有认证任务时&#xff0c;授权的服务会执行认证的任务&#xff0c;而不会把这些转发到…

SuperMap GIS基础产品FAQ集锦(20240715)

一、SuperMap iDesktopX 问题1&#xff1a;想问一下&#xff0c;线数据更改粗细和颜色&#xff0c;他只能保存到地图中吗&#xff1f;我希望能修改源数据&#xff0c;但是保存不了&#xff1f; 11.1.1 【问题原因】简单数据集不支持保存风格。 【解决办法】入需保存风格&…

SAP中途增加批次管理提示:库存在工厂级别已经存在。

SAP中途增加批次管理提示&#xff1a;库存在工厂级别已经存在。 在这种情况&#xff0c;将需要启用批次管理功能的物料主数据进行出库&#xff0c;通过移动类型201&#xff08;562&#xff09;进行出库&#xff0c;然后再修改物料主数据&#xff0c;当成功启用物料主数据的批次…

前置-Linux相关知识速记

linux Linux命令大全 [!IMPORTANT] chown-chmod-ls-chgrp-cdpwd-mkdir-rmdir-cp-rm-mv-cat-tac-nl-more-less-head-tail 应用领域 通常服务器使用 LAMP&#xff08;Linux Apache MySQL PHP&#xff09;或 LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;组合。 目前…

700.二叉搜索树的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val 2 输出&#xff1a;[2,1,3]…

SmartX 超融合 vs vSAN 8:数据库场景下的性能对比

此前&#xff0c;我们以 vSAN 7 为例&#xff0c;对比了 SmartX 与 VMware 超融合在快照、缓存、I/O 路径上的技术差异&#xff0c;及其带来的性能影响。不同于 vSAN 7&#xff0c;vSAN 8 引入了快速存储架构 ESA&#xff08;Express Storage Architecture&#xff09;&#xf…

SpringCloud------Seata(分布式事务)

分布式事务产生原因 CAP定理(一致性、可用性、分区容错性) BASE理论 解决思想 Seata 三个角色

【操作系统】线程池的底层逻辑解析及实现

目录 线程池一、线程池是什么二、底层线程池 ThreadPoolExecutor三、实现线程池四、标准库中的线程池Executors 线程池 一、线程池是什么 在我们频繁的创建线程时或销毁线程时,都会进行系统调度从而占用系统资源,虽然创建线程/销毁线程的开销不是很大,但架不住量多,进而我们该…

photoshop学习笔记——选区

选区工具快捷键&#xff1a;M shift M 切换 矩形/椭圆选区工具 基本用法 选区框选出的地方被激活&#xff08;其后进行的操作&#xff0c;仅在选区中生效&#xff09; 选区工具选择后&#xff08;以矩形选区为例&#xff09; 按下鼠标左键拖动&#xff0c;画出一块矩形区…

TCP连接与释放

目录 引言 一. TCP连接的建立 二.TCP连接的释放 三.TCP连接状态机 引言 传输控制协议(Transmission Control Protocol,TCP)作为互联网上最广泛使用的协议之一,其在网络通信中扮演着关键角色。其中,TCP连接的建立与释放是TCP协议中最为重要的部分之一。本文将对TCP连接的建立…