static关键字
静态的修饰符
static修饰内容
可以修饰的:
- 成员变量
- 普通方法
- 内部类
不可修饰的:
- 局部变量
- 构造方法
- 外部类
//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);
}
}