JAVA基础知识(五)

2023-11-08

5.4 构造方法

构造方法的主要作用就是为类中的属性初始化。

类名称 对象名称 = new 类名称()
从格式中发现,在最后有一个类名称()的代码,在程序中只要是一看见有“()”就表示调用方法,那么这个方法实际上就是要表示调用构造方法,构造方法可视为一种特殊的方法,他的定义方式与普通方法类似,其语法如下:

构造方法定义格式

class 类名称{
	访问权限 类名称(类型1 参数1,类型2 参数2,···){
	    程序语句;
	    ··· //构造方法没有返回值
	}
}

在构造方法的声明中一定要牢记以下几点:
(1)构造方法的名称必须与类名称一致;
(2)构造方法的声明处不能有任何返回值类型的声明;
(3)不能再构造方法中使用return返回一个值。

在Java中如果一个类中没有明确的声明一个构造方法则在编译的时候会直接生成一个无参数的、什么都不做的构造方法。

关于自动生成构造方法的说明。
在一个类中如果已经明确地声明了一个构造方法,那么程序在编译时将不会再生成默认的构造方法,即:一个类中至少会存在有一个构造方法。

与普通方法一样,构造方法也是可以重载的,由于构造方法名称本身要求与类名称保持一致,所以只要每个构造方法的参数类型或参数个数不同,就可以实现重载了。

注意编写顺序。
在一个类中对构造方法重载时,所有的重载方法按照参数的个数由多到少,或者由少到多排列,即:以下的两种排列方式都是规范的:

public Person(){}
public Person(String name){}
public Person(String name,int age){}

public Person(String name,int age){}
public Person(String name){}
public Person(){}

以上的两种写法都是按照参数的个数进行排列的。虽然不按照以上方式排列,不是语法错误,但是考虑到程序阅读的方便,请严格遵守以上规定。

5.5 匿名对象

**“匿名对象”,就是没有明确给出名字的对象。**一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。

使用了“new Person(“张三”,30)”语句,这实际上就是一个匿名对象,与之前声明的对象不同,此处由于没有使用任何栈内存引用此块堆内存空间,所以该对象使用一次之后就等待被垃圾回收机制回收。

匿名对象的作用。
匿名对象在实际的开发中基本上都是作为其他类的实例化对象的参数传递的,在后面的Java应用部分的很多地方都是可以发现其用法的。而且匿名对象实际上就是一个堆内存空间,对象不管是匿名的还是非匿名的,都必须在开辟堆内存空间之后才可以使用。

5.6 String类

5.6.1 实例化String类对象

对于String可以采用直接赋值的方式进行操作,如下面的代码。

直接为String赋值

public class StringDemo01{
     public static void main(String args[]){
         String name = "LiXingHua";  //实例化String对象
	 System.out.println("姓名:"+name);//输出字符串的内容
     }
}

在String类的使用上还有另外一种形式的实例化方法,就是直接调用String类中的构造方法,String类存在以下的构造方法:
public String(String original)

使用第二种String的实例化方式

public class StringDemo02{
     public static void main(String args[]){
         String name = new String("LiXingHua");  //实例化String对象
	 System.out.println("姓名:"+name);//输出字符串的内容
     }
}
5.6.2 String对象的内容比较

使用“==”进行内容比较
对于基本数据类型(如int型变量)可以通过“==”进行内容的比较,代码如下。

public class StringDemo03{
	public static void main(String args[]){
		int x=30;
		int y=30;  //声明一个整形变量
		System.out.println("两个数字的比较结果:"+(x==y));
    }
}

两个数字的比较结果:true

使用“ == ”比较字符串的内容

public class StringDemo04 {
	public static void main(String[] args) {
		String str1 = "hello";				//直接赋值
		String str2 = new String("hello");  //通过new赋值
		String str3 = str2;					//传递引用
		System.out.println("str1==str2-->"+(str1==str2)); //false
		System.out.println("str1==str3-->"+(str1==str3)); //false
		System.out.println("str2==str3-->"+(str2==str3)); //true
	}
}

