Java学习笔记——内部类(成员类,局部类,匿名类)-程序员宅基地

技术标签: 程序员  学习  java  笔记  

private 为了保证数据的安全性

package review.InnerDemo;

class Computer{

private class Chip{

public void function(){

System.out.println(“芯片工作”);

}

}

public void show(){

Chip c = new Chip();

c.function();

}

}

public class demo3 {

public static void main(String[] args) {

Computer o = new Computer();

o.show();

//内部类加入了private权限修饰符之后,就不能被访问了

//Computer.Chip c = new Computer().new Chip();是错误的

}

}

芯片在电脑的里面,我们不希望芯片这个内部类被外界访问,所以用private修饰

这时我们只能在Computer类里面创建Chip类的对象,再由这个对象来调用成员变量或者成员方法。再像之前那样用外部类名.内部类名 对象名 = 外部类对象.内部类对象;的方法来创建内部类对象就不行了

那么有private修饰符,也有static修饰符

成员内部类加上一个static修饰符后变成静态内部类

格式为

class Outer{

static class Inner{

//静态内部类

}

}

static 为了让数据访问更方便

  1. 被静态修饰的成员内部类只能访问外部类的静态成员

  2. 静态内部类可以有静态成员,而非静态内部类则不能有静态成员(成员包括变量和方法)

  3. 非静态的成员内部类,成员只能是非静态的。

  4. 内部类被静态修饰后的方法有静态和非静态之分。他们的访问和不用静态是不一样的。

访问非静态方法:外部类名.内部类名 对象名 = new 外部类名.内部类名();

访问静态方法:上面创建的对象访问,或者外部类名.内部类名.方法名();

package review.InnerDemo;

class Computer1{

int num1 = 10;

static int num2 = 20;

public static class Chip1{

public static void show1(){ //内部类的静态方法

System.out.println(num2); //只能访问外部类的静态成员变量num2

System.out.println(“静态方法”);

}

public void show2(){ //内部类的非静态方法

System.out.println(“非静态方法”);

}

}

}

public class demo4 {

public static void main(String[] args) {

//访问非静态方法

Computer1.Chip1 c = new Computer1.Chip1();

c.show2();

System.out.println(“==========”);

//访问静态方法

c.show1();

System.out.println(“==========”);

//访问静态方法

Computer1.Chip1.show1();

}

}

结果为

在这里插入图片描述

局部内部类

  1. 可以直接访问外部类的成员

  2. 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

局部内部类存在于方法中。

package review.InnerDemo;

class Outer3{

int num1 = 10;

public void show(){

int num2 = 20;

class Inner3{

int num3 = 30;

public void show2(){

System.out.println(num3);

System.out.println(num2);

System.out.println(num1);

}

}

//num2 = 40; 这里无法修改num2的值

//jdk1.8之后会自动在局部方法上的局部变量添加final

//System.out.println(num2);在这里打印的结果是num2 = 20

//创建内部类对象,通过对象调用成员变量

Inner3 i = new Inner3();

i.show2();

}

}

public class demo5 {

public static void main(String[] args) {

Outer3 o = new Outer3();

o.show();

}

}

结果为

在这里插入图片描述

局部内部类和成员内部类的区别

  1. 局部内部类的作用范围在方法或者作用域之内

  2. 局部内部类不能用public或private访问说明符进行声明

package review.InnerDemo;

class Outer3{

public void show(){

class Inner3{

public void show2(){

//这两种方式调用外部类的方法,结果是一样的

Outer3.this.test();

test();

}

}

Inner3 i = new Inner3();

i.show2();

}

public void test(){

System.out.println(“外部类方法”);

//要注意,不能在这里创建内部类的对象,超出局部内部类的作用范围

//Inner3 i = new Inner3();

}

}

public class demo5 {

public static void main(String[] args) {

Outer3 o = new Outer3();

o.show();

}

}

结果为

在这里插入图片描述

匿名内部类

就是内部类的简化写法。

前提:存在一个类或者接口。这里的类可以是具体类也可以是抽象类。

格式:

new 抽象类名或者接口名() {

重写方法;

}

先来看看如果不适用匿名内部类,应该怎么写

