instanceof用法以及static拓展
instanceof
instanceof用来比较两个类中是否存在关系
如果存在关系则返回 true 不存在关系就返回false
//建立三个不同的类 A B B继承A c没有继承也没有被继承
public class A{
}
public class B extends A{
}
public class c{
}
//调用instanceof方法判断是否存在关系
B b=new B(); //创建B 的对象
System.out.println(b instanceof A); //判断b和A的关系 ture
System.out.println(b instanceof C); //判断b和C的关系 false
输出结果为:
true
false
Static关键字拓展
static用来修饰静态方法和静态属性 这些属性和方法属于类 不属于实例和方法;
静态代码块和匿名代码块
- 静态代码块和匿名代码块存在与类中 执行优先级都大于构造方法
- 匿名代码块和构造方法在通过实例化可以被多次执行
- 静态代码块只在类初始话时被执行一次 不会被重复执行
//创建三个代码块 顺序为 构造方法 > 匿名代码块 > 静态代码块
public class Test{
Test(){
System.out.println("我是构造方法");
}
//========================================
{
System.out.println("我是匿名代码块");
}
//========================================
static {
System.out.println("我是静态代码块");
}
}
class a{
public static void main(String[] args) {
Test test=new Test(); //实例化 Test
System.out.println("================================");
Test test1=new Test(); //再实例化一次 Test
}
}
输出结果为:
我是静态代码块 //执行结果顺序和编写顺序不一样 说明三种代码块有不同的优先级 和编写顺序无关
我是匿名代码块
我是构造方法
==================================
我是匿名代码块 //在第二次实例化时 static代码块没有再次被执行 说明静态代码块只执行一次
我是构造方法
三种代码块的执行顺序为:
静态代码块 > 匿名代码块 > 构造方法
静态导包
static修饰的属性和方法都可以直接通过类名调用
用static修饰外部包会怎么样呢?
我们来试试
//这是一个普通的调用 调用了lang包下的Math类中的random方法 随机数
public class test{
public void test() {
System.out.println(Math.random()); //random 属于一个静态方法 我们通过类名来调用这个方法
}
//把这个方法设置成静态导入
import static java.lang.Math.random;
public class test{
public void test() {
System.out.println(random()); //我们可以直接调用这个方法,而不用去通过类名调用
}