Java_从入门到JavaEE_12+13

一、内部类

  1. 理解:一个类中再声明另外一个类
  2. 分类:
    1. 成员内部类
    2. 静态内部类
    3. 接口内部类
    4. 局部内部类
    5. 匿名内部类

1.成员内部类

案例:创建成员内部类的对象,并调用方法

import com.lv.outter_inner_02.Outter.Inner;
public class Test {public static void main(String[] args) {Inner inner = new Outter().new Inner();inner.method();}
}
package com.lv.outter_inner_02;
//外部类
public class Outter {private 	String str1 = "属性1";String str2 = "属性2";protected 	String str3 = "属性3";public 		String str4 = "属性4";final 		String str5 = "属性5";static 		String str6 = "属性6";static final String str7 = "属性7";//成员内部类class Inner{String str1 = "成员内部类的属性";public void method(){System.out.println("成员内部类的方法");System.out.println(str1);//this.str1System.out.println(Outter.this.str1);System.out.println(str2);//Outter.this.str2System.out.println(str3);//Outter.this.str3System.out.println(str4);//Outter.this.str4System.out.println(str5);//Outter.this.str5System.out.println(str6);//Outter.str6System.out.println(str7);//Outter.str7}}	
}

总结:

  1. 创建成员内部类对象,必须先创建外部类对象,再创建内部类对象
  2. 成员内部类可以使用外部类所有的属性

2.静态内部类

案例:创建静态内部类的对象,并调用方法

import com.lv.outter_inner_03.Outter.Inner;
public class Test {public static void main(String[] args) {Inner inner = new Outter.Inner();inner.method();	}
}
package com.lv.outter_inner_03;
//外部类
public class Outter {	static 		String str1 = "属性1";static final String str2 = "属性2";//静态内部类static class Inner{		public void method(){System.out.println("静态内部类的方法");System.out.println(str1);//Outter.str6System.out.println(str2);//Outter.str7}}}

总结:

  1. 创建静态内部类对象,不用创建外部类对象
  2. 静态内部类只能使用外部类的静态属性

3.接口内部类

案例:创建接口内部类的对象,并调用方法

import com.lv.outter_inner_04.Outter.Inner;
public class Test {public static void main(String[] args) {	Inner inner = new Outter.Inner();inner.method();	}
}
package com.lv.outter_inner_04;
//外部接口
public interface Outter {	//接口内部类//public static class Inner{class Inner{public void method(){System.out.println("接口内部类的方法");}}	
}

总结:

  1. 接口内部类就是静态内部类
  2. 接口内部类默认使用public static修饰

4.局部内部类

案例:调用局部内部类里的方法

package com.lv.outter_inner_05;
public class Test {public static void main(String[] args) {Outter outter = new Outter();outter.method();}
}
package com.lv.outter_inner_05;
//外部类
public class Outter {public void method(){		//局部内部类class Inner{public void innerMethod(){System.out.println("局部内部类里的方法");}}		//创建局部内部类对象Inner inner = new Inner();inner.innerMethod();}
}

总结:

  1. 局部内部类不能使用访问修饰符修饰(因为局部内部类的作用域就是在该方法内)
  2. 局部内部类使用到外部类方法里的变量,该变量在JDK1.8开始会自动变成常量

5.匿名内部类

案例:

package com.lv.outter_inner_08;
public class Test {public static void main(String[] args) {	A a = new A() {		@Overridepublic void method() {// TODO Auto-generated method stub				}};	a.method();}
}
package com.lv.outter_inner_08;
public abstract class A {public abstract void method();
}

实现过程:

  1. 底层创建匿名类(Test01$1.class),继承A类,重写method()
  2. 创建匿名类对象
  3. 将匿名类对象的内存地址赋值给父类的引用 – 多态

6.应用场景

  1. A类的对象只在B类中使用,并且A类使用到B类所有的属性 – 可以将A类设置为B类的成员内部类(常用)
  2. A类的对象只在B类中使用,并且A类使用到B类的静态属性 – 可以将A类设置为B类的静态内部类(常用)
  3. A类(抽象类)的子类只创建一次对象,就没必要去创建子类 – 直接使用匿名内部类(new A())(常用)
  4. I1接口的实现类只创建一次对象,就没必要去创建实现类 – 直接使用匿名内部类(new I1())(常用)
  5. A类的对象只在B类某个方法中使用 – 可以将A类设置为B类的局部内部类(少见)
  6. A类的对象只在I1接口中使用 – 可以将A类设置为I1接口的接口内部类(少见)

二、常用类

1.包装类/封装类

