对象的创建过程以及static和final关键字

  • **天使总在想象中,魔鬼总在细节处**
  • 一、对象的创建过程
  • 二、static关键字
  • static关键字可以用于修饰类的成员变量,类的成员方法,以及用于编写static代码块来优化程序性能
  • 1、static变量
  • 2、static方法
  • 3、static代码块
  • 4、static关键字的误区
  • fianl关键字
  • final可以修饰变量,方法,类,甚至方法参数
  • 1、final关键字声明的变量,我们称之为常量,必须对该值初始化操作
  • 修饰基本数据类型和引用类型
  • 2、final关键字声明方法时,该方法为最终方法,且只能被子类继承,不能被子类重写。
  • 3、final关键字声明类时,该类为最终类(不可变的类),final修饰的类无法被继承。
  • 4、final关键字声明方法参数时,在该方法内部不能修改参数的值。


天使总在想象中,魔鬼总在细节处

java 对象名称和关键字名称冲突 java创建对象关键字_java 对象名称和关键字名称冲突

一、对象的创建过程

public class Test extends Base{
static{
    System.out.println("test static");
}
 
public Test(){
    System.out.println("test constructor");
}
 
public static void main(String[] args) {
    new Test();
}}
class Base{
static{
    System.out.println("base static");
}
 
public Base(){
    System.out.println("base constructor");
}

结果:
base static
test static
base constructor
test constructor

说明:
    方法在执行时,先加载类对象,后创建对象实例;调用main方法new Test(),先加载Test类对象时,发现存在Test的父类Base的存在,加载父类,若Base检测处还存在相应的父类,则再次加载它的父类,直到将所有的相关父类都被加载完毕。
    static代码块在类加载时被调用,且只调用一次,若下次在创建相同的类的实例,则static方法不会被再次执行。先加载完父类Base的static方法后,再加载子类类对象,并且调用子类类对象的static代码块。
    类加载完毕后,才开始创建对象,先执行父类ide构造方法,而后执行子类的构造方法。


二、static关键字

static关键字可以用于修饰类的成员变量,类的成员方法,以及用于编写static代码块来优化程序性能

1、static变量

    static变量也称为静态变量

变量

区别

静态变量

被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化

非静态变量

被对象拥有,在创建对象的时候初始化,存在多个副本中,在各个对象拥有的副本中,但互不影响

2、static方法

    static方法就是没有this的方法,在static方法内部不能调用非静态的方法,反之可以,可以在没有创建任何对象的前提下,直接通过类本身调用static方法
    main方法就是最常见的static方法,因为程序在执行main方法的时候没有创建任何对象,因此只能通过类名来访问。

3、static代码块

    用于优化程序功能
    可以至于类的任何地方,类中可以有多个static代码块,在类初次被加载时,会按照static代码块的顺序来执行每个static代码块,并且只会被执行一次。


4、static关键字的误区

this不能同于访问静态成员变量?
    这个说法是错误的,this代表的是当前对象,在static方法中不能使用this,因为static在类初次加载时被调用,而此时尚未创建实例对象。
    在static方法外的地方,可以用this调用static成员变量。static成员变量,static方法以及static是属于类对象的,不属于对象实例。在static方法外,使用this调用静态成员变量时,按照代码的执行顺序,当前类的类对象已经被加载完毕,static成员变量已经存在,而静态成员变量是被所有实例对象所共享的,所以可以被调用。
实战演示:

public class Main {  
 static int value = 33;public static void main(String[] args) throws Exception{
    new Main().printValue();
}

private void printValue(){
    int value = 3;
    System.out.println(this.value);
}}


输出:33
说明:this代表当前对象,this.value实际上调用的当前对象的成员变量,而value虽然被static修饰,为静态成员变量,但静态成员变量被所有的对象实例所共享,所以输出33。而int value = 3 是printValue()方法内部的局部变量,与this不关联。

fianl关键字

final:最终的,不可变的

final可以修饰变量,方法,类,甚至方法参数

1、final关键字声明的变量,我们称之为常量,必须对该值初始化操作

修饰基本数据类型和引用类型
  • 当修饰的是一个基本数据类型时,该基本数据类型的值一旦初始化后,就不能发生变化
  • 当final修饰一个引用类型时,初始化后,就不能将其改为指向其他对象,但该引用指向的对象的内容是可以发生改变的
2、final关键字声明方法时,该方法为最终方法,且只能被子类继承,不能被子类重写。
3、final关键字声明类时,该类为最终类(不可变的类),final修饰的类无法被继承。
4、final关键字声明方法参数时,在该方法内部不能修改参数的值。