Object类、Scanner类、String类


一、Object类

1.API概述以及Object类的概述

A:API(Application Programming Interface)
  应用程序编程接口
B:Java API
  就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
  我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
C:Object类概述
  类层次结构的根类
  所有类都直接或者间接的继承自该类
D:构造方法
public Object()
回想面向对象中为什么说:
子类的构造方法默认访问的是父类的无参构造方法

2.public int hashCode()

a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
b:不同对象的,hashCode()一般来说不会相同。
但是,同一个对象的hashCode()值肯定相同。
c:不是对象的实际地址值,可以理解为逻辑地址值。

3.public final Class getClass()

a:返回此 Object 的运行时类。
b:可以通过Class类中的一个方法,获取对象的真实类的全名称。
public String getName()

public class Test {
    public static void main(String[] args) {
        Person p = new Person(1,"刘德华");
        System.out.println(p.getClass());  
        System.out.println(p.getClass().getName()); 
    }
}

class Person{
    int id;
    String name;
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
}

class org.westos.demo1.Person
org.westos.demo1.Person

4.public String toString()

A:案例演示
  public String toString()
  a:返回该对象的字符串表示。
  源代码:

 	public String toString() {
   					 return getClass().getName() + "@" + Integer.toHexString(hashCode());
				}

b:它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
c:由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
怎么重写, 一般是将该类的所有的成员变量组成返回即可
B: 直接输出对应的名称,就是调用对象的toString()方法

5.public boolean equals(Object obj)

a:指示其他某个对象是否与此对象“相等”。
源代码:

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

b:默认情况下比较的是对象的引用是否相同。
c:由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等
d:==号和equals方法的区别(面试题)
== 号可以比较基本数据类型,也可以比较引用数据类型
equals方法只能比较引用数据类型,默认比较的是地址值,如果我们想要建立自己的比较方式,我们就需要复写equals方法
e:Object类的equals()方法代码优化
  a: 提高效率
  b: 提高健壮性(instanceof)instanceof 判断一个对象(引用)是不是该类型的一个引用(对象)

 public boolean equals(Object obj) {// Object obj=s2
        //严谨性(考虑周全)提高方法的健壮性  性能方面的提高
        // 我们自定义的类,他认为 如果两个对象的成员变量值一摸一样,就认为这两个对象是相同的。
        //向下转型
        //instanceof 判断一个对象(引用)是不是该类型的一个引用(对象)
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }

        if (!(obj instanceof Student)) {
            return false;
        }

        Student s2 = (Student) obj;
        //"张三"=="张三"  0x001==0x002
        //如果你要比较两个字符串,字面上的内容是否相同,要调用 equals(s2.name)方法来比较。
        //String类他重写了父类Object中的equals(s2.name)方法去比较两个字符串字面上的内容是否相同
        //"张三".equals("张三")
        return this.age == s2.age && this.name.equals(s2.name);
    }

5.clone()方法

clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public
浅克隆和深克隆
​使用clone()方法采用的是浅克隆的方式
对象浅克隆要注意的细节:
  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆:就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。
对象的深克隆:采用IO流来实现 使用 ObjectOutputStream 将对象写入文件中,然后再用ObjectInputStream读取回来

浅克隆
public static void main(String[] args) throws CloneNotSupportedException {
         /* 使用clone()方法采用的是浅克隆的方式
         * 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,
         * 这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
         * */
        DogFood dogFood = new DogFood("王中王");
        Dog dog = new Dog("小白", 2, dogFood);
        dog.dogFood.foodName = "玉米肠";
        Dog dog2 = (Dog) dog.clone();
        dog2.name = "小黑";
        dog2.age = 3;
        dog2.dogFood.foodName = "金锣火腿肠";

        System.out.println(dog.name); //小白
        System.out.println(dog.age); //2
        System.out.println(dog.dogFood.foodName); //  金锣火腿肠

        System.out.println(dog2.name); //小黑
        System.out.println(dog2.age); //3
        System.out.println(dog2.dogFood.foodName); // 金锣火腿肠

    }
}

class Dog implements Cloneable {
    String name;
    int age;
    //维护了一个狗粮类的对象
    DogFood dogFood;

    public Dog() {

    }

