Java基础5(Object类、String类、包装类、抽象类、接口)

一. Object类

java.lang.Object 类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:

public class MyClass /*extends Object*/ {
 // ... 
 }

1.2 toString方法

public String toString() :返回该对象的字符串表示。(对象的类型+@+内存地址值。)
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

public class Person { 
	private String name; 
	private int age; 
	@Override 
	public String toString() { 
		return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; 
		}
	// 省略构造器与Getter Setter 
	}

小贴士: 在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。

1.3 equals方法

public boolean equals(Object obj) :指示其他某个对象是否与此对象“相等”。
调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认地址比较:
如果没有覆盖重写equals方法,那么Object类中默认进行 == 运算符的对象地址比较,只要不是同一个对象,结果必然为false。
对象内容比较
如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。
例如:

import java.util.Objects; 
public class Person { 
	private String name; 
	private int age; 
	@Override
	public boolean equals(Object o) { 
		// 如果对象地址一样,则认为相同 
		if (this == o) 
		return true; 
		// 如果参数为空,或者类型信息不一样,则认为不同 
		if (o == null || getClass() != o.getClass()) 
		return false; 
		// 转换为当前类型 
		Person person = (Person) o; 
		// 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果 
		return age == person.age && Objects.equals(name, person.name); 
	} 
}

1.4 Objects类

在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。
方法如下:
public static boolean equals(Object a, Object b):判断两个对象是否相等。

public static boolean equals(Object a, Object b) { 
	return (a == b) || (a != null && a.equals(b));
 }

二. String类

2.1. 特点

  1. 字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc"; 
s1 += "d"; 
System.out.println(s1); // "abcd" 
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
  1. 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
  1. “abc” 等效于 char[] data={ ‘a’ , ‘b’ , ‘c’ } 。
例如: 
String str = "abc"; 
相当于: 
char data[] = {'a', 'b', 'c'}; 
String str = new String(data); 
// String底层是靠字符数组实现的。

2.2 常用方法

1.public boolean equals (Object anObject) :将此字符串与指定对象进行比较。
2.public boolean equalsIgnoreCase (String anotherString) :将此字符串与指定对象进行比较,忽略大小写。

3.public String concat (String str) :将指定的字符串连接到该字符串的末尾。

	String s = "helloworld"; 
	String s2 = s.concat("**hello jxl"); // 将字符串连接到该字符串的末尾. 
	System.out.println(s2);// helloworld**hello jxl 

4.public char charAt (int index) :返回指定索引处的 char值。

	String s = "helloworld"; 
	System.out.println(s.charAt(0)); 
	System.out.println(s.charAt(1)); 

5.public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。

	String s = "helloworld"; 
	// 获取str在字符串对象中第一次出现的索引,没有返回‐1
	System.out.println(s.indexOf("l")); 
	System.out.println(s.indexOf("owo")); 
	System.out.println(s.indexOf("ak")); 

6.public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符 串结尾。

	String s = "helloworld";
	System.out.println(s.substring(0)); 
	System.out.println(s.substring(5)); 

7.public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到 endIndex截取字符串。含beginIndex,不含endIndex。

 	String s = "helloworld";
 	// String substring(int start,int end):从start到end截取字符串。含start,不含end。 
	System.out.println(s.substring(0, s.length()));
	System.out.println(s.substring(3,8)); 

8.public char[] toCharArray () :将此字符串转换为新的字符数组。

String s = "abcde";
char[] chs = s.toCharArray(); 
for(int x = 0; x < chs.length; x++) { 
	System.out.println(chs[x]); 
}

9.public byte[] getBytes () :使用平台的默认字符集将该 String编码转换为新的字节数组。

String s = "abcde";
byte[] bytes = s.getBytes(); 
for(int x = 0; x < bytes.length; x++) { 
	System.out.println(bytes[x]); 
}

10.public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使 用replacement字符串替换。

String str = "	jxl"; 
String replace = str.replace("j", "J"); 
System.out.println(replace); // Jxl

11.public String[] split(String regex) :将此字符串按照给定的regex(规则)拆分为字符串数组。

String s = "aa,bb,cc"; 
String[] strArray = s.split(","); // ["aa","bb","cc"] 
for(int x = 0; x < strArray.length; x++) { 
	System.out.println(strArray[x]); // aa bb cc 
}

3.3 String和StringBuffer、StringBuilder

1.可变性
String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

2.线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

3.性能
每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

三.抽象类

抽象方法 : 没有方法体的方法。
修饰符 abstract 返回值类型 方法名 (参数列表);
抽象类:包含抽象方法的类。
abstract class 类名字 { }

3.1抽象的使用

1.继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。抽象类不能创建对象
2.抽象类中,子类的构造方法中,有默认的super(),要访问父类构造方法
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类

四. 接口

接口,是Java语言中一种引用类型,是方法的集合,接口的内部主要就是封装方法
接口的使用,它不能创建对象,但是可以被实现( implements)

4.1 接口中的方法

@Override 重写

public interface 接口名称 { 
	// 抽象方法   使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
	// 默认方法  使用 default 修饰,不可省略,供子类调用或者子类重写,有方法体。
	 // 静态方法  使用 static 修饰,供接口直接调用。
	  // 私有方法
 }

4.1 接口的多实现

在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接
口的多实现。并且,一个类能继承一个父类,同时实现多个接口。

class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... { 
	// 重写接口中抽象方法【必须】 
	// 重写接口中默认方法【不重名时可选】
 }

在接口的实现类中,如果抽象方法有重名的,只需要重写一次。
在接口的实现类中,如果默认方法有重名的,必须重写一次

发布了12 篇原创文章 · 获赞 4 · 访问量 388

猜你喜欢

转载自blog.csdn.net/weixin_44079478/article/details/104697447