何先森博客 - Sirhexs
type: channel
link: https://hxsbk.top/author/1/
description: Sirhexs
items: 云计算应用实践笔记--总结分析
items: 云计算应用实践笔记--附加分
items: 云计算应用实践笔记--架构二
items: 云计算应用实践笔记--架构一
items: 利用java解决集合问题
items: 为什么接口没有protected方法？
items: String类学习笔记
items: 关于内部类的小知识
items: 学习java接口的一些小思考
items: Java会议管理系统程序

云计算应用实践笔记--总结分析
type: item
date: 2024-05-08T18:28:48+00:00
description: 前言[scode type="red" size=""]由于实验是布置下来的个人实验，请勿直接抄袭，我这里写实操只是为了记录我的学习历程，与分享我的实验经验。[/scode][scode type="green" size=""]内容全部都为个人理解，不一定正确，如果你发现了文章中有存疑的地方或者你对某个地方有疑问，欢迎在评论区留言，大家一起学习。[/scode]前面完成了云计算应用实践3部分的笔记，这里对这3部分的笔记进行总结分析。前情回顾[post cid="170" cover="" size=""/][post cid="277" cover="" size=""/][post cid="364" cover="" size=""/]常见问题[collapse status="false" title="NAT网关到底有什么用？"]在架构一中，我们给VPC的私有子网配置了一个NAT网关，然后一直就没去管它，那么我们这个NAT网关在整个架构中有什么作用？充当一个什么角色呢？在AWS中其实就已经给出了相关的词条，解释了这个NAT网关的作用。公有 NAT 网关支持将私有子网中的实例连接到互联网，但会阻止它们接收来自互联网的未经请求的入站连接。您应将弹性 IP 地址与公有 NAT 网关关联在一起，然后将互联网网关附加到包含它的 VPC 中。所以简而言之，这个NAT网关的作用就是给我们VPC中私有子网访问互联网提供一个出口。这里面最常见的场景就是，在私有子网，我们的实例需要使用wget等命令下载某些互联网资源，但这些实例在内网中是无法去访问互联网的，我们也不可能为了下载这些资源就把整个私有子网连接到互联网网关中使其变成公有子网获得访问互联网的能力。这种情况下，给私有子网配置一个NAT网关就是最好的选择，让其流量能访问到互联网，而从互联网中是不能接触到这些私有子网中的实例，其只能访问到NAT，这就保证了私有子网中实例的安全。[/collapse][collapse status="false" title="VPC架构设计中要求的在两个私有子网上部署具有高可用性的RDS数据库，实验要求图示为每个子网都有一个实例，为什么实际创建，AWS控制台上只有一个实例？"]在创建数据库时，可用性与持久性的部署选项中，我们选择的是--多可用区数据库实例，关于这个选项，官方文档是这样描述的：在多可用区数据库实例部署中，Amazon RDS 会自动在不同可用区中配置和维护一个同步备用副本。主数据库实例将跨可用区同步复制到备用副本，以提供数据冗余并在系统备份期间将延迟峰值降至最小。在计划内的系统维护期间，运行具有高可用性的数据库实例可以提高可用性。它还可以帮助您保护数据库，以防数据库实例发生故障和可用区中断。所以这个备用数据库实例是不支持读取工作负载的连接，我们的连接只能连接到主数据库上。至于上面问题关于控制台只有一个实例的现象，AWS也给出了回答。[/collapse][collapse status="false" title="EC2的系统基础映像应该如何选择？Linux 与 Windwos两者有什么区别？"]在Web服务器的选择是我更推荐Linux，无论是稳定性、性能、还是成本Linux 都比 Windwos好。为什么大部分软件行业的公司，都会把服务器部署在linux上面_请各位同学考虑一下,软件的服务器应该安装在企业还是厂商?理由是什么?-CSDN博客而在众多的Linux映像中，我选择的是AWS发行的Amazon Linux 2023，因为使用的EC2就是AWS自家的产品，基于此，其发行的Linux版本无疑更适合。[/collapse][collapse status="false" title="我的Web应用是一个登录程序，为什么我实践架构二搭建完成了，访问负载均衡器DNS后无法登录，一直重定向登录页或者登录完成跳转的页面不显示在数据库读取的数据？"]这个问题是隔壁宿舍的一个小伙伴遇到的问题，他的web应用是一个使用session机制的登录组件。在他的实验EC2实例中是可以正常登录，但在使用负载均衡器访问Auto Scaling组创建的Web应用实例做这个登录操作就会一直重定向登录页。为什么呢？原因是这种基于session机制的登录不适用与这种场景。我们都知道，在这种session机制的登录，是通过校验用户请求的Cookie来鉴权用户的操作，而我在实例一中签发的cookie，在实例二中是不存在的，而负载均衡器一般是以轮询机制决定请求流量的分发，那么，你这个登录的请求是在实例一种完成，实例一返回给你一个cookie，并且让你浏览器访问登录成功的页面，而浏览器接收到，继续请求负载均衡器登录成功的页面，这时候，基于轮询机制，你这个登录成功页的请…

