Java学习笔记(23)-Object类

Object类

所有类的父类,我们定义的类都是直接或者间接的继承自Object。

若我们定义的类不使用extends去显示的继承它,在编译的过程中也会自动被加入。强制继承自Object。

超类:就是父类superclass。Object是所有类的父类。


package day01;

public class MyObject {
	public static void main(String[] args) {
		MyObject obj = new MyObject();
		/*
		 * 为什么我有toString()方法?
		 * 因为所有的类都继承自Object,而toString()方法是Object定义的。我们直接继承了这个方法。
		 * Object的toString()方法帮我们返回一个字符串。
		 * 这个字符串的格式是固定的:类名@hashcode
		 * 这个hashcode是一串数字。在java中叫句柄.或叫地址
		 * 
		 * toString定义的原意是返回能够描述当前这个类的实例的一串文字
		 */
		String info = obj.toString();
		System.out.println(info);
		System.out.println(obj);//方法实际上是输出给定对象的toString()方法的返回值。
	}
	public String toString(){//重写方法父类用public子类也得用public不能比父类得范围小
		return "这个是我自己定义的toString()方法返回值。";
	}
}


package day01;

public class Point {
	private int x;
	private int y;
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	public String toString(){
		/*
		 * 重写toString方法,返回的字符串用于描述当前对象
		 * 这个对象保存的 是一个点的信息,所有告知外接x,y的坐标
		 */
		return "x="+x+",y="+y;
	}
	public static void main(String[] args) {
		/*
		 * main方法是静态方法
		 * 不能直接使用toString()方法,因为该方法不是静态的
		 * java语法规定:
		 * 静态方法中不能直接引用非静态的属性和方法!
		 * 非静态方法中可以直接引用静态属性和方法
		 */
//		System.out.println(toString);//不行!编译错误!
		Point p = new Point(6,6);
		System.out.println(p);//输出p对象的toString方法返回值
	}
}

equals方法:

public boolean equals(Object obj)

该方法的原意:是比较对象与给定对象的内容是否一致

在Object中的实现:

public boolean equals(Object obj){return (this==obj);}

equals和“==”的区别?

==比较是否为同一个对象

equals比较两个对象内容是否一样

字符串的equals方法

两个字符串进行比较的时候,我们通常使用equals方法进行比较,虽然java虚拟机对字符串做了优化,但是我们不能保证任何时候==都成立!

编程习惯:

当一个字符串变量和一个字面量进行比较的时候我们应该使用字面量的.equals方法和变量进行比较,因为这样不会引发空指针。

字符串的另一个equals方法:equalsIgnoreCase,该方法的作用是忽略大小写比较字符串内容。

常用的环境:

    上网注册时,输入的验证码。


package day01;

public class Point {
	private int x;
	private int y;
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	public String toString(){
		/*
		 * 重写toString方法,返回的字符串用于描述当前对象
		 * 这个对象保存的 是一个点的信息,所有告知外接x,y的坐标
		 */
		return "x="+x+",y="+y;
	}
	/*
	 * 重写Object继承过来的该方法,用于定义对象内容比较规则
	 */
	public boolean equals(Object obj){
		/*
		 * 若给定的对象obj的地址和当前对象地址一致,那么他们是
		 * 同一个对象,equals肯定要返回true!自己一定像自己!
		 * 当我们在equals方法中有大量的内容比较逻辑时,加上这个判断
		 * 会节省性能的开销!
		 * 
		 */
		/*
		 * equals比较前要进行安全验证,确保给定的对象不是null!
		 * obj若是null,说明该引用变量没有指向任何对象。那么就不能
		 * 引用obj所指向的对象(因为对象不存在)的属性或方法!
		 * 若这么做就会引发NullPointerException,空指针异常!
		 */
		if(obj==null){
			return false;
		}
		/*
		 * 直接将Object转为子类是存在风险的!
		 * 我们不能保证Object和我们要比较的对象是同一个类型的
		 * 这会引发ClassCastException!我们称为类造型异常
		 */
		//重写equals时第一件要做的事情就是判断给定的对象是否和当前
		//对象为同一个类型。不是同类型直接返回false,不具备可比性。
		if(!(obj instanceof Point)){//不是这个类型的实例
			return false;
		}
		Point p = (Point)obj;
		/*
		 * 内容比较逻辑定义。
		 */
		return this.x==p.x && this.y == p.y;
	}
	public static void main(String[] args) {
		/*
		 * main方法是静态方法
		 * 不能直接使用toString()方法,因为该方法不是静态的
		 * java语法规定:
		 * 静态方法中不能直接引用非静态的属性和方法!
		 * 非静态方法中可以直接引用静态属性和方法
		 */
//		System.out.println(toString);//不行!编译错误!
		Point p = new Point(6,6);
		System.out.println(p);//输出p对象的toString方法返回值
	}
}
package day01;


