Unit10 static与final使用 部分学习笔记
一、final的用法:
- final是Java的关键字,表示最终。
1. final能修饰什么?
- (1)final不能修饰构造方法
- (2)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代码解析一:
- 以下代码执行结果是什么?
- 答:没有结果,此程序是错误的,age没有赋值。
public class Animal {
final int age;
public static void main(String[] args) {
Animal animal = new Animal();
//值多少?
System.out.println(animal.age);
}
}
4. final代码解析二:
- 以下代码的输出结果是什么?
- 答:输出2
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语言的关键字,表示静态。
1.static能修饰什么?
- (1)属性(静态属性、静态变量、类变量)
- 静态属性可以用类名字直接访问,也可用对象访问
- (2)一般方法(静态方法、类方法)
- 静态方法可以用类名字直接调用,也可用对象调用
public class Teacher {
static int age;
public static void speak() {
System.out.println("大家好!");
}
public static void main(String[] args) {
//OK
Teacher.speak();
//OK
System.out.println(Teacher.age);
Teacher teacher = new Teacher();
teacher.speak();
System.out.println(teacher.age);
}
static class W {}
}
- (3)内部类(静态内部类)
- (4)游离语句块(静态的游离语句块)
static深层次影响:
- 1.被static修饰的属性,被所有对象共享,一个对象对属性值的更改会影响到所有对象。
- 2.非静态属性,叫做实例变量,每个对象持有一份,不是共享的。
- 3.不要轻易把属性标识为static。
public class Teacher {
static int age = 20;
int grade = 2;
public static void speak() {
System.out.println("大家好!");
}
public static void main(String[] args) {
//OK
Teacher.speak();
//OK
System.out.println(Teacher.age);
//把age值更改了
Teacher.age = 30;
Teacher teacher = new Teacher();
teacher.speak();
//输出多少?
System.out.println(teacher.age);
}
static class W {}
}
注意事项:
- 1.static方法里不能使用非静态属性(静态方法里不能使用实例变量)
public class Teacher {
static int age = 20;
int grade = 2;
public static void speak() {
//报错
grade++;
//OK
age++;
System.out.println("大家好!");
}
}
-
2.static不能修饰局部变量(含形参)
-
3.在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是实例变量
2.static不能修饰什么?
- 构造方法
- 局部变量
- 外部类
3.static存放在内存什么区域?
- 答:全局数据区
4.static加载问题分析
- 1.仅加载1次(仅执行1次)
- 2.什么时候加载?
- 答:.class文件被载入JVM的时候加载。
- 以下代码输出结果?
- 答:first second
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();
}
}
5.对象构造次序:
- (1)父类的静态(看次序,static属性和static游离块)
- (2)子类的静态(看次序,static属性和static游离块)
- (3)父类非静态(看次序,非静态属性和游离块)
- (4)父类的构造方法
- (5)子类非静态(看次序,非静态属性和游离块)
- (6)子类的构造方法
public class Worker {
public Worker() {
System.out.println("父类构造方法88888888");
}
{
System.out.println("父类非静态33333333333");
}
int grade = getGrade();
public int getGrade() {
System.out.println("999999999");
return 2;
}
static {
System.out.println("父类游离块(次序)11111111");
}
static int age = getAge();
public static int getAge() {
System.out.println("00000000");
return 34;
}
}
class AWorker extends Worker {
int grade1 = getGrade1();
public int getGrade1() {
System.out.println("kkkkkkkkkkk");
return 2;
}
public AWorker() {
System.out.println("子类构造方法ttttttttttt");
}
{
System.out.println("子类非静态4444444444");
}
static {
System.out.println("子类游离块(次序)qqqqqqqqqqqq");
}
static int age1 = getAge1();
public static int getAge1() {
System.out.println("wwwwwwwwwwww");
return 34;
}
public static void main(String[] args) {
new AWorker();
}
}
6.为什么main前面必须有static?
- 静态方法和属性与类相关,并“不”与对象相关,意思就是不用创建对象,照样能用,因为类是存在的。
7.总结
- 1.final怎么用
- 2.static修饰属性的影响、方法影响
- 3.加载次数及存放的地方