首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

Java中,匿名内部类在开发中的使用以及匿名内部类的面试题

匿名内部类在开发中的使用 我们在开发的时候,会看到抽象类,或者接口作为方法的形式参数。 而这个时候,我们知道实际需要的是一个子类的对象。 如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式进行简化。 Android开发中这种格式见得多, JavaEE开发中见得少。 为什么呢? 因为匿名内部类的好处是: 匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收, 栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。 示例代码如下: 1 /* 2 匿名内部类在开发中的使用: 3 Android开发中这种格式见得多, 4 JavaEE开发中见得少。 5 6 为什么呢? 7 因为匿名内部类的好处是: 8 匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收, 9 栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。 10 */ 11 12 //定义一个接口 13 interface Person { 14 public abstract void study(); 15 } 16 17 //定义具体类实现接口 18 class Student implements Person { 19 public void study() { 20 System.out.println("好好学习,天天向上"); 21 } 22 } 23 24 //方法的形式参数为接口时,需要的是该接口的实现类的对象。 25 class PersonDemo { 26 //接口名作为方法的形式参数 27 //其实这里需要的不是接口,而是该接口的实现类的对象 28 public void method(Person p) { 29 p.study(); 30 } 31 } 32 33 class InnerClassTest2 { 34 public static void main(String[] args) { 35 //法一:测试PersonDemo类中的method方法。 36 PersonDemo pd = new PersonDemo(); 37 Person p = new Student(); 38 pd.method(p); 39 System.out.println("--------------------"); 40 41 //法二:匿名内部类在开发中的使用: 42 //匿名内部类的本质是该类的子类或者实现该接口的实现类(子类)的匿名对象。 43 pd.method(new Person(){ 44 public void study() { 45 System.out.println("好好学习,天天向上"); 46 } 47 }); 48 } 49 } 50 51 运行结果为: 52 好好学习,天天向上 53 -------------------- 54 好好学习,天天向上 匿名内部类的面试题 按照要求,补齐代码 interface Inter { void show(); } class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制台输出”HelloWorld” 示例代码如下: 1 /* 2 匿名内部类的面试题: 3 按照要求,补齐代码 4 interface Inter { 5 void show(); 6 } 7 class Outer { 8 //补齐代码 9 } 10 class OuterDemo { 11 public static void main(String[] args) { 12 Outer.method().show(); 13 } 14 } 15 要求在控制台输出”HelloWorld” 16 */ 17 interface Inter { 18 void show(); 19 // public abstract 20 } 21 22 class Outer { 23 // 补齐代码 24 public static Inter method() { 25 // 子类对象 -- 子类匿名对象是子类对象的一种 26 return new Inter() { 27 public void show() { 28 System.out.println("HelloWorld"); 29 } 30 }; 31 32 } 33 } 34 35 class OuterDemo { 36 public static void main(String[] args) { 37 Outer.method().show(); 38 /* 39 * 1:Outer.method()可以看出method()应该是Outer中的一个静态方法。 40 * 2:Outer.method().show()可以看出method()方法的返回值是一个对象。 41 * 又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。 42 */ 43 } 44 } 我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

优秀的个人博客,低调大师

「架构技术专题」作为java程序员的你还不知道网站架构的演化(1)

说道大型网站,就的先说大型网站的特点:高并发,大流量,高可用,海量数据等。下面就说说大型网站的架构演化过程,通过一步步的演化,我们就可以清晰直观地知道,究竟为什么要这么做? 1、初始阶段的网站架构 初始阶段都比较简单,通常一台服务器就可以搞定一个网站了,看图。 2、应用服务和数据服务分离 随着网站业务的发展,一台服务器逐渐不能满足需求;这时候就需要将应用和数据分离,如图。 3、使用缓存改善网站性能 毫无疑问,现在的网站基本上都会使用缓存,即:80%的业务访问都会集中在20%的数据上。 4、使用应用服务器集群改善网站的并发处理能力 因为单一应用服务器能够处理的请求连接有限,在网站访问高峰时期,应用服务器会成为整个网站的瓶颈。因此使用负载均衡处理器势在必然。通过负载均衡调度服务器,可将来自浏览器的访问请求分发到应用的集群中的任何一台服务器上。 5、数据库读写分离 当用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。而目前主流的数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上。网站利用数据库这一功能实现数据库读写分离,从而改善数据库负载压力。 后面的还有以下几点: 6、使用反向代理和CDN加上网站相应 7、使用分布式文件系统和分布式数据库系统 8、使用NoSQL和搜索引擎 9、业务拆分 10、分布式服务 11、目前算是最新的spring cloud 分布式微服务

