修饰符和引用类型转换

static关键字

静态的修饰符

static修饰内容

可以修饰的:

  1. 成员变量
  2. 普通方法
  3. 内部类

不可修饰的:

  1. 局部变量
  2. 构造方法
  3. 外部类
//1.有static修饰的字段访问
类名.属性;
//2.没有static修饰的字段访问
字段所在的类的对象:对象名.属性;
//3.有static修饰的方法访问
类名.方法名();
//4.没有static修饰的方法访问
方法所在的类的对象:对象名.方法名();

static修饰符的作用

  • 有static修饰的变量和方法被jvm优先加载
  • 有static修饰的成员变量可以被所有成员访问
  • 静态上下文不予许访问非静态的变量及方法,非静态上下文可以访问静态上下文:

变量分类

成员变量又可分为类变量和实例变量

类变量

创建在类中,有static修饰

生命周期

  • 类被加载==>类被卸载

实例变量

创建在类中,无static修饰

生命周期

  • 创建对象==>对象被销毁

局部变量

创建在方法(形参),代码块中,无static修饰

生命周期

  • 方法被调用==>调用完成

引用类型转换

在引用数据类型中:父类是较大的数据类型,子类是较小的数据类型

子类类型转父类类型:小转大

Cat cat = new TomCat()
double d = 1;

父类类型转子类类型:大转小

TomCat  tc =(TomCat)cat; 

实例分析

  • 在转换之前要进行类型判断

    • 获取c的运行是类型
      c.getClass().getName();

    • 运用instanceof

      a instanceof A 判断对象是否属于A类型 计算结果是布尔类型

class Test{//引用类型转换
    public static void main(String[] args){
        System.out.println("hello");
        Dog dog1=new Husky();
        Dog dog2=new TianYuanDog();
        //erha.run();//报错,Dog中没有run()方法,多态中:编译看左边,运行看右边,有static看左边
        test(dog1);
        test(dog2);
        
    }
    public static void test(Dog dog){
        //判断dog是否是Husky类的实例
            if (dog instanceof Husky){
                //转换
                Husky erha=(Husky) dog;
                erha.run();
            }
            else{
                System.out.println("你不是我的同类");
            }
    }   
}

class Dog{
}
class TianYuanDog extends Dog{
    void run(){
        System.out.println("跑的飞起");
    }
}
class Husky extends Dog{
    void run(){
        System.out.println("跑的飞起");
    }
}

final

修饰符使用范围

  • final可以修饰: 系统变量,成员变量,普通方法,内部类.外部类
  • final不可以修饰: 构造方法

修饰的效果

final修饰的类: 不可被继承,拓展

class Test{//final修饰符
    public static void main(String[] args){
        System.out.println("hello");
        
    }
}
final class A{}
class B extends A{//Test4.java:8: 错误: 无法从最终A进行继承
}

final修饰的方法: 不可被覆写

class Test{//final修饰符
    public static void main(String[] args){
        System.out.println("hello");    
    }
}
class A{
    final void eat(){}
}
class B extends A{
    void eat(){//Test4.java:11: 错误: B中的eat()无法覆盖A中的eat()
        System.out.println("嘿嘿");
    }
}

final修饰的变量: 一旦赋值不可被更改(被final修饰的变量没有自动默认值,需要手动赋值)

class Test{//final修饰符
        //final static int i;//没有自动默认值
        final static int i=5;
    public static void main(String[] args){
        final int j=1;
        //j=5;//final修饰的变量一旦赋值不可被更改
        System.out.println(i);
        System.out.println(j);
    }
}

你可能感兴趣的:(修饰符和引用类型转换)