  1. 理解:包装类是8种基本数据类型对应的类

  2. 出现原因:

    ​ Java为纯面向对象语言(万物皆对象),但是8种基本数据类型不能new对象,破坏了Java为纯面向对象语言的特征,所以Java又为8种基本你数据类型分别匹配了对应的类,这种类叫做包装类/封装类

  3. 基本数据类型与引用数据类型继承关系

    基本数据类型引用数据类型继承关系
    byteByteObject.Number.Byte
    shortShortObject.Number.Short
    intIntegerObject.Number.Integer
    longLongObject.Number.Long
    floatFloatObject.Number.Float
    doubleDoubleObject.Number.Double
    charCharacterObject.Character
    booleanBooleanObject.Boolean

    注意:int类型对应的包装类是Integer,char类型对应的包装类是Character

  4. 以int为例:

    package com.lv.package_class;public class Test {
    public static void main(String[] args) {		//手动装箱:基本数据类型 转 引用数据类型int a = 100;Integer integer = Integer.valueOf(a);System.out.println(integer);		//手动拆箱:引用数据类型 转 基本数据类型Integer integer = new Integer(100);int b = integer.intValue();System.out.println(b);		//JDK1.5开始提供自动装箱和自动拆箱的特性		//自动装箱:基本数据类型 转 引用数据类型int c = 100;Integer integer = c;//底层实现:Integer.valueOf(i);System.out.println(integer);		//自动拆箱:引用数据类型 转 基本数据类型Integer integer = new Integer(100);int d = integer;//底层实现:integer.intValue();System.out.println(d);//将字符串转换为intString str = "123";int e = Integer.parseInt(str);System.out.println(e);}
    }
    

    经验:学习包装类要举一反三

  5. 包装类(int为例)深入

    package com.lv.package_class;public class Test {public static void main(String[] args) {Integer integer1 = Integer.valueOf(100);Integer integer2 = Integer.valueOf(100);System.out.println(integer1 == integer2);//trueInteger integer3 = Integer.valueOf(200);Integer integer4 = Integer.valueOf(200);System.out.println(integer3 == integer4);//false}
    }
    

    底层分析:

    在Integer中,有一个Integer的缓存类

    public static Integer valueOf(int i){if(i>=IntegerCache.low && i<=IntegerCache.higt){return IntegerCache.cache[i-IntegerCache.low];}return new Integer(i);}
    private static class IntegerCache{	static final int low = -128;static final int higt = 127;static final Integer[] cache;static{cache = new Integer[higt - low + 1];int j = low;for (int i = 0; i < cache.length; i++) {cache[i] = new Integer(j++);}}	}
    

    当输入值超出范围时就会return新的Integer对象,

    这就是为什么System.out.println(integer3 == integer4);的结果为false。

2.字符串的类

  1. 分类:
    1. String
    2. StringBuffer
    3. StringBuilder
1.String的使用
  1. 案例以及分析:
package com.lv.string_class;public class Test {public static void main(String[] args) {String str = "123abc";str = str.concat("DEF123");//concat在末尾追加,并返回新的字符串str = str.substring(2);//substring从开始下标处截取到字符串末尾,并返回新的字符串str = str.substring(1, 7);//substring从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串str = str.toLowerCase();//toLowerCase转小写,并返回新的字符串str = str.toUpperCase();//toUpperCase()转大写,并返回新的字符串//--------------------------------------------------------------------str = "   123   abc   DEF   123         ";str = str.trim();//trim去除首尾空格,并返回新的字符串str = str.replace('2', '6');//replace替换字符,并返回新的字符串str = str.replaceAll("163", "666888");//replaceAll替换字符串,并返回新的字符串str = str.replaceFirst("666", "7777");//replaceFirst替换第一次出现的字符串,并返回新的字符串str = str.replaceAll(" ", "");//去除空格(将空格字符串替换成空内容的字符串)System.out.println("判断两个字符串是否相同(区分大小写):" + str.equals("7777888abcDEF666888"));System.out.println("判断两个字符串是否相同(不区分大小写):" + str.equalsIgnoreCase("7777888ABCDEF666888"));System.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("777"));System.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("666888"));System.out.println("查询出子字符串在字符串中第一次出现的下标:" + str.indexOf("88"));System.out.println("查询出子字符串在字符串中最后一次出现的下标:" + str.lastIndexOf("88"));System.out.println("获取指定下标上的字符:" + str.charAt(7));System.out.println(str);//7777888abcDEF666888//-------------------------------------------------------------//将其他类型转型成StringSystem.out.println(String.valueOf(100));//int -> StringSystem.out.println(String.valueOf(123.123));//double -> StringSystem.out.println(String.valueOf('a'));//char -> StringSystem.out.println(String.valueOf(true));//boolean -> StringSystem.out.println(String.valueOf(new char[]{'a','b','c'}));//char[] -> String//将其他类型转型成String -- 简化版System.out.println(100 + "");System.out.println(123.123 + "");System.out.println('a' + "");System.out.println(true + "");}
}
  1. 深入——String拼接创建对象

    案例以及分析:

    package com.lv.string_class;public class Test {public static void main(String[] args) {		String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);//true		//两个常量在编译时直接拼接String str3 = "ab" + "c";System.out.println(str1 == str3);//true		//两个常量在编译时直接拼接final String s1 = "ab";final String s2 = "c";String str4 = s1 + s2;//反编译:String str4 = "abc";System.out.println(str1 == str4);//true		//变量拼接,底层会创建StringBuilder对象String s3 = "ab";String s4 = "c";String str5 = s3 + s4;//底层实现:String str5 = (new StringBuilder(String.valueOf(s3))).append(s4).toString()System.out.println(str1 == str5);//false	}
    }
    
2.StringBuffer的使用
  1. 案例以及分析:

    package com.lv.string_class;
    public class Test02 {public static void main(String[] args) {		//创建StringBuffer对象StringBuffer sb = new StringBuffer();		//在末尾追加字符串sb.append("123abc");sb.append("DEF123");		sb.insert(6, "XXYYZZ");//将字符串插入到指定下标的位置sb.setCharAt(6, 'x');//替换指定下标上的字符sb.replace(3, 6, "aabbcc");//替换开始下标处(包含)到结束下标处(排他)的字符串sb.deleteCharAt(3);//删除指定下标上的字符sb.delete(3, 17);//删除开始下标处(包含)到结束下标处(排他)的字符串sb.reverse();//反转字符串		System.out.println(sb.toString());//321321}
    }
  2. StringBuffer的深入 – StringBuffer底层源码

    见StringBuffer底层源码分析

3.StringBuilder的使用

理解

  1. StringBuilder代表可变的字符序列。
  2. StringBuilder称为字符串缓冲区

工作原理:

  1. 预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。
    StringBuilder是可变对象,这个是String最大的不同

深入:现在的需求要存储10000个长度的数据,不要使用new StringBuilder()的方式,因为使用无参构造,底层会创建16长度的容器,存储10000个数据需要多次扩容,效率极低,直接使用new StringBuilder(10000)的方式,一步到位。

4.StringBuffer和StringBuilder区别
  1. StringBuffer和StringBuilder在使用层面上是一模一样的(调用方法)
  2. StringBuffer和StringBuilder都是继承的同一个父类(AbstractStringBuilder),而且底层实现都是依赖于父类
  3. 唯一不同就是StringBuffer方法上加了锁(synchronized),就意味着StringBuffer是线程安全的

应用场景:

  1. 单线程的程序:使用StringBuilder,因为不上锁
  2. 多线程的程序:使用StringBuffer,上锁是因为不让其他线程抢到资源

注意:StringBuilder的效率比StringBuffer高,因为没有上锁和解锁的过程

5.频繁的拼接字符串使用StringBuilder或StringBuffer

当频繁使用拼接字符串时:

String的底层实现:
str = str + “11223”;
str = new StringBuidler(String.valueOf(str)).append(“11223”).toString();

这样会导致内存占用过高。

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

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

相关文章

谷歌AlphaFold 3首发Nature,预测精准度提高100%,AI能帮助治疗癌症和免疫病 | 最新快讯

刚刚&#xff0c;顶级科学期刊英国《Nature》&#xff08;自然&#xff09;杂志发表了一份重磅、突破性研究论文。 北京时间 5 月 8 日 23 点&#xff0c;谷歌 DeepMind 和其英国子公司 Isomorphic Labs 联合团队在《自然》杂志上发表一份共 46 页的重要成果&#xff0c;联合发…

计算图与自动微分

计算图与自动微分 一、自动梯度计算1.1 数值微分&#xff08;Numerical Differentiation&#xff09;1.2 符号微分&#xff08;Symbolic Differentiation&#xff09;1.3 自动微分&#xff08;Automatic Differentiation&#xff0c;AD&#xff09;1.3.1 计算图1.3.2 正向传播1…

Java Stream

1. Stream API概述 Java 8 Stream是Java 8中引入的一个新的API&#xff0c;用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作&#xff0c;例如过滤、映射、排序等&#xff0c;而不需要编写循环或迭代器等底层代码。 Java 8 Stream与集合不同&#xff0c;…

动态表名 的使用方法

动态表名插件的底层是 拦截器 1&#xff0c;创建一个拦截器 Configuration public class MybatisConfiguration {Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {// 准备一个Map&#xff0c;用于存储TableNameHandlerMap<String, Table…

MySQL索引(聚簇索引、非聚簇索引)

了解MySQL索引详细&#xff0c;本文只做整理归纳&#xff1a;https://blog.csdn.net/wangfeijiu/article/details/113409719 概念 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 索引分类 主键索引&#xff1a…

Conda安装rasterio报错

Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后&#xff0c;本来可以正常运行的&#xff0c;但是之后又重新安装了一个gdal&#xff0c;导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民航网上订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到了我们生活的方方面面&#xff0c;从智能家居、智能医疗到自动驾驶、智能客服&#xff0c;AI无处不在。然而&#xff0c;当我们赞叹于AI的神奇时&#xff0c;却往往忽视了其背后的推动力——数学…

Go PDF文件操作

目录 介绍 安装 gofpdf API 代码示例 结果展示 介绍 gofpdf 是一个在 Go 语言中用于生成 PDF 文档的库。 安装 gofpdf 首先&#xff0c;你需要安装 gofpdf 库。你可以使用 go get 命令来安装它&#xff1a; go get github.com/jung-kurt/gofpdf API 功能 函数名参数解释示…

车载测试系列:自动驾驶中间件SOME/IP

一、以太网引入汽车 2004年&#xff0c;宝马汽车的OBD诊断口采用的是高速CAN总线&#xff0c;速率为500kbit/s&#xff0c;除去CAN协议本身的开销&#xff0c;通过OBD口升级控制器的净升级速度降到200kbit/s。预计到2008年&#xff0c;软件更新的数据量会达到1GB&#xff0c;按…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件

参考下列两个教程结合使用即可&#xff1a; 快捷自由定时重启、注销、关机 如何从多个文件夹内转移全部文件&#xff08;忽略文件夹的结构&#xff09;&#xff08;进行复制&#xff09;&#xff08;再打包&#xff09; 就是先设定好 勾选对 来源路径’Zip打包&#xff0c;并…

QT作业5

1、聊天室 服务器端 //头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QListWidget> #include <QMessageBox> #include <QDebug> #includ…

渗透之sql注入----二次注入

目录 二次注入的原理&#xff1a; 实战&#xff1a; 第一步&#xff1a;找注入点 找漏洞&#xff1a; 注入大概过程&#xff1a; 第二步&#xff1a;开始注入 二次注入的原理&#xff1a; 二次注入是由于对用户输入的数据过滤不严谨&#xff0c;导致存在异常的数据被出入…

通俗的理解网关的概念的用途(三):你的数据包是如何到达下一层的

其实&#xff0c;这一章我写不好&#xff0c;因为这其中会涉及到一些计算和一些广播等概念&#xff0c;本人不善于此项。在此略述&#xff0c;可以参考。 每台设备的不同连接在获得有效的IP地址后&#xff0c;会根据IP地址的规则和掩码的规则&#xff0c;在操作系统和交换机&a…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的微乐校园管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…