public class TestEquals {
	public static void main(String[] args) {
		Point p1 = new Point(1,2);
		Point p2 = new Point(1,2);
		/*
		 * ==比较的双方的值是否相等
		 * p1和p2是两个引用类型变量,而引用类型变量保存的是对象的句柄(对象的地址那个hashcode值).
		 * ==在对象比较时描述的是p1和p2是否为同一个对象!
				 * equals方法力图去描述两个对象内容是否相等。
		 * 内容相等取决于业务逻辑需要,可以自行定义比较规则。
		 */
		if(p1==p2){
			System.out.println("两个点相等");
		}else{
			System.out.println("两个点不相等");
			System.out.println("点1:"+p1);
			System.out.println("点2:"+p2);
		}
	}
}

String字符串类型

String是引用类型!!

String在设计之初,虚拟机就对它做了特殊的优化,将字符串保存在虚拟机内部的字符串常量池中。一旦我们要创建一个字符串,虚拟机会先去常量池中检查是否创建过这个字符串,若有则直接引用。

String对象因为有了上述的优化,就要保证该对象的内容自创建开始就不能改变!所有对字符串的任何变化都会创建新的对象!






package day01;


public class TestString {
	public static void main(String[] args) {
		/*
		 * 字符串对象是不可变的!
		 */
		String s1 = "Hello";
//		s1 += "World";
		String s2 = "Hello";
		String s3 = "Hello";
		String s4 = new String("Hello");
		System.out.println(s1==s4);//false
		/*
		 * 在比较字符串的时候我们通常的做法是使用equals方法
		 * 字符串重写了Object的equals方法。用于比较字符串内容是否一致
		 * 原因在于,我们不能保证变量不是null,若变量是null,我们在调用其equals方法时
		 * 会引发空指针异常,导致程序退出。
		 */
		System.out.println(s1.equals(s2));//true
		/*
		 * 当我们将一个字符串变量与一个字面量进行等值比较时我们不要
		 * 调用变量的.equals方法。而是应该调用字面量的.equals方法。
		 */
		if(s1.equals("Hello")){//这里可能引发空指针异常
			System.out.println("这个字符串时Hello!");
		}
		if("Hello".equals(s1)){//不会引发空指针异常,变为习惯!
			System.out.println("这个字符串是Hello");
		}else{
			System.out.println("这个字符串不相等");
		}
		System.out.println(s1);
		
		/*
		 * String自己实现的一个比较方法
		 * 该方法可以忽略字符串大小写问题
		 */
		String s5 = "Hello";
		if("hello".equalsIgnoreCase(s5)){
			System.out.println("字符串内容是hello!");
		}else{
			System.out.println("两个字符串不相同!");
		}
		/*
		 * 测试字符串的一些功能方法
		 */
		String s6 = "  abc  ";
		String trimS6 = s6.trim();//去掉s6字符串两边的空白
		String s7 = "HelloWorld";
		
		//将s7的英文字符转化为小写
		String lowerS7 = s7.toLowerCase();
		
		//将s7的英文部分转化为大写
		String upperS7 = s7.toUpperCase();
		
		System.out.println("["+s6+"]");//[  abc    ]
		System.out.println("["+trimS6+"]");//[abc]
		System.out.println(lowerS7);
		System.out.println(upperS7);
		
		//判断s7这个字符串是否以给定的"Hello"开始
		if(s7.startsWith("Hello")){
			System.out.println(s7+"是以Hello开始的");
		}
		
		//判断s7这个字符串是否以给定的"World"结尾
		if(s7.endsWith("World")){
			System.out.println(s7+"是以World结尾的");
		}
		
		/*
		 * 思考:
		 * 如歌让HelloWorld这个字符串以hello开头成立
		 * 思路:
		 * 将HelloWorld转成纯小写的helloworld在和hello比较就可以了
		 * 步骤:
		 * 1:调用字符串HelloWorld的toLowerCase方法,将字符串转化
		 * 2:再调用转化好的字符串的startsWith方法和hello进行比较即可
		 */
		
		if(s7.toLowerCase().startsWith("hello")){
			System.out.println(s7+"是以hello开始的");
		}
		
		//length()方法返回当前字符串的字符数
		System.out.println(s7+"有"+s7.length()+"个字符");
	}
}


