初学Java---面向对象编程-static与final使用


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("大家好!");
  }
    1. 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.加载次数及存放的地方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕兮IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值