Day1
引用类型间的数据类型转换
1.两个不相干的类型无法转换
2.子类转父类
Java允许把一个子类对象直接赋值给一个父类引用变量,无需任何类型转换,或者被称为向上转型,由系统自动完成
3.父类保存的对象转子类(强转)
编译期类型与运行期类型
Java的许多对象运行时会出现两种类型:编译期类型和运行期类型
例:Animal animal = new cat();
编译期类型Animal,运行期类型cat
总结:
编译期类型由声明该变量时使用的类型决定
运行时类型由实际赋给该变量的对象决定
注:如果编译期类型和运行期类型不一致,就会出现所谓的多态。
引用变量在编译阶段只能调用其编译时类型所具有的方法,运行时则执行运行期类型的所有方法,因此,引用变量只能调用声明变量类里所包含的方法
instanceof关键字(运算符)
判断的是运行期类型
例题:
定义一个学生类,使得内容支持比较
Student{stuNo.stuName,stuSex}
如果两个对象内的字段内容完全相同则视为同一个
.equals
class Student {
private String stuName;
private String stuNo;
private String stuSex;
public Student(String stuName, String stuNo, String stuSex) {
this.stuName = stuName;
this.stuNo = stuNo;
this.stuSex = stuSex;
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student("小王","001","男");
Student student1 = new Student("小王","001","男");
System.out.println(student.equals(student1));
}
}
结果
.equals比较的是两个堆中的地址,故结果为false
修改
import java.util.Objects;
class Student {
private String stuName;
private String stuNo;
private String stuSex;
public Student(String stuName, String stuNo, String stuSex) {
this.stuName = stuName;
this.stuNo = stuNo;
this.stuSex = stuSex;
}
@Override
public boolean equals(Object o) {
if (this == o) //判断是否是同一个地址
return true;
if (!(o instanceof Student)) //判断Object所保存的数据运行期类型是否是Student
return false;
Student student = (Student) o;
return Objects.equals(stuName, student.stuName) &&
Objects.equals(stuNo, student.stuNo) &&
Objects.equals(stuSex, student.stuSex);
}
}
结果
instanceof的作用
【对象】instanceof 【类型】
a instance B:判断a是否是b的对象(b子类的对象)
示例
package com.vaporware.demo;
class A
{
}
class B extends A
{
}
class C{
}
public class Test1 {
public static void main(String[] args) {
Object o = new B();
System.out.println(o instanceof A);
System.out.println(o instanceof B);
System.out.println(o instanceof C);
}
}
结果
final关键字
final:不可改变的
修饰变量:通常变量的第一次赋值称为初始化,被final修饰后则代表不可被改变
修饰方法:则该方法不可被重写
修饰方法的参数:一旦传入参数,方法体内,无法对参数进行二次修改
修饰类:不可被继承,又叫太监类
static关键字
class Person {
public String name;
public static String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +"age='" + age+
'}';
}
}
public class TestPerson {
public static void main(String[] args) {
Person person1 = new Person("小王","100");
Person person2 = new Person("小张","100");
Person person3 = new Person("小李","100");
person1.age="20";
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
}
}
结果
易知,当其中被static修饰的age发生改变时,其他的也会一起改变(被static修饰的变量属于这个类)
静态方法可以拿类调用,不可引用非静态内容