1 instanceof操作符
1.1 语法及说明
- 语法:
x(对象) instanceof A(类名)
- 说明:
- ①要求对象所属的类和类A必须是子类和父类的关系,否则编译错误。
- ②如果x属于类A的子类B,x instanceof A值也为true。
1.2 instanceof操作符的应用示例
- 示例:
package day13;public class Person {}
package day13;public class Student extends Person {}
package day13;public class Demo { public static void main(String[] args) { Person p = new Student(); if(p instanceof Student){ System.out.println("p的实际类型是Student"); } }}
2 对象类型转换
2.1 基本数据类型的转换
- 自动类型转换:小的数据类型可以自动转换成大的数据类型。
package day13;public class Demo { public static void main(String[] args) { int i = 100; long l = i; System.out.println("l:" + l); }}
- 强制类型转换:可以把大的数据类型强制的转换成小的数据类型,但是可能会丢失精度。
package day13;public class Demo { public static void main(String[] args) { double d = 20.0; float f = (float) d; System.out.println("f:" + f); }}
2.2 对象类型转换
- 向上类型转换:从子类到父类的类型转换,其实就是多态。
package day13;public class Person {}
package day13;public class Student extends Person {}
package day13;public class Demo { public static void main(String[] args) { Person p = new Student(); System.out.println(p); }}
- 向下类型转换:从父类到子类的类型转换必须通过()来实现。
package day13;public class Person {}
package day13;public class Student extends Person {}
package day13;public class Demo { public static void main(String[] args) { Person p = new Student(); Student s = (Student) p; System.out.println(s); }}
2.3 图解基本类型转换和对象类型转换
3 Object类
3.1 Object类的简介
- Object类是所有类的根类。
- 如果在类的声明中没有使用extends关键字指明其父类,则默认父类是Object类,换言之,Object类是所有类的直接或间接父类。
3.2 Object类的主要结构
3.3 ==操作符和equals()方法
3.3.1 ==操作符
- 基本类型比较值
package day13;public class Demo { public static void main(String[] args) { int a = 10; int b = 10; double d = 10.0; System.out.println(a == b);//true System.out.println(a == d);//true }}
- 引用类型比较引用(是否指向同一个对象)
package day13;public class Person {}
package day13;public class Demo { public static void main(String[] args) { Person p = new Person(); Person p2 = new Person(); Person p3 = p; System.out.println(p == p2);//false System.out.println(p3 == p);//true }}
3.3.2 equals()方法
- 所有的类都集成了Object类,也就获取了equals()方法,当然自己本身也可以重写equals()方法。
- Object类定义的equals()方法和==操作符的作用一样。
public boolean equals(Object obj) { return (this == obj); }
- 但是,当使用equals()方法进行比较的时候,对类File、String、Date及包装类来说,是比较类型和内容而不仅仅考虑引用是否是同一个对象,因为这些类重写过equals()方法。
3.3.3 ==操作符和equals()方法的区别
- ==既可以比较基本数据类型也可以比较引用数据类型。对于基本数据类型就是比较值,对于引用数据类型就是比较内存地址。
- equals()方法,是属于Object类里面的方法,如果该方法没有被重写过默认也是==,我们可以看到String等类的equals()方法是被重写过的,而且String类在日常开发中用的也比较多,久而久之,形成了equals()方法是比较值的错误观点。
- 具体要看自定义类里面有没有重写Object类的equals()方法来判断(具体问题具体分析)。
- 通常情况下,重写equals()方法的时候,会比较类中的相应属性是否相等。
3.3.4 重写equals()方法的应用示例
- 示例:
package day13;import java.util.Objects;public class Person { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(name, person.name) && Objects.equals(age, person.age); } @Override public int hashCode() { return Objects.hash(name, age); }}
3.4 toString()方法
3.4.1 toString()方法的简介
- toString()方法在Object类中定义,其返回值是String类型,其在Object中的定义如下:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
- 可以根据需要在用户自定义类中重写toString()方法,例如:String类型就重写了toString()方法,返回字符串的值。
3.4.2 toString()方法的应用示例
- 示例:
package day13;import java.util.Objects;public class Person { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(name, person.name) && Objects.equals(age, person.age); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}
4 包装类
4.1 包装类的概念
- 针对八种基本数据类型定义相应的引用类型就是包装类。
- 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象。
4.2 包装类图解
4.3 包装类的使用
4.3.1 装箱
- 基本数据类型包装成包装类的实例。有如下的两种方式(以Integer为例):
- ①通过包装类的构造器实现。
public Integer(int value) { this.value = value; }
- ②通过字符串参数构造包装类对象。
public Integer(String s) throws NumberFormatException { this.value = parseInt(s, 10); }
- 示例:
package day13;public class Demo { public static void main(String[] args) { int i = 10; Integer integer = new Integer(i); String s = "10"; Integer integer1 = new Integer(s); System.out.println("integer:" + integer); System.out.println("integer1:" + integer1); }}
4.3.2 拆箱
- 获取包装类对象中包装的基本类型变量,通过调用包装类的.xxxValue()方法。
public int intValue() { return value; }
- 示例:
package day13;public class Demo { public static void main(String[] args) { Integer integer = new Integer(5); int num = integer.intValue(); System.out.println("num:" + num); }}
4.3.3 自动装箱和拆箱
- 在JDK5之后,Java支持自动装箱和自动拆箱。但是类型必须匹配。
4.3.4 字符串和基本数据类型的相互转化
- 字符串转换为基本数据类型:调用包装类的静态方法parseXXX(String s)。
public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); }
- 示例:
package day13;public class Demo { public static void main(String[] args) { String s = "123"; int num = Integer.parseInt(s); System.out.println("num:" + num); }}
- 基本类型转换为字符串:调用String的valueOf()方法。
- 示例:
package day13;public class Demo { public static void main(String[] args) { int num = 123; String s = String.valueOf(num); System.out.println("s:" + s); }}