package day01;

public class TestString {
	public static void main(String[] args) {
		/*
		 * 字符串对象是不可变的!
		 */
		String s1 = "Hello";
//		s1 += "World";
		String s2 = "Hello";
		String s3 = "Hello";
		String s4 = new String("Hello");
		System.out.println(s1==s4);//false
		/*
		 * 在比较字符串的时候我们通常的做法是使用equals方法
		 * 字符串重写了Object的equals方法。用于比较字符串内容是否一致
		 * 原因在于,我们不能保证变量不是null,若变量是null,我们在调用其equals方法时
		 * 会引发空指针异常,导致程序退出。
		 */
		System.out.println(s1.equals(s2));//true
		/*
		 * 当我们将一个字符串变量与一个字面量进行等值比较时我们不要
		 * 调用变量的.equals方法。而是应该调用字面量的.equals方法。
		 */
		if(s1.equals("Hello")){//这里可能引发空指针异常
			System.out.println("这个字符串时Hello!");
		}
		if("Hello".equals(s1)){//不会引发空指针异常,变为习惯!
			System.out.println("这个字符串是Hello");
		}else{
			System.out.println("这个字符串不相等");
		}
		System.out.println(s1);
		
		/*
		 * String自己实现的一个比较方法
		 * 该方法可以忽略字符串大小写问题
		 */
		String s5 = "Hello";
		if("hello".equalsIgnoreCase(s5)){
			System.out.println("字符串内容是hello!");
		}else{
			System.out.println("两个字符串不相同!");
		}
		/*
		 * 测试字符串的一些功能方法
		 */
		String s6 = "  abc  ";
		String trimS6 = s6.trim();//去掉s6字符串两边的空白
		String s7 = "HelloWorld";
		
		//将s7的英文字符转化为小写
		String lowerS7 = s7.toLowerCase();
		
		//将s7的英文部分转化为大写
		String upperS7 = s7.toUpperCase();
		
		System.out.println("["+s6+"]");//[  abc    ]
		System.out.println("["+trimS6+"]");//[abc]
		System.out.println(lowerS7);
		System.out.println(upperS7);
		
		//判断s7这个字符串是否以给定的"Hello"开始
		if(s7.startsWith("Hello")){
			System.out.println(s7+"是以Hello开始的");
		}
		
		//判断s7这个字符串是否以给定的"World"结尾
		if(s7.endsWith("World")){
			System.out.println(s7+"是以World结尾的");
		}
		
		/*
		 * 思考:
		 * 如歌让HelloWorld这个字符串以hello开头成立
		 * 思路:
		 * 将HelloWorld转成纯小写的helloworld在和hello比较就可以了
		 * 步骤:
		 * 1:调用字符串HelloWorld的toLowerCase方法,将字符串转化
		 * 2:再调用转化好的字符串的startsWith方法和hello进行比较即可
		 */
		
		if(s7.toLowerCase().startsWith("hello")){
			System.out.println(s7+"是以hello开始的");
		}
		
		//length()方法返回当前字符串的字符数
		System.out.println(s7+"有"+s7.length()+"个字符");
	}
}
package day01;

/*
 * 测试字符串的方法
 */