str1 == str2–>false
str1 == str3–>false
str2 == str3–>true
从这里可以看出,每个String对象的内容实际上都是保存在堆内存之中的,而且堆中的内容是相等的。但对于str1和str2来说,其内容分别保存在了不同的空间,所以即便内容相等,但是地址的值也是不相等的,“==”是用来进行数值的比较,所以str1和str2比较不相等。那么str2和str3呢?从程序中可以发现str2和str3指向了同一个空间,是同一个地址,所以最终结果str2和str3的地址值是相等的,同理,str1和str3的地址值也不相等,所以返回了false。从上面的结果中可以清楚的发现“==”是用来进行地址值比较的。

如何判断两个字符串的内容是否相等呢?此时就可以利用String中专门提供的方法(String是一个类,则会存在各种方法):
public boolean equals(String str)。

equals()方法是会区分字符串大小写字母的,也就是说“H”与“h”比较的结果为false。

在实际的开发之中,由于字符串的地址是不好确定的,所以不要使用“==”比较,所有的比较都要通过equals()方法完成。

常见面试题分析:请解释String类中“ == ”和“equals()”方法比较的区别。
(1)“==”是Java提供的关系运算符,主要的功能是进行数值相等判断的,如果用在了String对象上表示的是内存地址数值的比较。
(2)equals()方法是由String提供的一个方法,此方法专门负责进行字符串内容的比较。

5.6.3 String类两种对象实例化方式的区别

String有两种实例化方式,一种是通过直接赋值的方式,另一种是使用标准的new调用构造方法完成实例化,那么两种方式有什么区别?该使用哪种更好呢?
如果要想对以上问题进行解释,首先必须明白一个重要的概念,一个字符串就是一个String类的匿名对象,匿名对象就是已经开辟了堆内存空间的并可以直接使用的对象。

public class StringDemo06{
	public static void main(String[] args) {
	     System.out.println("\"hello\"equals\"hello\"-->"+("hello".equals("hello")));
	}
}

程序执行结果:
“hello"equals"hello”–>true
从程序的运行结果可以发现,一个字符串确实可以调用String类中的额方法,也就证明了一个字符串就是一个String类的匿名对象。

避免NullPointerException的比较操作。
在实际的工作开发中会出现这样一种情况:假设现在用户需要输入某一个字符串,而后判断该输入的内容是否为指定内容,如果用户输入信息还可以判断,而当用户不输入信息时如果处理不当就会出现NullPointerException,如下代码所示。
实例一:观察问题

public class StringDemo{
	public static void main(String[] args) {
	    String input =null; //假设这个内容由用户输入
	    if(input.equals("hello")){ //如果输入内容是hello,认为满足一个条件 
	    System.out.println("Hello World!!!");
	     }
	}
}

程序执行结果:
Exception in thread "main"java.lang.NullPointerException at StringDemo.main(StringDemo.java:4)
此时由于没有输入数据所以input的内容为null,而null对象调用方法的结果将直接导致“NullPointerException”,而这样的问题可以通过一些代码的变更来帮助用户回避。

实例二:回避NullPointerException问题

public class StringDemo{
	public static void main(String[] args) {
	    String input =null; //假设这个内容由用户输入
	    if("hello".equals(input)){ //如果输入内容是hello,认为满足一个条件 
	    System.out.println("Hello World!!!");
	     }
	}
}

此时程序直接利用了字符串常量来调用了equals()方法,因为字符串常量是一个String类的匿名对象,所以该对象永远不可能是null,所以将不会出现NullPointerException,特别需要提醒读者的是,equals()方法内部实际上也存在有null的检查。

对于String str1 =“hello”;
实际上就是把一个在对内存中开辟好的堆内存空间的使用权给了str1这个对象。
栈内存 堆内存
str1 ——> “hello”
直接赋值实例化String类对象
使用这种方式还有另外一个好处,那就是,如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明的时候,不会再重新开辟空间。