在这里插入图片描述

public interface interDemo {

public abstract void show1();

public abstract void show2();

}

abstract class abstractDemo {

public abstract void test();

}

class Inter implements interDemo{

public void show1(){

System.out.println(“show1”);

}

public void show2(){

System.out.println(“show2”);

}

}

public class Ab extends abstractDemo{

public void test(){

System.out.println(“test”);

}

}

public class demo1 {

public void function(){

Inter i = new Inter();

i.show1();

i.show2();

Ab a = new Ab();

a.test();

}

public static void main(String[] args) {

demo1 d = new demo1();

d.function();

}

}

结果为

在这里插入图片描述

这样写无疑是比较麻烦的,现在再来看看,使用匿名内部类后怎么写

public interface interDemo {

public abstract void show1();

public abstract void show2();

}

abstract class abstractDemo {

public abstract void test();

}

package review.InnerDemo.anonymous;

public class demo1 {

public void function(){

interDemo i = new interDemo(){

public void show1(){

System.out.println(“show1”);

}

public void show2(){

System.out.println(“show2”);

}

};

i.show1();

i.show2();

abstractDemo a = new abstractDemo() {

@Override

public void test() {

System.out.println(“test”);

}

};

a.test();

}

public static void main(String[] args) {

demo1 d = new demo1();

d.function();

}

}

结果是

在这里插入图片描述

跟之前的结果一样,但代码简洁了许多

那么到具体的情景中,要怎么使用匿名内部类呢

首先定义一个接口,学生要学习,里面有两个抽象方法 读书read和背诵recite

public interface Study {

public abstract void read();

public abstract void recite();

}

package review.anonymous1;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,希望可以给各位提供一些帮助:**

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

[外链图片转存中…(img-y1HszvJA-1713138250392)]

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-j50kQVI3-1713138250393)]

还有源码相关的阅读学习

