面向对象9

面向对象9

一.内部类

1、什么是内部类?

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)

2、为什么需要内部类?

具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。

总的来说,遵循高内聚、低耦合的面向对象开发原则。

3、内部类使用举例:

Thread类内部声明了State类,表示线程的生命周期 HashMap类中声明了Node类,表示封装的key和value

4、内部类的分类:(参考变量的分类)

成员内部类:直接声明在外部类的里面。 使用static修饰的:静态的成员内部类 不使用static修饰的:非静态的成员内部类

局部内部类:声明在方法内、构造器内、代码块内的内部类 匿名的局部内部类 非匿名的局部内部类

5、内部类主要知识:

成员内部类的理解 如何创建成员内部类的实例 如何在成员内部类中调用外部类的结构 局部内部类的基本使用

6、关于成员内部类的理解:

从类的角度看:

内部可以声明属性、方法、构造器、代码块、内部类等结构 此内部类可以声明父类,可以实现接口

  • 可以使用final修饰

  • 可以使用abstract修饰

从外部类的成员的角度看:

在内部可以调用外部类的结构。比如:属性、方法等 除了使用public、缺省权限修饰之外,还可以使用private、protected修饰

可以使用static修饰

二、枚举类的使用

1、枚举类的理解

枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。

2、举例:

  • 星期`:Monday(星期一)......Sunday(星期天)

  • 性别:Man(男)、Woman(女)

  • 月份:January(1月)......December(12月)

  • 季节:Spring(春节)......Winter(冬天)

  • 三原色:red(红色)、green(绿色)、blue(蓝色)

  • 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)

  • 就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、Dimission(离职)

  • 订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已确认收货)、Return(退货)、Exchange(换货)、Cancel(取消)

  • 线程状态:创建、就绪、运行、阻塞、死亡

3、开发中的建议:

开发中,如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类。 如果枚举类的实例只有一个,则可以看做是单例的实现方式。

4、JDK5.0 之前如何自定义枚举类 (了解)

class Season{//2. 声明当前类的对象的实例变量,使用private final修饰private final String seasonName;//季节的名称private final String seasonDesc;//季节的描述
​//1. 私有化类的构造器private Season(String seasonName,String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}
​//3. 提供实例变量的get方法public String getSeasonName() {return seasonName;}
​public String getSeasonDesc() {return seasonDesc;}//4. 创建当前类的实例,需要使用public static final修饰public static final Season SPRING = new Season("春天","春暖花开");public static final Season SUMMER = new Season("夏天","夏日炎炎");public static final Season AUTUMN = new Season("秋天","秋高气爽");public static final Season WINTER = new Season("冬天","白雪皑皑");
​@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
}

5、JDK5.0中使用enum定义枚举类

enum Season1 implements Info{//1. 必须在枚举类的开头声明多个对象。对象之间使用,隔开SPRING("春天","春暖花开"),SUMMER("夏天","夏日炎炎"),AUTUMN("秋天","秋高气爽"),WINTER("冬天","白雪皑皑");
​//2. 声明当前类的对象的实例变量,使用private final修饰private final String seasonName;//季节的名称private final String seasonDesc;//季节的描述
​//3. 私有化类的构造器private Season1(String seasonName,String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}
​//4. 提供实例变量的get方法public String getSeasonName() {return seasonName;}
​public String getSeasonDesc() {return seasonDesc;}
​@Overridepublic String toString() {return "Season1{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
​@Overridepublic void show() {System.out.println("这是一个季节");}
}
​

6、Enum中的常用方法:

6.1 使用enum关键字定义的枚举类,默认其父类是java.lang.Enum类 使用enum关键字定义的枚举类,不要再显示的定义其父类。否则报错。 6.2 熟悉Enum类中常用的方法 String toString(): 默认返回的是常量名(对象名),可以继续手动重写该方法! (关注)static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法 (关注)static 枚举类型 valueOf(String name):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。 String name():得到当前枚举常量的名称。建议优先使用toString()。 int ordinal():返回当前枚举常量的次序号,默认从0开始

7、枚举类实现接口的操作

情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法。 情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现的方法。

三、注解的使用

1、Annotation的理解

注解(Annotation)是从JDK5.0开始引入,以“@注解名”在代码中存在。 Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。 还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=value” 对中。 注解可以在类编译、运行时进行加载,体现不同的功能。

2、注解的应用场景:

示例1:生成文档相关的注解 示例2:在编译时进行格式检查(JDK内置的三个基本注解) 示例3:跟踪代码依赖性,实现替代配置文件功能

3、Java基础涉及到的三个常用注解

@Override: 限定重写父类方法,该注解只能用于方法

@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择

@SuppressWarnings`: 抑制编译器警告