public class StringDemo04 {
	public static void main(String[] args) {
		String str1 = "hello"; //声明三个字符串变量,每个变量的内容都是一样的				
		String str2 = "hello";//声明三个字符串变量,每个变量的内容都是一样的		
		String str3 = "hello";//声明三个字符串变量,每个变量的内容都是一样的				
		System.out.println("str1==str2-->"+(str1==str2)); //true
		System.out.println("str1==str3-->"+(str1==str3)); //true
		System.out.println("str2==str3-->"+(str2==str3)); //true
	}
}

结果为
str1 == str2–>true
str1 == str3–>true
str2 == str3–>true

从程序运行结果可以发现,所有的字符串都使用了“==”进行了比较,所得到的结果都是true,那么也就是说这3个字符串指向的堆内存地址空间都是同一个,所以,String使用直接赋值的方式之后,只要是以后声明的字符串内容相同,则不会单独开辟新的内存空间。

技术穿越:String类所采用的设计模式为共享设计模式。
在JVM的底层实际上会存在有一个对象池(不一定只保存String对象),当代码中使用了直接赋值的方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保存,而后如果后续还有其他String类对象也采用了直接赋值的方式,并且设置了同样内容的时候,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。

//使用new String()的方式实例化String对象

public class StringDemo08 {
	public static void main(String[] args) {
		String str = new String("hello");//通过关键字new实例化
	}
}

一个字符串就是String类的匿名对象,如果使用new关键字的话,不管如何都会再开辟一个新的空间,但是此时,空间的内容还是“hello",所以上面的代码实际上是开辟了两个内存空间,但真正使用的只是一个使用关键字new开辟的内存空间,另一个是垃圾空间。

对于字符串的操作最好采用直接赋值的方式完成,而不要采用构造方法传递字符串的方式完成。

常见面试题分析:请解释String类的两种对象实例化方式的区别。
(1)直接赋值(String str = “字符串”;):只会开辟一块堆内存空间,并且会自动保存在对象池之中以供下次重复使用;
(2)构造方法(String str = new String(“字符串”)):会开辟两块堆内存空间,其中一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()方法手工入池。
在日后的所有开发中,String对象的实例化永远都采用直接赋值的方式完成。

5.6.4 字符串的内容不可改变

在使用String类进行操作的时候,字符串的内容一旦声明则不可改变。
一个String对象内容的改变实际上是通过内存地址的“断开-连接”变化完成的,而字符串中的内容并没有任何变化。

5.6.5 String类中常用方法

要学会参考文档。对于每一个文档的内容而言,它都包含以下几个主要组成部分。
(1)第一部分:类的定义及相关的继承结构。
(2)第二部分:类的一些简短的说明。
(3)第三部分:类的组成结构。
1.类之中的成员(Field Summary)。
2.类中的构造方法(Constructor Summary)。
3.类中的普通方法(Method Summary)。
(4)第四部分:对每一个成员、构造方法、普通方法的作用进行详细说明,包括参数的作用。

1.字符串与字符数组的转换
字符串可以使用toCharArray()方法变成一个字符数组,也可以使String类的构造方法把一个字符数组,变为一个字符串。

2.从字符串中取出指定位置的字符
可以直接使用String类中的charAt()方法取出字符串指定位置的字符。

3.字符串与byte数组的转换
字符串可以通过getByte()方法将String变为一个byte数组,之后可以通过String的构造方法将一个字节数组重新变为字符串。

4.取得一个字符串的长度
在String中使用length()方法取得字符串的长度。

length与length()。
“在数组操作中,使用length取得数组的长度,但是操作的最后没有‘()’。而字符串调用length()是一个方法,只要是方法后面都有‘()’”。

5.查找一个指定的字符串是否存在
在String中使用indexOf()方法,可以返回指定的字符串的位置,如果不存在则返回-1。

String类对于判断字符串是否存在的方法提供有contains()(public boolean contains(String str)),此方法直接返回boolean型数据。

6.去掉左右空格
在实际开发中,用户输入的数据中可能含有大量的空格,此时。使用trim()方法可以去掉字符串的左、右空格。

7.字符串截取
在String中提供两个substring()方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。