优秀的个人博客,低调大师

利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境

一、环境描述 安装有ansible的服务器:192.168.13.45 测试环境服务器:192.168.13.49 /home/app/api-tomcat/webapps/api.war为测试环境新版本war包位置 生产环境服务器:192.168.13.51 /home/app/api-tomcat/webapps/api.war为生产环境war包位置 /home/app/api-tomcat/webapps/api为生产环境项目位置 /home/app/tomcat.bak/api/webapps-时间戳,为老版本webapps备份位置 /home/app/newwar/api.war为从测试环境获得的新版本war包临时存放位置 /home/app/newwar/api为新版本war包解压后临时存放的位置 全部以app用户执行 二、编写ansible-playbook用的yml文件 1、升级 这里所有的#开头的注释文字在使用的时候都要去掉,因为yml是没有注释的 #生产环境主机的ip,这里也可以是/etc/ansible/hosts定义的组名 -hosts:192.168.13.51 #变量,在yml文件中使用变量可以使整个文件可以用在不同的主机上升级,变量的使用方法是,如果task中的变量在冒号后则一定要将冒号后整句加上双引号"",因为yml文件自动把冒号后的大括号的内容识别为列表,如shell:"/bin/startup.sh" vars: #测试环境IP地址 testIP:192.168.13.49 #测试环境中项目的位置 testhome:/home/app/api-tomcat/webapps #测试环境中项目war包的名字 warname:api.war #生产环境中项目的tomcat所在的位置 oldhome:/home/app/api-tomcat #生产环境中老版本项目所在webapps备份目录的位置 backupwebapps:/home/app/tomcat.bak #从测试环境获取的新版本war包所在的位置 newwar:/home/app/newwar #新版本war包解压后目录的名字 zipname:api #整个远程自动化操作中所使用的账户,这里整个从生产环境到测试环境的操作都是用app用户执行的 remote_user:app #具体操作 tasks: -name:生产环境删除/home/app/newwar目录,若目录不存在则忽略错误(删这个目录的原因是因为之后要新建这个目录,确保整个yml文件可以多次执行,ignore_errors为是否忽略错误返回值) file:path=state=absent ignore_errors:yes -name:生产环境创建/home/app/newwar目录,改权限,(其中recurse是递归创建目录,state是文件类型为目录) file:path=recurse=yesmode=775owner=appgroup=appstate=directory -name:从测试环境192.168.13.49复制新版本/home/app/api-tomcat/webapps/api.war包到生产环境192.168.13.51的/home/app/newwar目录下,此处之后的操作都是在生产环境下 shell:scpapp@:/ -name:给/home/app/newwar递归改权限(因为整改操作都是以app用户身份执行的,所以一定要保证权限为app的权限) file:dest=recurse=yesmode=775owner=appgroup=app -name:解压/home/app/newwar/api.war包在/home/app/newwar/api目录 shell:unzip-oq/-d/ -name:再次给/home/app/newwar递归改权限(确保新版本为app的权限) file:dest=recurse=yesmode=775owner=appgroup=app -name:创建用来备份老版本webapps的目录/home/app/tomcat.bak/api并改递归权限 file:path=/recurse=yesmode=775owner=appgroup=appstate=directory -name:备份/home/app/api-tomcat/webapps到目录/home/app/tomcat.bak/api/webapps-时间戳(这个备份目录是用来回滚的) shell:cp-a/webapps//webapps-`date+%Y%m%d%H%M` -name:kill进程方式停止服务.忽略错误返回值(用这种方式才能确保老版本停止运行,否则会出现冲突) shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:kill进程方式停止服务.忽略错误返回值(再次确保老版本不再运行) shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:再次kill进程方式停止服务.忽略错误返回值 shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:查看停止服务的结果,进程是否还在 shell:ps-ef|grep -name:删除老版本的/home/app/api-tomcat/webapps/api.war包 file:path=/webapps/state=absent ignore_errors:yes -name:删除老版本的/home/app/api-tomcat/webapps/api程序目录 file:path=/webapps/state=absent ignore_errors:yes -name:复制新版本目录/home/app/newwar/api到/home/app/api-tomcat/webapps目录下 shell:cp-a//webapps/ -name:复制新版本war包/home/app/newwar/api.war包到/home/app/api-tomcat/webapps目录下 shell:cp-a//webapps/ -name:启动服务/home/app/api-tomcat/bin/startup.sh(source是为了载入jdk的环境变量,nohup是为了保证yml跑完了进程依然不退出) shell:"source/etc/profile;nohup/bin/startup.sh&" -name:查看进程中是否存在启动的服务 shell:ps-ef|grep 2、回滚 #生产环境主机地址 -hosts:192.168.13.51 #变量和升级的相同 vars: testIP:192.168.13.49 testhome:/home/app/api-tomcat/webapps warname:api.war oldhome:/home/app/api-tomcat backupwebapps:/home/app/tomcat.bak newwar:/home/app/newwar zipname:api #远程操作依然使用app用户 remote_user:app #以下操作都是在生产环境中进行 tasks: -name:kill进程方式停止服务.忽略错误返回值 shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:kill进程方式停止服务.忽略错误返回值 shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:再次kill进程方式停止服务.忽略错误返回值 shell:ps-ef|grep|grep-vgrep|xargskill ignore_errors:yes -name:查看停止服务的结果.进程是否还在 shell:ps-ef|grep -name:删除/home/app/api-tomcat/webapps目录 file:path=/webappsstate=absent -name:显示/home/app/tomcat.bak/api/中最新备份的webapps目录,目录名应该是webapps-最近时间戳 shell:ls-r/|head-1 -name:复制备份的/home/app/tomcat.bak/api/webapps-最新时间戳,到项目并改名/home/app/api-tomcat/webapps shell:cp-a//$(ls-r/|head-1)/webapps -name:启动服务/home/app/api-tomcat/bin/startup.sh shell:"source/etc/profile;nohup/bin/startup.sh&" -name:删除刚才回滚的备份文件 shell:rm-rf//$(ls-r/ -name:查看进程中是否存在启动的服务 shell:ps-ef|grep 三、升级操作和注意事项 1、升级前免密钥操作 ansible所在主机192.168.13.45 #在app用户下生成密钥 ssh-keygen-trsa #发送公钥到测试环境 ssh-copy-id-i.ssh/id_rsa.pubapp@192.168.13.49 #发送公钥到生产环境 ssh-copy-id-i.ssh/id_rsa.pubapp@192.168.13.51 生产环境主机192.168.13.51 #在app用户下生成密钥 ssh-keygen-trsa #发送公钥到测试环境 ssh-copy-id-i.ssh/id_rsa.pubapp@192.168.13.49 为了业务安全,ansible所在主机和生产环境主机、测试环境主机是互通的。生产环境主机能连上测试环境主机,但测试环境主机不能连上生产环境主机,所以这里测试环境主机不需要将密钥发送给生产环境主机 2、升级和回滚 升级 ansible-playbook/home/app/api.yml-v 回滚 ansible-playbook/home/app/api-rollback.yml-v ansible-playbook后面跟上之前写的yml文件路径,-v是为了显示详细执行信息 3、注意 如果在jenkins中执行升级和回滚的yml文件,一定要将在jenkins用户的公钥发送给生产环境主机和测试环境主机,否则会报权限错误 要操作的主机一定要填入/etc/ansible/hosts中 两个yml文件已在生产环境中验证

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册