4、自定义注解

以@SuppressWarnings为参照,进行定义即可。

5、元注解的理解:

元注解:对现有的注解进行解释说明的注解。

(1)@Target:用于描述注解的使用范围 可以通过枚举类型ElementType的10个常量对象来指定 TYPE,METHOD,CONSTRUCTOR,PACKAGE.....

(2)@Retention:用于描述注解的生命周期 可以通过枚举类型RetentionPolicy的3个常量对象来指定 SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时) 唯有RUNTIME阶段才能被反射读取到。

(3)@Documented:表明这个注解应该被 javadoc工具记录。

(4)@Inherited:允许子类继承父类中的注解

框架 = 注解 + 反射 + 设计模式

四、包装类的使用

1、为什么要使用包装类?

为了使得基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性),我们给各个基本数据类型的变量都提供了对应的包装类。

2、(掌握)基本数据类型对应的包装类类型

byte -> Byte short -> Short int -> Integer long -> Long float -> Float double ->Double

char -> Character boolean -> Boolean

3、掌握基本数据类型 与 包装类之间的转换。

3.1 为什么需要转换

一方面,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要将基本数据类型的变量转换为包装类的对象。比如:ArrayList的add(Object obj);Object类的equals(Object obj) 对于包装类来讲,既然我们使用的是对象,那么对象是不能进行+ - * /等运算的。为了能够进行这些运算,就需要将包装类的对象转换为基本数据类型的变量。

3.2 如何转换:

(装箱)基本数据类型 ---> 包装类:① 使用包装类的构造器 ② (建议)调用包装类的valueOf(xxx xx) (拆箱)包装类 ---> 基本数据类型:调用包装类的xxxValue()

注意:原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了!

jdk5.0新特性:自动装箱、自动拆箱。

        //自动装箱:   基本数据类型 ---> 包装类int i1 = 10;Integer ii1 = i1; //自动装箱System.out.println(ii1.toString());
​Integer ii2 = i1 + 1; //自动装箱
​Boolean bb1 = true;//自动装箱
​Float f1 = 12.3F;  //自动装箱
​//自动拆箱:包装类 ---> 基本数据类型
​int i2 = ii1;  //自动拆箱
​boolean b1 = bb1;//自动拆箱
​

4、String 与 基本数据类型、包装类之间的转换。

基本数据类型、包装类 ---> String类型:① 调用String的重载的静态方法valueOf(xxx xx) ; ② 基本数据类型的变量 + ""

String类型 ---> 基本数据类型、包装类: 调用包装类的静态方法:parseXxx()

        String s1 = "123";int i1 = Integer.parseInt(s1);System.out.println(i1 + 10);String s2 = "true";boolean b1 = Boolean.parseBoolean(s2);//方式1:调用String的重载的静态方法valueOf(xxx xx)int i1 = 10;String str1 = String.valueOf(i1);System.out.println(str1);//"10"
​boolean b1 = true;Boolean b2 = b1;String str2 = String.valueOf(b1);String str3 = String.valueOf(b2);
​//方式2:基本数据类型的变量 + ""String str4 = i1 + "";String str5 = b1 + "";

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

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

相关文章

操作系统八股|用户态和内核态

文章目录 内核态(Kernel Mode)用户态(User Mode)用户态和内核态之间的切换为什么要切换如何切换系统调用硬件中断异常处理 为了使操作系统内核提供⼀个⽆懈可击的进程抽象,处理器必须提供⼀种机制, 限制⼀个应⽤可以执⾏的指令以及他可以⽤来访问的地址…

4.4C++

1 #include <iostream> #include <cmath> using namespace std; class A{ private:int a;// 判断一个数是否为质数bool isP(int num) {if (num<2) return false;for (int i2;i<sqrt(num);i) {if (num % i 0) {return false;}}return true;} public:// 构造…

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…

Linux进程概念(二):进程的基本概念与进程的创建

目录 进程的基本概念 进程控制块-PCB 学前补充 预备知识 创建&#xff08;子&#xff09;进程 创建&#xff08;子&#xff09;进程的原因 理解fork有两个返回值 进程的基本概念 基本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核层面&#x…

R语言数据分析基础(四)- 引用其他文件中的函数

在R语言中&#xff0c;要引用其他文件中的函数&#xff0c;可以使用source()或load()函数。source()函数用于执行一个R脚本文件&#xff0c;而load()函数用于加载一个包含函数定义的R包。 使用source()函数引用其他文件中的函数&#xff1a; # 假设有一个名为my_functions.R的…