8.按照指定的字符串拆分字符串
在String中通过split()方法可以进行字符串的拆分操作,拆分的数据将以字符串数组的形式返回。

9.字符串的大小写转换
在用户输入信息时,有时需要统一输入数据的大小写,那么此时就可以使用toUpperCase()和toLowerCase()两个方法完成大小写的转换操作。

10.判断是否以指定的字符串开头或结尾
在String中使用startWith()方法可以判断字符串是否以指定的内容开头,使用endWith()方法可以判断字符串是否以指定的内容结尾。

11.不区分大小写进行字符串比较
在String中可以通过equals()方法进行字符串内容的比较,但是这种比较方法是区分的小写的比较,如果要完成不区分大小写的比较则可以使用equalsIgnoreCase()方法。

12.将一个指定的字符串,替换成其他的字符串
使用String的replaceAll()方法,可以将字符串的指定内容进行替换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA基础知识(五) 的相关文章

  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 将 spring-security 与 spring-webflux 结合使用时禁用 WebSession 创建

    我正在使用 Rest api 运行无状态 spring boot 应用程序 并希望按照所述禁用 WebSessions 的创建https www baeldung com spring security session https www
  • 在 IntelliJ 上进行 Google App Engine Java 开发?

    令人烦恼的是 Google App Engine 已成为其中的另一个项目 他们只发布 Eclipse 插件 如 Spring Webflow 而我更喜欢 IntelliJ 你能用IntelliJ成功运行本地测试环境吗 并调试 部署本地或实时
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 如何识别 Java 中的不可变对象

    在我的代码中 我正在创建一个对象集合 这些对象将由各种线程以只有在对象不可变的情况下才安全的方式访问 当尝试将新对象插入到我的集合中时 我想测试它是否是不可变的 如果不是 我将抛出异常 我能做的一件事是检查一些众所周知的不可变类型 priv
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 我们可以使用 for-each 循环来迭代 Iterator 类型的对象吗? [复制]

    这个问题在这里已经有答案了 如果我们执行以下操作 我们会收到错误 class FGH public static Iterator reverse List list Collections reverse list return list
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co

