一、关键字instanceof
判断一个对象是不是属于某一个类型,返回值为boolean
1、即子类的对象属于父类的类型,但父类的对象不属于子类的类型。
public class Animal {
private final int AGE;
public Animal() {
AGE = 1;
}
public void eat() {
System.out.println("吃肉");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃骨头");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
// a动物属于猫类型
boolean b = a instanceof Cat;
System.out.println("b=" + b);//b=false
Cat c = new Cat();
// c猫动物属于动物类型
boolean b2 = c instanceof Animal;
System.out.println("b2=" + b2);//b2=true
}
}
2、父类的引用可以指向子类的对象,但子类的引用不能指向父类的对象,也不能指向继承为同一个父类的对象
public static void main(String[] args) {
Animal a = new Cat();//true
Cat c=new Animal();//false
Cat c1=new Dog();//false
}
3、相互指向的对象,也就属于同一个类型。
public static void main(String[] args) {
Animal a = new Cat();
boolean b=a instanceof Animal;//true
boolean b1=a instanceof Cat;//true
}
4、相互转换的对象,也就属于同一个类型。
注意:要是属于一个类型的才能强转
转换分为:向上转换(又叫泛化)和向下转换
public static void main(String[] args) {
Cat c = new Cat();
// 隐式转换,又叫泛化,向上转型
Animal a = c;
boolean a1 = c instanceof Cat;
boolean a2 = c instanceof Animal;
boolean a3 = a instanceof Cat;
boolean a4 = a instanceof Animal;
System.out.println("泛化");
System.out.println(a1 + " " + a2 + " " + a3 + " " + a4);//true true true true
//向下转型
Animal animal = new Animal();
animal = new Cat();//向下转型需注意的是:首先需要指向该类型,不然会发出异常
boolean b = animal instanceof Cat;
System.out.println(b);
System.out.println("向下转型");
boolean cc = animal instanceof Cat;
boolean ccc = animal instanceof Animal;
System.out.println(cc + " " + ccc);
}
}
5、继承为同一个对象的两个不同的子类,不能相互转换,也不能相互指向 (参考第二条)
二、关键字final
1.final修饰的变量,叫常量
命名习惯,全部大写,单词切换用下划线
常量需要初始化,而且值不可更改
例:final int NUM=4;
2.final修饰的方法不能被override
override作用:否定父类的,使用自己的
3.final修饰的类不能被继承
final修饰的类中的功能,只能自己来用
例如:String
三、static
1、概念:static修饰的属性和方法被该类的所有对象共享(仅此一份)
2、使用:使用类名直接调用
static修饰的代码中不包含this和super
非静态的可以直接调用静态的,反之不行
静态的可以直接调用静态的
3、普通的属性在对象创建才加载内存
静态的属性在类加载就立即加载内存
4、非静态修饰的依赖对象,所以,普通方法看着是对象方法,普通属性属于某个具体对象
static修饰的依赖于类,所以,静态的方法和属性使用类名直接调用
static修饰代码块
类加载的时候,只执行一次
优先级高于代码块
作用:类加载的时候,给类初始化
代码块
每new一次执行一次
作用:给类所有对象初始化
优先级高于构造方法
构造方法
每new一次执行一次
作用:给对象初始化
优先级高于普通方法
例:
class ClassA{
static {
System.out.println("In ClassA Static");
}
public ClassA(){
System.out.println("ClassA()");
}
}
class ClassB{
static {
System.out.println("In ClassB Static");
}
public ClassB(){
System.out.println("ClassB()");
}
}
class ClassC extends ClassB{
static{
System.out.println("In ClassC Static");
}
public ClassC(){
System.out.println("ClassC()");
}
}
class MyClass {
static ClassA ca = new ClassA();
ClassC cc = new ClassC();
static{
System.out.println("In Static MyClass");
}
public MyClass(){
System.out.println("MyClass()");
}
}
public class TestMain{
public static void main(String args[]){
MyClass mc1 = new MyClass();
MyClass mc2 = new MyClass();
System.out.println(mc1.cc == mc2.cc);
System.out.println(mc1.ca == mc2.ca);
}
}
结果:In ClassA Static
ClassA()
In Static MyClass
In ClassB Static
In ClassC Static
ClassB()
ClassC()
MyClass()
ClassB()
ClassC()
MyClass()
true
false