Java oop
static与final使用
final的用法
final是Java的关键字,表示最终
1. final能修饰什么
final不能修饰构造方法
- 类
- 属性
- 局部变量
- 一般方法
2. final修饰后的影响
-
类
这个类不能被继承,也就是这个类不能有子类public final class Person { }
-
属性和变量
值不能更改,就是常量public final class Person { final int STUDENT_AGE = 20;//值不能变 public void calc(final int first) { final int NUM1 = 90; first = 900;//报错 } }
- 方法
方法不能被重写
public class Person { final int STUDENT_AGE = 20;//值不能变 public void calc(final int first) { final int NUM1 = 90; //first = 900;//报错 } public final void speak() {} } class Student extends Person { //报错 public void speak() {} }
- 方法
3. final代码解析一
以下代码执行结果是什么?
public class Animal {
final int age;
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println(animal.age);//值多少?
}
}
4. final代码解析二
以下代码的输出结果是什么?
public class Animal {
final int age;
public Animal(int age) {
this.age = age;
}
public static void main(String[] args) {
Animal animal = new Animal(2);
System.out.println(animal.age);//???
}
}
final修饰的属性,要么显式赋值,要么构造方法赋值。
static的用法
static是Java语言的关键字,表示静态。
static能修饰什么
- 属性(静态属性、静态变量、类变量)
静态属性可以用类名字直接访问,也可用对象访问 - 一般方法(静态方法、类方法)
静态方法可以用类名字直接调用,也可用对象调用
public class Teacher {
static int age;
public static void speak() {
System.out.println("大家好!");
}
public static void main(String[] args) {
Teacher.speak();//OK
System.out.println(Teacher.age);//OK
Teacher teacher = new Teacher();
teacher.speak();
System.out.println(teacher.age);
}
static class W {}
}
static深层次影响
被static修饰的属性,被所有对象共享,一个对象对属性值的更改会影响到所有对象。
非静态属性,叫做实例变量,每个对象持有一份,不是共享的。
不要轻易把属性标识为static。
public class Teacher {
static int age = 20;
int grade = 2;
public static void speak() {
System.out.println("大家好!");
}
public static void main(String[] args) {
Teacher.speak();//OK
System.out.println(Teacher.age);//OK
Teacher.age = 30;//把age值更改了
Teacher teacher = new Teacher();
teacher.speak();
System.out.println(teacher.age);//输出多少?
}
static class W {}
}
注意事项:
- static方法里不能使用非静态属性(静态方法里不能使用实例变量)
public class Teacher {
static int age = 20;
int grade = 2;
public static void speak() {
grade++;//报错
age++;//OK
System.out.println("大家好!");
}
}
- static不能修饰局部变量(含形参)
- 在static方法里,不能直接调用非静态方法
此话对否:在静态方法里不能调用非静态方法?错误!
public class Teacher {
static int age = 20;
int grade = 2;
public void eat() {}
public static void speak() {
eat();//报错
Teacher t = new Teacher();
t.eat();//OK
System.out.println("大家好!");
}
- static方法、游离块中不能使用super和this,因为super和this是实例变量
- 内部类(静态内部类)
- 游离语句块(静态的游离语句块)
static不能修饰什么
- 构造方法
- 局部变量
- 外部类
static存放在内存什么区域
全局数据区
static加载问题分析
- 仅加载1次(仅执行1次)
- 什么时候加载?.class文件被载入JVM的时候加载
以下代码输出结果?
public class Worker {
static {
System.out.println("first");
}
static int age = getAge();
public static int getAge() {
System.out.println("second");
return 34;
}
public static void main(String[] args) {
Worker worker = new Worker();
}
}
对象构造次序
- 父类的静态(看次序,static属性和static游离块)
- 子类的静态(看次序,static属性和static游离块)
- 父类非静态(看次序,非静态属性和游离块)
- 父类的构造方法
- 子类非静态(看次序,非静态属性和游离块)
- 子类的构造方法
为什么main前面必须有static
静态方法和属性与类相关,并“不”与对象相关,意思就是不用创建对象,照样能用,因为类是存在的
总结
- final怎么用
- static修饰属性的影响、方法影响
- 加载次数及存放的地方