随机推荐

  • STM32-(16):Systick 系统时钟

    上一篇 STM32 15 如何用ID号保护自己的劳动成果 下一篇 STM32 17 SPI与数码管 数码管 Systick的两大作用 1 可以产生精确延时 原先的Delay只是盲等 2 可以提供给操作系统一个单独的心跳 时钟 节拍 通常实现
  • 2021你有想尝试过副业吗?不如来学习3D游戏建模

    从2020 2021 我们会害怕 害怕经历这次疫情 自己会失业 但是同时也想保住一份工作 不知如果去做 那到底要不要先去找一条后路去做呢 起码还能给自己一条 活路 可是往往试着用哪一条活路 反而更多的是一事无成 我主业是一个3D模型模型师
  • 继承。。。

    继承 上节回顾 static 静态的 作用 可以用来修饰成员变量 gt 静态变量 类变量 静态变量它是随着类的加载而加载 它被这个类的所有对象共享 普通成员变量 实例变量 它是随着对象的创建而产生 在不同的对象之间 是相互独立的 可以用来修
  • java中的IO整理

    写在前面 本文章基本覆盖了java IO的全部内容 文章以例子为主 因为讲解内容的java书很多了 我觉的学以致用才是真 代码是写出来的 不是看出来的 最后欢迎大家提出意见和建议 案例1 创建一个新文件 1 2 3 4 5 6
  • linux安装nginx+php

    在centos服务器下 mkdir docker cd docker mkdir nginx mkdir php mkdir www 2 拉取镜像 docker pull nginx docker pull php 7 4 fpm dock
  • CentOS 7 分区方案

    通常系统盘都会选择性能较好SSD 一般在500G左右 这里就以500G硬盘为例 以下为CentOS 自动分区方案 分区应该按照实际服务器用途而定 自动分区方案将 home 空间分配太多了 多数情况下并不适用 必须存在的分区 分区是必须存在的
  • 如何卸载、删除Anaconda?

    Anaconda这么好用 为啥要删呢 当然是我之前装得乱七八糟 导致现在心情不好 我要把它全部删掉 ok 开始 删除思路 首先利用anaconda clean清理包清理配置文件 然后直接用安装目录下的卸载程序卸载即可 一 anaconda
  • 算法分析基础

    问题 如何比较不同算法的性能 分析算法的运行时间 算法分析的原则 归纳基本操作 如 运算 赋值 比较 统一机器性能 假设基本操作代价均为1 统一机器性能后 算法运行时间依赖于问题输入规模与实例 相同输入规模 实例影响运行 最好情况 不常出现
  • spark 参数调优3-Shuffle Behavior

    spark参数调优系列 目录地址 https blog csdn net zyzzxycj article details 81011540 Shuffle Behavior spark reducer maxSizeInFlight 默认
  • JSP中使用element-ui

    首先需要下载element ui 可以直接在github下载即可 script 引入 这样就可以使用了 如 this message 已经上传过了 无需重复上传 注 vue里面直接使用 this即可 jsp里面想使用的可以试试了
  • 浏览器客户端生成唯一标识码

    created this getFinger methods getFinger const canvas document createElement canvas const ctx canvas getContext 2d const
  • 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一 实验目的 二 实验要求 三 实验的硬件 软件平台 四 实验原理 1 1 深度学习概述 1 2 深度学习的常见结构 1 3 卷积神经网络 CNN 卷积 池化 全连接网络 1 4 卷积神经网络的大致结构 1 5 参数学习
  • 动态规划—分割回文串-ii 解析+代码

    分割回文串 ii 题目链接 分割回文串 ii 思路 分割字符串s 使得子串都是回文串 最后获得最小分割次数 那么我们可以不断把字符串缩短 判断子串是否可以被分割成回文串 并且最小分割次数 这就是子问题分割了 所以我们可以使用动态规划 状态
  • python3 发送邮件 send mail 使用 163 smtp服务器

    监控本地网络速度 通过api 请求速度 发现速度异常 发送报警邮件 usr bin env python3 coding UTF 8 import smtplib time from email mime text import MIMET
  • 深入理解equals和==的区别

    今天在群里面看到这个问题 equals和 的区别是什么 我有点迟钝 不就是如果是String类型的话equals比较的是内容 非字符串类型则比较的是内容吗 我想里面的考点也没有多少吧 然后我就回复了一个 equals本来就是为了比较内容出现
  • c++ STL中sort函数的三种使用方法

    复习一下 STL C 中的标准模板库 使用起来方便并且效率较高 sort函数有三种用法 一 对基本类型数组从小到大排序 sort 数组名 n1 数组名 n2 将数组中下标从n1到n2的元素进行从小到大排序 不包括n2 通过n1 n2 可以对
  • 已经有dll文件,报错:“缺少XXXXX.dll 无法继续执行代码。重新安装程序可能会解决此问题”解决方案

    解决方案 尝试了博客的很多方法 都建议直接复制dll到工程目录 觉得特别繁琐 而且会导致项目文件夹很大 从这篇文章得到启发 链接 项目 gt 属性 gt 调试 gt 环境 输入path 不要空格 你存储dll的目录 注意 不要有空格 例如我
  • MES相关名词解释

    SOA Service Oriented Architecture SOA 面向服务的体系结构AMR Advanced Manufacturing Research 先进制造研究机构CIM Computer Integrated Manuf
  • 【react】react全家桶介绍

    1 react基础 2 react router 路由库 3 pubsub 消息管理的库 4 redux 集中式状态管理的库 5 ant design UI库 react是用于构建用户界面的javascript库 1 发送请求获取数据 2
  • JAVA基础知识(五)

    5 4 构造方法 构造方法的主要作用就是为类中的属性初始化 类名称 对象名称 new 类名称 从格式中发现 在最后有一个类名称 的代码 在程序中只要是一看见有 就表示调用方法 那么这个方法实际上就是要表示调用构造方法 构造方法可视为一种特殊