    public Dog(String name, int age, DogFood dogFood) {
        this.name = name;
        this.age = age;
        this.dogFood = dogFood;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

//狗粮类
class DogFood {
    String foodName;

    public DogFood() {
    }

    public DogFood(String foodName) {
        this.foodName = foodName;
    }
}

在这里插入图片描述

二、Scanner类

1.Scanner的概述和构造方法原理

A:Scanner的概述: JDK5以后用于获取用户的键盘输入
B:Scanner的构造方法原理
  Scanner(InputStream source)
  System类下有一个静态的字段:
    public static final InputStream in; 标准的输入流,对应着键盘录入。

2.hasNextXxx()和nextXxx()方法

A:基本格式
  hasNextXxx() 判断下一个是否是某种类型的元素,其中Xxx可以是Int,Double等。
        如果需要判断是否包含下一个字符串,则可以省略Xxx
  nextXxx()   获取下一个输入项。Xxx的含义和上个方法中的Xxx相同

3.Scanner获取数据出现的小问题及解决方案

​ A:两个常用的方法:
​   public int nextInt():获取一个int类型的值
​   public String nextLine():获取一个String类型的值
​   public String next():获取一个String类型的值

B:案例演示
  a:先演示获取多个int值,多个String值的情况
  b:再演示先获取int值,然后获取String值出现问题
  c:问题解决方案
    第一种:先获取一个数值后,在创建一个新的键盘录入对象获取字符串。
    第二种:把所有的数据都先按照字符串获取,然后要什么,你就对应的转换为什么。

三、String类

1.String类的概述

String 表示字符串
  字符串:由一个或多字符组成的有序序列。
String 类代表字符串。
  1.Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
  2.字符串是常量;它们的值在创建之后不能更改。

2.String类的构造方法

A:常见构造方法
  public String():空构造
  public String(byte[] bytes):把字节数组转成字符串
  public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串(index:表示的是从第几个索引开始, length表示的是长度)
  public String(char[] value):把字符数组转成字符串
  public String(char[] value,int index,int count):把字符数组的一部分转成字符串
  public String(String original):把字符串常量值转成字符串

 //public String( byte[] bytes):把字节数组转成字符串
        byte[] bytes = {97, 98, 99, 100};
        String s = new String(bytes);
 //把字节数组的一部分转换成字符串,0 表示起始索引 2 表示个数
        String s2 = new String(bytes, 0, 2);
  

3.String的特点一旦被创建就不能改变

A:String的特点: 一旦被创建就不能改变, 因为字符串的值是在堆内存的常量池中划分空间 分配地址值的
B:案例演示
  a:如何理解这句话
    String s = “hello” ;
    s = “world” + “java”; 问s的结果是多少?
    结果是:worldjava
  b:画内存图解释: 内容不能变,引用可以变
在这里插入图片描述

4.String类的常见面试题

A:面试题1
  String s = new String(“abc”)和String s = “abc”;的区别
  并画内存图解释。
  new String(“abc”)创建了两个对象 ,“abc”创建了一个对象
在这里插入图片描述B:面试题2

	看程序写结果
	String s1 = new String("hello");
	String s2 = new String("hello");
	System.out.println(s1 == s2);    //false
	System.out.println(s1.equals(s2));//true

	String s3 = new String("hello");
	String s4 = "hello";
	System.out.println(s3 == s4);//false
	System.out.println(s3.equals(s4));//true

	String s5 = "hello";
	String s6 = "hello";
	System.out.println(s5 == s6);//true
	System.out.println(s5.equals(s6));//true

C:多个对象的内存图
在这里插入图片描述

5.String类的判断功能

A:String类的判断功能
  public boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
  public boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
  public boolean contains(String str): 判断字符串中是否包含传递进来的字符串
  public boolean startsWith(String str): 判断字符串是否以传递进来的字符串开头
  public boolean endsWith(String str): 判断字符串是否以传递进来的字符串结尾
  public boolean isEmpty(): 判断字符串的内容是否为空串""。

6.String类的获取功能

A:String类的获取功能
  public int length(): 获取字符串的长度。
  public char charAt(int index): 获取指定索引位置的字符
  public int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引。
  public int indexOf(String str): 返回指定字符串在此字符串中第一次出现处的索引。
  public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
  public int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
  lastIndexOf系列从后往前找
  public String substring(int start): 从指定位置开始截取字符串,默认到末尾。
  public String substring(int start,int end): 从指定位置开始到指定位置结束截取字符串。

7.String类的转换功能

A:String的转换功能:
  public byte[] getBytes(): 把字符串转换为字节数组。
  public char[] toCharArray(): 把字符串转换为字符数组。
  public static String valueOf(char[] chs): 把字符数组转成字符串。
  public static String valueOf(int i): 把int类型的数据转成字符串。
  注意:String类的valueOf方法可以把任意类型的数据转成字符串。
  public String toLowerCase(): 把字符串转成小写。
  public String toUpperCase(): 把字符串转成大写。
  public String concat(String str): 把字符串拼接。

8.String类的其他功能

A:String的替换功能及案例演示
  public String replace(char old,char new) 将指定字符进行互换
  public String replace(String old,String new) 将指定字符串进行互换
B:String的去除字符串两空格及案例演示
  public String trim() 去除两端空格
C:String的按字典顺序比较两个字符串及案例演示
  public int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果
  如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果
  如果连个字符串一摸一样 返回的就是0
  public int compareToIgnoreCase(String str) 跟上面一样 只是忽略大小写的比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值