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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?