(源码+讲解+部署)基于Spring Boot和Vue的考研教育系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《128套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

使用generator实现async函数

我们先来看一下async函数是怎么使用的 const getData (sec) > new Promise((resolve) > {setTimeout(() > resolve(sec * 2), sec * 1000);})// aim to get this asycnFun by generator async function asyncFun() {const data1 await getData(1);const data2 awa…

打造专业运营团队,武汉星起航引领全球跨境电商未来趋势

近年来&#xff0c;随着全球经济的不断发展&#xff0c;跨境电商作为国际贸易的一种新模式&#xff0c;已然成为推动全球经济增长的新引擎。在这个浩荡的潮流中&#xff0c;武汉星起航以亚马逊自营店铺为依托&#xff0c;凭借丰富的实战运营经验和专业的团队&#xff0c;正积极…

富格林:正规防卫虚假操作现象

富格林悉知&#xff0c;随着经济的快速增长&#xff0c;如今投资现货黄金的人也越来越多了。但是对于新手投资者来说&#xff0c;想要正确抵御虚假操作避免被骗现象就得掌握一定的正规技巧。而且在现货黄金市场中&#xff0c;掌握正规的交易技巧是获得稳定盈利的重要步骤之一。…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

四信AI智能视频边缘分析盒+传感云平台,开启食品安全智慧监管新模式

方案背景 民以食为天&#xff0c;食品是人类生存必备的物质之一&#xff0c;食品生产安全关乎每个人的生命健康与社会可持续发展。在食品生产过程中&#xff0c;如何实现安全、健康生产是监管机构首要考虑因素&#xff0c;也是当今社会必须共同关注与努力的方向。 监管机构必…

Shell学习 - 2.24 Shell let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的&#xff0c;它们都是用来对整数进行运算&#xff0c;读者已经学习了《Shell (())》&#xff0c;再学习 let 命令就相当简单了。 注意&#xff1a;和双小括号 (( )) 一样&#xff0c;let 命令也只能进行整数运算&#xff0c;不能对小数…

理想大模型实习面试题6道(答案解析)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 最大的感…

springboot如何给上传的图片加水印,java工具类分享

我写了一个摄影网站&#xff0c;但是不太希望其他用户窃取别人的图片&#xff0c;需要业务中有一个加水印的功能 /*** 图片文件上传*/Autowiredprivate StringRedisTemplate redisTemplate;PostMapping(value "/imageUpload", name "图片文件上传")publi…

离线 Linux 开发环境搭建

背景 无法连接外面的内网开发 通常需要打通如下&#xff1a; 虚拟机和网络模式VSCode 插件安装虚拟机软件安装 虚拟机和网络模式 虚拟机可以使用 Windows 自带的 Hyper-V 通常受限网络&#xff0c;网络模式更为复杂 Hyper-V 虚拟机有很多网络模式&#xff1a; 网络开机…

「33」如何让你的直播场景增加透视感?

「33」模糊滤镜增强背景画面透视感 在直播中,背景一直是作为一种陪衬而存在的,位于主场景的后面,其实,说得更直白一些,背景的存在就犹如“绿叶”,是为了衬托红花更加艳丽。所以…… 你通过画面背景的调整,可以从整体上对视频或图片的画面进行装饰,有助于增加画面的空间…

面试算法-127-优势洗牌

题目 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&#xff0c;使其相对于 nums2 的优势最大化。 示例 1&#xff1a; 输入&#xff1a;nums1 [2,7,11,…

【C++】vector问题解决(非法的间接寻址,迭代器失效 , memcpy拷贝问题)

送给大家一句话&#xff1a; 世界在旋转&#xff0c;我们跌跌撞撞前进&#xff0c;这就够了 —— 阿贝尔 加缪 vector问题解决 1 前言2 迭代器区间拷贝3 迭代器失效问题4 memcpy拷贝问题 1 前言 我们之前实现了手搓vector&#xff0c;但是当时依然有些问题没有解决&#xff…

牛市股票还会亏钱?--外观模式

1.1 牛市股票还会亏钱&#xff1f; 炒股&#xff0c;碰到熊市&#xff0c;亏得一塌糊涂。 "我们公司的人现在都在炒股票&#xff0c;其实大部分人都不太懂&#xff0c;就是因为现在股市行情很火&#xff0c;于是都在跟风呢&#xff01;" 刚入市的人&#xff0c;什么都…

Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

目录 端口协议-口令爆破&未授权 弱口令爆破 FTP&#xff1a;文件传输协议 RDP&#xff1a;Windows远程桌面协议 SSH&#xff1a;Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…