Java入门基础day29

day29

内部类

分类

非静态成员内部类

静态成员内部类

局部内部类

匿名内部类

概念

在一个类的内部,再定义一个完整的类

特点:

编译之后可以生成一个独立的字节码class文件

内部类可以直接访问外部类的私有成员,而不会破坏其封装性

可以为外部类提供必要的内部功能组件

package com.saas.oo1;
​
public class Outer {
​private int num = 100;
​class Inner{public void test(){System.out.println(num);}}
}

在Inner类中可以访问Outer类里面的私有成员num

因为Inner类是Outer类的内部类

内部类可以访问外部类的私有成员

内部类的成员访问

package com.saas.oo1;
​
public class Outer03 {
​int num;
​public void test01(){System.out.println("this is test01 method.");}
​public class Inner01{double score;
​public void test02(){System.out.println("this is test02 method.");}}
}
package com.saas.oo1;
​
public class TestOutter03 {
​public static void main(String[] args) {Outer03 o = new Outer03();
​o.num = 1000;System.out.println(o.num);o.test01();
​System.out.println("================");
​Outer03.Inner01 i01 = new Outer03().new Inner01();
​i01.score = 99.99;System.out.println(i01.score);i01.test02();}
}

Inner01作为Outter03的内部类,其地位与非静态成员num和test01类似

想要访问num和test01就必须得创建Outter03对象

类似的也可以通过Outter03对象来访问Inner01

所以就像访问num和test01一样访问Inner类中的score和test02