[外链图片转存中…(img-6241GAf8-1713138250393)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rfhntn/article/details/137763714

智能推荐

vue引入原生高德地图_前端引入原生地图-程序员宅基地

文章浏览阅读556次,点赞2次,收藏3次。由于工作上的需要,今天捣鼓了半天高德地图。如果定制化开发需求不太高的话,可以用vue-amap,这个我就不多说了,详细就看官网 https://elemefe.github.io/vue-amap/#/zh-cn/introduction/install然而我们公司需要英文版的高德,我看vue-amap中好像没有这方面的配置,而且还有一些其他的定制化开发需求,然后就只用原生的高德。其实原生的引入也不复杂,但是有几个坑要填一下。1. index.html注意,引入的高德js一定要放在头部而_前端引入原生地图

ViewGroup重写大法 (一)-程序员宅基地

文章浏览阅读104次。本文介绍ViewGroup重写,我们所熟知的LinearLayout,RelativeLayout,FrameLayout等等,所有的容器类都是ViewGroup的子类,ViewGroup又继承View。我们在熟练应用这些现成的系统布局的时候可能有时候就不能满足我们自己的需求了,这是我们就要自己重写一个容器来实现效果。ViewGroup重写可以达到各种效果,下面写一个简单的重写一个Vi..._viewgroup 重写

Stm32学习笔记,3万字超详细_stm32笔记-程序员宅基地

文章浏览阅读1.8w次,点赞279次,收藏1.5k次。本文章主要记录本人在学习stm32过程中的笔记,也插入了不少的例程代码,方便到时候CV。绝大多数内容为本人手写,小部分来自stm32官方的中文参考手册以及网上其他文章;代码部分大多来自江科大和正点原子的例程,注释是我自己添加;配图来自江科大/正点原子/中文参考手册。笔记内容都是平时自己一点点添加,不知不觉都已经这么长了。其实每一个标题其实都可以发一篇,但是这样搞太琐碎了,所以还是就这样吧。_stm32笔记

CTS(13)---CTS 测试之Media相关测试failed 小结(一)_mediacodec框架 cts-程序员宅基地

文章浏览阅读1.8k次。Android o CTS 测试之Media相关测试failed 小结(一)CTSCTS 即兼容性测试套件,CTS 在桌面设备上运行,并直接在连接的设备或模拟器上执行测试用例。CTS 是一套单元测试,旨在集成到工程师构建设备的日常工作流程(例如通过连续构建系统)中。其目的是尽早发现不兼容性,并确保软件在整个开发过程中保持兼容性。CTS 是一个自动化测试工具,其中包括两个主要软件组件:CTS tra..._mediacodec框架 cts

chosen.js插件使用,回显,动态添加选项-程序员宅基地

文章浏览阅读4.5k次。官网:https://harvesthq.github.io/chosen/实例化$(".chosen-select").chosen({disable_search_threshold: 10});赋值var optValue = $(".chosen-select").val();回显1.设置回显的值$(".chosen-select").val(“opt1”);2.触发cho..._chosen.js

C++ uint8_t数据串如何按位写入_unit8_t 集合 赋值 c++-程序员宅基地

文章浏览阅读1.9k次。撸码不易,网上找不到,索性自己写,且撸且珍惜!void bitsWrite(uint8_t* buff, int pos, int size, uint32_t value){ uint32_t index[] = { 0x80000000, 0x40000000, 0x20000000, 0x10000000, 0x8000000, 0x4000000, 0x2000000, 0x1000000, 0x800000, 0x400000, 0_unit8_t 集合 赋值 c++

随便推点

【路径规划】基于matlab粒子群算法新型概率密度无人机作战路径规划【含Matlab源码 2620期】_已知目标出现概率热图matlab无人机路径规划-程序员宅基地

文章浏览阅读183次。粒子群算法新型概率密度无人机作战路径规划完整的代码,方可运行;可提供运行操作视频!适合小白!_已知目标出现概率热图matlab无人机路径规划

navicat执行.sql文件_navicat执行sql文件-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏19次。1、准备好需要执行的.sql文件.sql文件需要注意:每条语句都需要用;作为结束,否则属于语法错误,执行会报错。我们用下面3条语句生成.sql文件测试一下:select SYSDATE() from dual;select COUNT(100) from dual;select CONCAT_WS(' ','test','import','.sql','files');将它保存为import_demo.sql等待测试。2、navicat中选中数据库右键选择.sql文件进行执行选中目标数据库_navicat执行sql文件

Javaweb框架 思维导图_javaweb框架图-程序员宅基地

文章浏览阅读748次。javaweb知识点_javaweb框架图

adb的升级与版本更新_adb iptabls怎么升级-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏16次。adb是没有自动升级的命令的,如果想要更新adb的版本,我们可以在网上找到自己想要的版本进行更新给大家提供几个版本https://pan.baidu.com/s/1yd0dsmWn5CK08MlyuubR7g&shfl=shareset 提取码: 94z81、下载解压后我们可以找到下面几个文件,并复制2、找到adb安装的文件夹下的platform-tools文件夹,我这里是..._adb iptabls怎么升级

微信苹果版删除所有的聊天记录的图文教程_mac微信怎么删除聊天列表-程序员宅基地

文章浏览阅读3.8k次。很多用户可能都知道怎么在Windows系统上删除微信的聊天记录,那么苹果电脑上的微信软件怎么删除所有的聊天记录呢?下面小编就专门来给大家讲下微信mac版删除所有的聊天记录的图文教程。点击后会弹出提示窗口,点击这里的确认按钮就可以将其清理掉了。在这里选择要清理的数据,然后点击下方右边的清理按钮就行了。在mac上打开微信后,点击左下角的横线图标。然后再点击这里的管理微信聊天数据按钮。打开了设置窗口,点击上方的“通用”。在这里点击下方的前往清理按钮。点击弹出菜单里的“设置”。_mac微信怎么删除聊天列表

【报错笔记】数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:..._request processing failed; nested exception is jav-程序员宅基地

文章浏览阅读7.7k次。数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:For input String “20151512345”报错原因:数字格式异常,接着后面有 For input string: “201515612343” 提示,这就告诉我们你当前想把 “201515612343” 转换成数字类型时出错了。解决方案:使用2015151612343这个数字太大了,所以直接使用string_request processing failed; nested exception is java.lang.numberformatexcepti

推荐文章

热门文章

相关标签