public class TestString2 {
	public static void main(String[] args) {

		String str = "Think in Java";// java编程思想
		/*
		 * 查看"Java"在str字符串的位置 注意,若str中不包含"java"那么返回的整数位为"-1"
		 */
		int index = str.indexOf("Java");
		System.out.println("Java出现的位置:"+index);//9
		/*
		 * indexOf会查找第一次出现时的位置
		 */
		index = str.indexOf("i");
		System.out.println("i出现的位置:"+index);//2
		
		/*
		 * indexOf的重载方法indexOf(String str,int from)
		 * 该方法会返回从from位置开始后第一次出现str的位置
		 */
		index = str.indexOf("i",4);//6
		System.out.println("i出现的位置:"+index);
		
		/*
		 * 查找in字符后第一次出现i的位置
		 * 通常这样的需求会使用indexOf的这个i重载方法
		 * Think in Java
		 * 步骤:
		 * 1:先找到第一次出现in的位置
		 * 2:再根据这个位置开始查找后续的i
		 */
		index = str.indexOf("in");
		//这里对from参数加in的长度的目的是从in之后的位置开始查找
		index = str.indexOf("i",index+"in".length());
		System.out.println("in之后i出现的位置:"+index);
		
		/*
		 * 和indexOf类似,lastIndexOf是查找最后一次出现的位置
		 */
		index = str.lastIndexOf("in");
		System.out.println("in最后出现的位置:"+index);
		/*
		 * lastIndexOf的重载方法lastIndexOf(String str,int from)
		 * 从from处开始查找最后一次出现给定字符的位置
		 * 这个from有截取的效果,会进行反向查找
		 * 
		 */
		index = str.lastIndexOf("in",5);
		System.out.println("从第8个字符开始查找最后一次出现的in的位置:"+index);
		/*
		 * 获取指定位置的单个字符
		 */
		char ch = str.charAt(6);
		System.out.println(ch);//i
		/*
		 * 使用charAt判断字符串是否为回文
		 */			   //012345678
		String str2 = "上海自来水来自海上";
		/*
		 * 回文:从左往右念和从右往左念是一样的
		 * 思路:
		 * 字符串中第一个位置的字符和最后一个字符一致,
		 * 第二个字符和倒数第二个字符一直以此类推
		 * 若都完全一致就是回文
		 * 步骤:
		 * 1:进行循环比较,循环次数是由字符串长度除以2决定的
		 * 2:比较整数位置的字符和对应的倒数位置的字符是否相等
		 */
		boolean tf = true;//定义一个变量,表示是否为回文,默认是
		for(int i=0;i<str2.length()/2;i++){
			char first = str2.charAt(index);
			char last = str2.charAt(str2.length()-1-i);
			if(first != last){
				tf = false;//若正数位置和倒数位置字符不同,就不是回文
				break;//已经不是回文了,就没有必要再继续检查了
			}
		}
		if(tf){
			System.out.println("是回文");
		}else{
			System.out.println("不是回文");
		}
	}
}
package day01;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/*
 * String的方法测试
 * subString(int start,int end)
 * 作用:
 * 截取字符串
 * 从start位置开始截取,截取到end位置
 * 温馨提示:
 * Java中很多方法描述范围时都是"包前不包后的"
 */
public class String的方法测试 {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "HelloWorld";
		String sub = str.substring(0, str.length());
		System.out.println(sub);
		
		/*
		 * subString的重载方法subString(int start)
		 * 从start位置开始截取到字符串末尾
		 */
		String sub2 = str.substring(5);//这个等同上面的截取
		System.out.println(sub2);//world
		
		/*
		 * 将字符串转换为相应的字节
		 * getBytes()
		 * 将字符串转换为字节数组并返回
		 */
		String info = "我爱java";
		/*
		 * 以当前系统默认的字符串编码集转换为字节
		 * window的默认编码集:GBK
		 * GBK:英文用1个字节描述,汉字用两个字节描述
		 * iso8859-1 欧洲常用的编码集
		 * gbk 国标
		 * gb2312 国标
		 * utf-8 最常用的。
		 */
		byte[]	array = info.getBytes();
		System.out.println(Arrays.toString(array));
		/*
		 * getBytes()的重载方法,用于将字符串以指定的编码集转换字节数组
		 * getBytes(String charsetName)
		 * 这个重载方法需要捕获异常,这里可能引发没有这个编码集的异常
		 *UnsupportedEncodingException ctrl+1相当于点红叉
		 *有事没事ctrl+s
		 */
		byte[] utf = info.getBytes("UTF-8");
		System.out.println(Arrays.toString(utf));
		
		/*
		 * 编码:将数据以特定格式转换为字节
		 * 解码:将字节以特定格式转换为数据
		 */
		String infoUTF = new String(utf,"UTF-8");
		System.out.println(infoUTF);
		
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值