package com.saas.oo1;
​
public class Outer03 {
​int num;
​static int n;
​public void test01(){System.out.println("this is test01 method.");}
​public static void test03(){System.out.println("this is test03 method.");}
​public class Inner01{double score;                //  非静态内部类中可定义非静态属性
​//static double score02;      //  非静态内部类中不可定义静态属性
​public void test02(){       //  非静态内部类中可定义非静态方法System.out.println("this is test02 method.");}
​
//        public static void test05(){          //  非静态内部类中不能定义静态方法
//
//        }}
​public static class Inner02{static double score;
​double score02;             //  静态内部类中可以定义非静态成员变量
​public static void test04(){System.out.println("this is test04 method.");}
​public void test06(){       //  静态内部类中可以定义非静态成员方法System.out.println("this is test06 method.");}}
}
package com.saas.oo1;
​
public class TestOutter03 {
​public static void main(String[] args) {Outer03 o = new Outer03();
​o.num = 1000;System.out.println(o.num);o.test01();
​System.out.println("================");
​Outer03.Inner01 i01 = new Outer03().new Inner01();
​i01.score = 99.99;System.out.println(i01.score);i01.test02();
​System.out.println("================");
​Outer03.n = 2000;
​System.out.println(Outer03.n);Outer03.test03();
​System.out.println("================");
​Outer03.Inner02.score = 88.88;System.out.println(Outer03.Inner02.score);Outer03.Inner02.test04();
​System.out.println("================");
​Outer03.Inner02 i02 = new Outer03.Inner02();
​i02.score02 = 77.77;System.out.println(i02.score02);i02.test06();}
}

在一个类的内部可以分别定义非静态内部类和静态内部类

非静态内部类中只能定义非静态成员变量和非静态成员方法,访问该非静态成员如下:

new Outter().new Inner().xxx,   访问非静态成员变量
new Outter().new Inner().xxx(), 访问非静态成员方法

非静态内部类中不能定义静态成员属性和静态成员方法

静态成员内部类可以定义静态成员属性和静态成员方法,访问该静态成员如下:

Outer.Inner.xxx.                访问静态成员变量
Outer.Inner.xxx().              访问静态成员方法    

静态内部类中还可以定义非静态成员属性和非静态成员方法:访问如下:

new Outer.Inner().xxx           访问非静态成员变量
new Outer.Inner().xxx()         访问非静态成员方法

局部内部类

定义在外部类的方法中,作用范围和创建对象的范围仅限于当前方法

局部内部类访问外部类当前方法中的局部变量时,因无法保证变量的生命周期与自身相同,变量必须得用final修饰,注意jdk7的区别

限制类的使用范围

package com.saas.oo1;public class Outer05 {public void test(){//        Inner in02 = new Outer.Inner();
//
//        in02.m = 999;
//        in02.test01();class Inner{int m ;public void test01(){System.out.println("this is test01");}}Inner in = new Inner();     //  局部内部类的作用范围是从定义位置开始到方法结束in.m = 12;System.out.println(in.m);in.test01();}public void test02(){
//        Inner in = new Inner();       //  局部内部类作用于某一个方法,在当前方法中可以访问,其他方法不能访问}public static void main(String[] args) {Outer05 o = new Outer05();o.test();}
}

匿名内部类

没有类名的局部内部类(一切特征都与局部内部类相同)

必须继承一个父类或者实现一个接口

定义类、实现类、创建对象的语法合并,只能创建一个类的对象

优点:减少代码量

缺点:可读性较差

package com.saas.oo2;public interface USB {void service();
}
package com.saas.oo2;public class Mouse implements USB{@Overridepublic void service() {System.out.println("mouse starts working...");}
}
package com.saas.oo2;public class Test {public static void main(String[] args) {Mouse m = new Mouse();m.service();System.out.println("===============");USB keyBoard = new USB() {@Overridepublic void service() {System.out.println("键盘开始工作。");}};keyBoard.service();keyBoard.service();keyBoard.service();keyBoard.service();System.out.println("===============");new USB(){@Overridepublic void service() {System.out.println("风扇开始工作");}}.service();System.out.println("===============");new USB(){@Overridepublic void service() {System.out.println("小米su7汽车开始工作");}}.service();System.out.println("===============");System.out.println(new Object() {@Overridepublic String toString() {return "hehe";}}.toString());}
}

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

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

相关文章

Flutter之TabBar篇

总结了一下项目中用到的几种TabBar,针对不同的样式,有采用系统提供的,也有三方插件提供的,也有自定义的,效果如下(后续如果遇到新的样式,会不间断地记录更新,避免重复造轮子…&#…

性能分析-数据库与磁盘知识

数据库 数据库,其实是数据库管理系统dbms。 数据库管理系统, 常见: 关系型数据库: mysql、pg、 库的表,表与表之间有关联关系; 表二维表统一标准的SQL(不局限于CRUD)非关系型数据…

ssm034学生请假系统+jsp

学生请假系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生请假系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处…

C++11 新特性:std::array

std::array是 C11 中引入的容器类型,它封装了固定大小的数组,提供了类似于 STL 容器的接口,同时保持了 C 风格数组的性能特性。 与普通数组相比,std::array更安全、更易于使用,并且支持迭代器。以下是std::array提供的…

-webkit-input-placeholder的意思

-webkit-input-placeholder是一个CSS伪类选择器,用于设置表单输入字段的占位文本样式。-webkit-input-placeholder是Webkit浏览器私有的前缀,用于适用于Webkit内核的浏览器(如Chrome和Safari)。 使用-webkit-input-placeholder&a…

鸿蒙HarmonyOS开发实例:【简单时钟】

简单时钟 介绍 本示例通过使用[ohos.display]接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 主页 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * M…

Microsoft Visio 参与者 [actor] - 人的形状图标

Microsoft Visio 参与者 [actor] - 人的形状图标 1. 更多形状 -> 搜索形状2. 参与者References 1. 更多形状 -> 搜索形状 2. 参与者 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

网络入门基础:从概念到实践

导言 网络已经成为了我们日常生活和工作中不可或缺的一部分,无论是用于沟通、学习、娱乐还是商务交易,网络都扮演着至关重要的角色。本文将介绍网络的基础知识,从概念到实践,帮助初学者了解网络的基本原理和构成,以便…

【简单讲解下如何Java中文乱码浅析及解决方案】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

力扣经典150题(1)

文章目录 6.Z字形变换82.删除排序链表中的重复元素||61.旋转链表100.相同的树 6.Z字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下&#xff1…

Spring循环依赖

Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_java 常见面试题详解(locksupport-CSDN博客 循环依赖现象在spring容器中注入依赖的对象,有2种情况 构造器方式注入依赖(不可行…

如何在HarmonyOS(鸿蒙操作系统)上进行应用开发

文章中提到的关键点包括: 学习ArkTS:作者建议初学者首先学习使用ArkTS编写Hello World程序,并可以通过TypeScript教程来快速掌握基础语法。对于有Flutter或React Native开发经验的开发者来说,页面布局会比较容易上手。 页面布局&…

基于遗传优化的SVD水印嵌入提取算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化的的SVD水印嵌入提取算法。对比遗传优化前后SVD水印提取性能,并分析不同干扰情况下水印提取效果。 2.测试软件版本以及运行结果展示 MA…

18、差分

差分 题目描述 输入一个长度为n的整数序列。 接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数,表示整…

根据mysql的执行顺序来写select

过滤顺序指的是mysql的逻辑执行顺序,个人觉得我们可以按照执行顺序来写select查询语句。 目录 一、执行顺序二、小tips三、案例第一轮查询:统计每个num的出现次数第二轮查询:计算**最多次数**第三轮查询:找到所有出现次数为最多次…

图片地址生成二维码(通过前端实现)

文章目录 概要安装插件代码实例 概要 要将图片地址生成二维码,你可以使用 QrCode 库(假设你已经在项目中引入了该库)。以下是一个简单的示例代码,演示了如何使用 QrCode 库将图片地址转换为二维码并显示在页面上 安装插件 先下载…

Linux使用宝塔面板安装MySQL结合内网穿透实现公网连接本地数据库

文章目录 推荐前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

【docker】Docker 简介

Docker 简介 什么是虚拟化、容器化?为什么要虚拟化、容器化?虚拟化实现方式应用程序执行环境分层虚拟化常见类别虚拟机容器JVM 之类的虚拟机 常见虚拟化实现主机虚拟化(虚拟机)实现容器虚拟化实现容器虚拟化实现原理容器虚拟化基础之 NameSpace 什么是虚拟化、容器…

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

分享一个入门SAR ADC的完整电路项目,适合新手小白学习 10bit 20MHz SAR ADC(WX:didadidadidida313,加我备注:CSDN 10 bit SAR ADC,谢绝白嫖哈) 概述: 本设计采用 smic18mmrf CMOS 工艺&#xf…

【自然语言】使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化

一、任务目标 python代码写将 HarryPorter 电子书作为语料库,分别使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化。 1. 首先将数据预处理,Word2Vec 训练时要求考虑每个单词前后的五个词汇,地址为 作为其上下文 &#xf…