云计算应用实践笔记--附加分
type: item
date: 2024-05-07T17:35:00+00:00
description: 前言[scode type="red" size=""]由于实验是布置下来的个人实验，请勿直接抄袭，我这里写实操只是为了记录我的学习历程，与分享我的实验经验。[/scode][scode type="yellow" size=""]内容全部都为个人理解，不一定正确，如果你发现了文章中有存疑的地方或者你对某个地方有疑问，欢迎在评论区留言，大家一起学习。[/scode][scode type="green" size=""]部分常见问题可以访问下面这个文章[/scode][post cid="371" cover="" size=""/]在前面的实践中，我们完成了架构一和架构二的实施与部署，接下来我们就可以对课程设计附加分部分进行操作了。题目在完成以上所有任务过程中，如果你使用了如下资源或服务，均可作为本课程设计成绩的加分项：1.部分静态资源（如网页上的图片等）存储在S3中，通过CloudFront分发2.使用堡垒机登录实例3.VPC通过CloudFormation模板构建4.基于CloudWatch指标做AutoScaling5.使用DynamoDB保存会话状态6.使用Amazon ElastiCache for Redis作数据库缓存7.使用消息队列SQS准备工作基础补习老规矩，先补习基础，看懂专有名词才能完成接下来的操作S3 (Simple Storage Service): Amazon Simple Storage Service 是一种对象存储服务，用于存储和检索大量数据，适用于各种用例，如备份和恢复、存档、大数据分析等。CloudFront: Amazon CloudFront 是一项快速内容传递网络服务 (CDN)，可帮助加速静态和动态网络内容的传输。堡垒机: 在云计算环境中，堡垒机是一种用于安全访问云资源的中间服务器。它充当了控制和监视用户对云资源访问的关键角色。CloudFormation: Amazon CloudFormation 是一项基础设施即代码服务，允许您以声明性模板的方式定义和部署 AWS 资源。CloudWatch: Amazon CloudWatch 是一项监控和管理 AWS 资源的服务，可帮助您收集和跟踪指标、监控日志文件和设置警报。DynamoDB: Amazon DynamoDB 是一种全托管的 NoSQL 数据库服务，具有高可扩展性和低延迟，适用于各种应用程序。Amazon ElastiCache for Redis: Amazon ElastiCache for Redis 是一种托管的 Redis 内存数据库服务，用于加速读取操作，缓存数据和提高性能。SQS (Simple Queue Service): Amazon Simple Queue Service 是一项托管的消息队列服务，用于在分布式系统中传递消息。思路解析由于我一开始并没打算做这部分的操作，导致我的web程序就没办法实现上面的很多内容。但笔记都写两篇了，感觉这部分也能争取做一下。先简单说一下接下来的操作：✔1.部分静态资源（如网页上的图片等）存储在S3中，通过CloudFront分发：做，我打算给我的web程序加一个背景图，这个背景图就用s3存储，通过CloudFront分发✔2.使用堡垒机登录实例：做，比如在完成架构二后，我们需要对私有子网中的EC2实例进行一些操作，就可以通过这个堡垒机来操作。✔3.VPC通过CloudFormation模板构建：不做，因为这需要会AWS的CloudFormation语法与清楚AWS资源的相关资源代码，比较麻烦，所以我这里就不去完成这个点。但实际上这个操作实用性非常强，可以摆脱web页面上的一些操作，直接通过代码来创建相关的VPC，对云计算比较感兴趣，可以操作一下。本来是不想做的，但无奈，某个月黑风高的晚上好奇心爆棚，进CloudFormation页面看了一眼，发现已经有一个堆栈，出于强迫症，我把这个堆栈删了，睡了一觉后实验就再也开启不了了。这个堆栈是实验初始化的堆栈，删了会把堆栈之前创建出来的资源也删除，所以后面实验就会启动不了。最后被逼无奈只能对账号来一个reset操作，想了一下反正账号实验环境都格式化了，就动手做了一下这部分。✔4.基于CloudWatch指标做AutoScaling：做，这个操作其实在前面架构二的笔记中 创建AutoScaling时就已经完成了。❌5.使用DynamoDB保存会话状态：❌6.使用Amazon ElastiCache for Redis作数据库缓存❌7.使用消息队列SQS5.6.7都不做，因为我的web应用用不上，就不进行具体得操作了，但实操中会有相对应的个人思考讲解。实操1.使用S3存储，通过CloudFront分发[scode type=…

云计算应用实践笔记--架构二
type: item
date: 2024-04-29T21:52:00+00:00
description: 前言[scode type="red" size=""]由于实验是布置下来的个人实验，请勿直接抄袭，我这里写实操只是为了记录我的学习历程，与分享我的实验经验。[/scode][scode type="yellow" size=""]内容全部都为个人理解，不一定正确，如果你发现了文章中有存疑的地方或者你对某个地方有疑问，欢迎在评论区留言，大家一起学习。[/scode][scode type="green" size=""]部分常见问题可以访问下面这个文章[/scode][post cid="371" cover="" size=""/]题目为该系统构建弹性高可用架构，即使用Auto Scaling 组至少在不同可用区的2台实例上部署Web Server，通过ELB分发流量，如图2所示。准备工作基础补习老规矩，先补习基础Auto Scaling（自动扩展）：Auto Scaling 是一种自动调整计算资源的服务，可根据应用程序的需求自动增加或减少计算资源。当流量增加时，Auto Scaling 可以自动添加更多的服务器实例来处理额外的负载，当流量减少时，它可以自动减少服务器实例以节省成本。这样可以确保应用程序始终具有所需的计算资源，同时最大程度地减少资源浪费。Application Load Balancer（应用程序负载均衡器）：Application Load Balancer 是一种负载均衡服务，用于在多个服务器实例之间均衡分发传入流量。它可以根据不同的条件（如路径、主机名、端口等）将流量路由到不同的后端服务器实例，从而实现负载均衡和高可用性。Application Load Balancer 可以帮助应用程序更有效地处理流量，并确保各个服务器实例之间的负载均衡。前面的VPC，EC2，RDS我们都基本了解，这里需要搞明白的就上面这两个概念与其的作用。一个是动态扩展一个是动态分发流量。思路解析1.这题需要做什么？与第一题有什么区别？我需要做什么？在第一题中，我们创建了一个VPC，在公有子网上部署Web应用，私有子网部署RDS的MySQL数据库。在这里，我们需要使用Auto Scaling 组来在私有子网中部署web项目，然后通过负载均衡器中转分发流量到私有子网中的web应用中。2.那么想一想，怎么通过Auto Scaling 组来在私有子网中部署web项目？或者换个说法：Auto Scaling 组怎么启动我们的web项目？答案是通过启动模板3.启动模板又是启动的什么？启动模板又有什么意义？启动模板里面定义的是：用什么AMI启动什么类型的EC2实例，就是说启动模板就是一个描述使用什么AMI启动EC2的模板。所以这里我们就有大概的一个操作思路了：把我们的Web应用打包成AMI映像（意思是这个意思，实际操作是把运行着web应用的那个EC2实例打包成AMI映像），然后定义一个启动模板，通过Auto Scaling 组自动在私有子网启动实例，然后给Auto Scaling 组启动的实例分配负载均衡器。实操[scode type="red" size=""]在完成下面的操作之前先保证你EC2中的Web应用能正常启动！！！[/scode][scode type="red" size=""]由于实验是布置下来的个人实验，请勿直接抄袭，我这里写实操只是为了记录我的学习历程，与分享我的实验经验。[/scode]设置程序自启动[scode type="blue" size=""]在打包映像前，我们需要先给我们的Web应用设置程序自启动，这样，从AMI启动的实例中就会自动运行我们的Web应用。由于我实验使用的Web应用是Spring Boot项目，且只需要运行一个jar包，所以我这里只需要设置自启动jar包即可。如果你的实验项目使用前后端分离，那么你还需要把你的前端项目也设置自启动。我这里只演示我的jar包自启动设置。[/scode]ssh登录到我们的EC2实例，新建一个myapp.service文件（在finalShell中，只需要在下面文件显示框中 右键->新建->文件 输入文件名称即可完成创建，其他ssh工具应该也有类似的功能，当然你选择直接在端口使用命令创建也行）在myapp.service文件中完成程序自启动的配置填写（在finalShell中，双击myapp.service文件，即可填写or修改文件，文件更改完记得保存！！！！！）。[Unit] # 应用描述 Description=MyWebApplication After=network.target [Service] # 工作目录 WorkingDirectory=/home/ec2-user/ User=root # 运行jar包的指令，只需要把你平时运行的指令中前面的jav…

云计算应用实践笔记--架构一
type: item
date: 2024-04-21T20:09:00+00:00
description: 前言[scode type="red" size=""]由于实验是布置下来的个人实验，请勿直接抄袭，我这里写实操只是为了记录我的学习历程，与分享我的实验经验。[/scode][scode type="yellow" size=""]内容全部都为个人理解，不一定正确，如果你发现了文章中有存疑的地方或者你对某个地方有疑问，欢迎在评论区留言，大家一起学习。[/scode][scode type="green" size=""]部分常见问题可以访问下面这个文章[/scode][post cid="371" cover="" size=""/]题目构建一个包含两个公有子网、两个私有子网的VPC，私有子网配置NAT，如图1所示。构建一个简单的B/S架构的系统，Web Server部署在公有子网的实例上，数据库部署在私有子网的RDS上，如图1所示。（扩展要求）数据库具有高可用性。准备工作基础补习先简单理解几个在AWS中比较重要的专有名词区域 (Region) :区域是AWS基础设施的物理位置，每个区域由一个或多个数据中心组成。AWS的全球基础设施分布在不同的区域，例如美国东部（弗吉尼亚）、亚太（东京）等。每个区域都是相对独立的，拥有自己的网络、电力供应等。可用区 (Availability Zone) :可用区是指在同一区域内的物理数据中心。AWS的每个区域由多个可用区组成，这些可用区之间通过低延迟网络连接。使用多个可用区可以提高应用程序的可靠性和容错性。VPC (Virtual Private Cloud) :VPC是AWS提供的一种虚拟网络环境，允许您在AWS云中启动资源（如EC2实例）并控制这些资源之间的网络流量。您可以在VPC中定义子网、路由表、网络访问控制列表等。子网 (Subnet) :子网是VPC内的一个IP地址范围，用于将VPC划分为更小的部分。每个子网都关联一个可用区，并且您可以在子网级别配置路由表、安全组等。互联网网关 (Internet Gateway) :互联网网关是一种用于在VPC和Internet之间进行通信的AWS托管网关。它允许VPC中的资源与Internet之间进行通信，使您的实例能够访问Internet上的资源或者被Internet访问。NAT网关 (Network Address Translation Gateway) :NAT网关允许私有子网中的实例访问Internet，同时阻止Internet访问这些实例。它充当了私有子网和Internet之间的中间人，为私有子网中的实例提供出站Internet访问。安全组 (Security Group) :安全组是一种虚拟防火墙，用于控制实例的入站和出站流量。您可以配置安全组以允许或拒绝特定类型的流量，并将安全组应用于一个或多个实例。安全组是在实例级别工作的。仔细阅读以上GPT给出的解释，相信能给你留下点基础的认识。题目解析这个题目的意思就是：定义一个VPC包含两个可用区，两个可用区中分别定义公有、私有子网，公有子网部署Web服务器，私有子网部署数据库。(没错，这是废话，看图一眼就能看出来。但你为什么还是觉得似懂非懂的不会操作呢？不妨看看下面几个问题)1.什么是公有子网，什么是私有子网？2.为什么web服务器放公有子网上，而RDS数据库放私有子网呢？3.题目中不是说私有子网配置NAT吗？为什么NAT网关要放在公有子网1上？关于问题1、2，继续引用GPT的回答：公有子网是与互联网网关直接关联的子网。实例在公有子网中可以直接与Internet通信，可以拥有公共IP地址，也可以通过路由表配置访问Internet的权限。通常用于托管公共面向Internet的应用程序或服务。私有子网是没有直接与Internet通信能力的子网。实例在私有子网中无法直接访问Internet，需要通过NAT网关或跳板主机等中间设备才能访问Internet或被Internet访问。私有子网通常用于托管内部应用程序或服务，需要保持相对隔离和安全性这里也说一下我的理解：在整个VPC中，能被互联网访问的区域(子网)属于公有子网，而不直接对外开放访问的就是私有子网。而子网怎么才能对外开放访问，成为这个VPC的公有子网呢？那就是连接绑定了这个VPC的互联网网关，那么不连接互联网网关的就是私有子网了。问题3就有意思了，是题目错了吗？不是的，题目讲的是给私有子网配置NAT，而不是在私有子网上部署NAT，那为什么NAT网关要放在公有子网1上呢？这就与这里NAT网关的作用有关了，上面提到，私有子网之所以是私有子网，是因为私有子网没有连接互联网网关，那如果我私有子网里的实例需要访问互联网呢？那么就需要一个中间件的存在，让私有子网的实例能访问互联网，所以作为这个中间件的NAT，其就得放在公有子网。所以有思路把上面的…

利用java解决集合问题
type: item
date: 2022-04-16T10:45:00+00:00
description: 利用所学去学习。离散数学里面又学到了以前的集合，“包并补”什么的。那么作为一个要做“程序猿”的大学生，不得用自己的专业去解决其中的问题？所以这个包装类——“Set”诞生了。遇到的问题1.怎么去表达一个“集合”？2.怎么去解决“集合”的运算？解决思路1.一开始是真的无从下手，到底要怎么去弄这个“集合”？用一个字符串来表示一个集合吗？{1，2，3，4，5}这就是一个集合吗？想了一下，这里提到的集合是一个名词，是描述”集合“这个东西的概念。那么就可以用我们面向对象的思想来解释这个”集合“的概念了。想到这里就确定了怎么去写这个”集合“了，通过对”集合“这个类的封装来表达”集合“的这个东西。一个对象就是一个集合。2.集合的运算我的理解是 集合间元素的对比。所以基于这一点，整体的运算代码其就是对集合里元素的处理。目前我用的是for循环的嵌套，通过遍历来实现元素的对比，以后再尝试着的去优化。整体代码import java.util.*; public class Set { // 字符串数组用以存储字符串元素 private String[] a; // 默认为空集 public Set() { a = new String[0]; } // 构造方法 public Set(String str) { StringTokenizer strToken = new StringTokenizer(str, "{,}"); int num = strToken.countTokens(); a = new String[num]; for (int i = 0; i < num; i++) { a[i] = strToken.nextToken(); } } // 读取集合 public String getSet() { String str = ""; for (int i = 0; i < a.length; i++) { str = str + "," + a[i]; } return "{" + str.substring(1) + "}"; } // 获取集合元素数量 public int length() { return a.length; } // 交集 public Set intersection(Set set) { String str = ""; for (int i = 0; i < a.length; i++) { for (int j = 0; j < set.a.length; j++) { if (a[i].equals(set.a[j])) str = str + a[i] + ","; } } return new Set(str); } // 并集 public Set union(Set set) { String str = ""; for (int i = 0; i < a.length; i++) { for (int j = 0; j < set.a.length; j++) { if (a[i].equals(set.a[j])) { set.a[j] = ""; break; } } str = str + a[i] + ","; } for (int j = 0; j < set.a.length; j++) { str = str + set.a[j] + ","; } return new Set(str); } // 相等 public boolean equal(Set set) { if (a.length == set.a.length) { int num = 0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < set.a.length; j++) { if (a[i].equals(set.a[j])) { num++; break; } } } if (num == a.length) return true; } return false; } // 包含 public boolean subset(Set set) { if (a.length <= set.a.length) { int num = 0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < set.a.length; j++) { if (a[i].equals(set.a[j])) { num++; break; } } } if (num == a.length) return true; } return false; } // 补集 public Set co…

为什么接口没有protected方法？
type: item
date: 2022-04-13T14:25:00+00:00
description: 刚刚在桌面趴着睡醒，突然被问道”书里说接口可以有public default static private修饰的方法，为什么没有protected方法呢？“我一开始听到就有点懵，好有问题的问题，牛。这个问题就得从接口的设计和历史来说了吧。接口一开始设计就是为了面向所有的类，让其实现。作为接口的方法一开始是为了让实现类对其进行实现。而JDK8加入的default方法则是对接口的方法一个补充，使其更完善。而static方法则是突破类的限制，可以直接通过接口.方法来调用方法。到了JDK9在接口中加入private方法是为了给default提供可以重复使用的方法。那为什么把protected方法漏掉了？那protected方法有什么用呢？JAVA中protected是成员访问修饰关键字，表示所修饰的成员可以被本类和派生类中可以访问。那在接口中设计这样的一个方法又有什么用呢，接口是为了给实现类准备的，本来就是“公众的”，后来补充的进去的方法是为了更好提供“接口”的 服务。

String类学习笔记
type: item
date: 2022-04-05T07:51:00+00:00
description: 常用方法方法备注public int [font color="#FF0000"]length[/font]()用来获取一个String对象的字符序列的长度。public boolean [font color="#FF0000"]equals/fontString对象调用equals(String s)方法比较当前String对象的字符序列是否与参数s指定的String对象的字符序列相同。public boolean [font color="#FF0000"]equalsIgnoreCase/font作用同上，但比较时忽略大小写。public boolean [font color="#FF0000"]startsWith/font判断当前String对象的字符序列前缀是否为参数指定的String对象s的字符序列。public boolean [font color="#FF0000"]endsWith/font判断当前String对象的字符序列后缀是否为参数指定的String对象s的字符序列public boolean endsWith(String s)判断。public int [font color="#FF0000"]compareTo/font按字典顺序比较两个字符串。 比较基于字符串中每个字符的Unicode值。 此String对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。 如果此String对象按字典顺序排在参数字符串之前，则结果为负整数。 如果此String对象按字典顺序跟随参数字符串，则结果为正整数。 如果字符串相等，结果为零。public int [font color="#FF0000"]compareToIgnoreCase/font作用同上，但比较时忽略大小写。public boolean [font color="#FF0000"]contains/font判断当前String对象的字符序列是否包含参数s的字符序列。public int [font color="#FF0000"]indexOf/font返回指定字符第一次出现的字符串中的索引。如果没有检索到，该方法返回的值为-1。public int [font color="#FF0000"]indexOf/font返回指定字符第一次出现的此字符串中的索引，从指定索引处开始搜索。如果没有检索到，该方法返回的值为-1。public int [font color="#FF0000"]lastindexOf/font返回指定字符最后一次出现的字符串中的索引。如果没有检索到，该方法返回的值为-1。public int [font color="#FF0000"]lastindexOf/font返回指定字符最后一次出现的字符串中的索引，从指定的索引开始向后搜索。如果没有检索到，该方法返回的值为-1。public String [font color="#FF0000"]substring/font返回一个字符串，该字符串是此字符串的子字符串。 子字符串以指定索引处的字符开头，并延伸到此字符串的末尾。public String [font color="#FF0000"]trim[/font]()返回一个字符串，其值为此字符串，删除了所有前导和尾随空格。推荐阅读：菜鸟教程Class String实例化一.String变量有2种常用的定义方式直接赋值实例化String str = "Hello World"直接赋值字面量的方式更省内存空间，因为JVM首先会去字符串池中查找是否存在"Hello World"这个对象，如果不存在，则在字符串池中创建"Hello World"这个对象，然后将池中"Hello World"这个对象的引用地址返回给"Hello World"对象的引用str，这样str会指向池中"Hello World"这个字符串对象；如果存在，则不创建任何对象，直接将池中"Hello World"这个对象的地址返回，赋给引用str。所以如果多个直接赋值字面量的引用拥有相同的字面量，那么这些引用其实是指向同一个对象，也就是指向相同的一块内存空间。String str0 = "Hello World"; String str1 = "Hello World"; String str2 = "Hello World";构造方法实例化（这里以调用public String(String original)为例 )String str = new String("Hello World")这个就很有趣了，先说说我一开始对构造方法实例化一个字符串的理解，一开始我认为这种方式会比我们的的一种用字面量赋值的方式要快，毕竟这里是直接new一个实…

关于内部类的小知识
type: item
date: 2022-03-31T13:43:00+00:00
description: 《Java 2实用教程第6版》中P176中有4点是介绍内部类的，但我总觉得前两点不怎么对劲。[scode type="share" size=""] (1)内部类的外嵌类的成员变量在内部类中仍然有效，内部类中的方法也可以调用外嵌类中的方法。[/scode]先说说我自己的理解，为什么内部类的外嵌类的成员变量在内部类中仍然有效？为什么内部类中的方法也可以调用外嵌类中的方法？因为ava就是这样设计的，所以是这样的？这就回顾一下，我们平时是怎么调用类里面的实例方法与成员变量？用对象是吧？那对象怎么找到这个实例方法或者成员变量呢？引用，所以我认为这里的内部类的外嵌类的成员变量在内部类中仍然有效，内部类中的方法也可以调用外嵌类中的方法是因为在实例化内部类的过程中，内部类的对象包含了外部类对象的引用。所以他就能调用外嵌类的实例方法和成员变量了。[scode type="share" size=""] (2)内部类的类体中不可以声明类变量和类方法。[/scode]这句话我认为是错的，静态内部类呢？静态内部类怎么就不能有类方法了?然后再仔细想一想，第一点就又有问题了，静态内部类的实例化是不需要外嵌类对象的，也就是说静态内部类对象是没有外嵌类对象的引用的。所以静态内部类对象无法操作外嵌类的实例方法与成员变量。所以，可以确定，这书里对内部类的4点介绍是指的非静态内部类。还有一点是我在测试的时候遇到的class Embeddedclass { class InsideClass { static int i = 1; void f() { System.out.print("i am a Inner class method." + i); } } } public class InsideTest { public static void main(String[] args) { Embeddedclass g = new Embeddedclass(); Embeddedclass.InsideClass gg = g.new InsideClass(); gg.f(); } }仔细看，这InsideClass类是一个非静态的内部类，然后他还有一个static的变量i，我一开始以为它会报错，想着会有什么提示运行了它。但奇迹发生了，不仅编译成功，而且运行也没问题。那书里为什么说内部类的类体中不可以声明类变量和类方法？这问题我想了好久，最后也只能找度娘。[scode type="yellow" size=""]在JDK1.8 以后，没有final修饰，effectively final的即可。什么意思呢？就是没有final修饰，但是如果加上final编译器也不会报错即可。[/scode]Java -- 成员内部类不能含有static成员（汇总）匿名类的特点有哪些_Java 干货之深入理解内部类

学习java接口的一些小思考
type: item
date: 2022-03-29T11:06:00+00:00
description: 学习经历短短十来页的内容，看了接近2天。学完抽象类再学这接口是真的有一点难受呀，比如今天思考“为什么接口没有构造方法？”，然后我去百度了这个SB问题，找到了这个文章简单理解java中接口为什么不能有构造方法我对这文章的理解是接口因为成员属性是常量，所以不需要构造方法。然后我就又去百度“为什么接口的成员变量要是常量？”然后找到了这个为什么接口中定义的变量必须为常量？我对这文章的理解是因为接口没有构造方法，所以成员属性要定义为常量。嗯，MD，这两篇文章构成了一个闭循环，滴水不漏呀。真的想砸桌子，然后我又尝试的从各个角度去找这两个命题的关系。到最后还是无果而终，但皇天不负有心人，问了一下师兄，得到了这个问题的答案——构造方法是类的一个特殊方法。所以我这一天白折腾了，直接自闭。这个推荐看一下：java接口的演变(jdk8的default、静态方法，jdk9的私有方法、私有静态方法)java的接口为什么不能实例化

Java会议管理系统程序
type: item
date: 2022-03-27T11:22:00+00:00
description: 一、具体程序[collapse status="false" title="抽象Meeting类"]public abstract class Meeting { //会议id private int id; //会议成员组别 private int member; //会议开始时间戳 private long time; //会议标题 private String title; //会议备注 private String remarks; //会议状态 -1:结束 0:待开始 1:进行中 private int state; //会议类型 0：线下 1：线上 private int attribute; public Meeting(int member,long time,String title,String remarks,int attribute) { this.member=member; this.time=time; this.title=title; this.remarks=remarks; this.attribute=attribute; this.state=0; } public int getid() { return id; } public int getmember() { return member; } public long gettime() { return time; } public String gettitle() { return title; } public String getremarks() { return remarks; } public int getstate() { return state; } public int getattribute() { return attribute; } public void setId(int id) { this.id=id; } public abstract void getMeeting(); public void setstate() { this.state=-1; } }[/collapse][collapse status="false" title="线下会议类OfficialMeeting"]public class OfficialMeeting extends Meeting { private int room; OfficialMeeting(int member,int room,int time,String title,String remarks){ super(member,time,title,remarks,0); this.room=room; } public void getMeeting() { System.out.println("会议ID:"+getid()); System.out.println("会议类型:"+getattribute()); System.out.println("会议标题:"+gettitle()); System.out.println("会议状态:"+getstate()); System.out.println("会议地点:"+room); System.out.println("会议时间:"+gettime()); System.out.println("会议备注:"+getremarks()+"\n"); } public int getroom() { return room; } }[/collapse][collapse status="false" title="线上会议类OnlineMeeting"]public class OnlineMeeting extends Meeting{ OnlineMeeting(int member,int time,String title,String remarks){ super(member,time,title,remarks,1); } public void getMeeting() { System.out.println("会议ID:"+getid()); System.out.println("会议类型:"+getattribute()); System.out.println("会议标题:"+gettitle()); System.out.println("会议状态:"+getstate()); System.out.println("会议时间:"+gettime()); System.out.println("会议备注:"+getremarks…