JAVA-基本程序设计结构(类变量、main语法、代码块、final关键字、抽象类)

发布时间 2023-09-20 10:51:34作者: 子饮

1.类变量和类方法

1.类变量

1.类变量的定义和语法

1.类变量静态变量/静态属性/静态字段)是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量

2.定义语法:

  访问修饰符 static 数据类型 变量名; [推荐]

  static 访问修饰符 数据类型 变量名;

3.访问方式:

  类型.类变量名 [推荐]

  对象名.类变量名

 静态变量的访问修饰符的访问权限和范围与普通的属性是一致的,类变量的访问必须遵守相关的访问权限

类变量是随着类的加载而创建,所以即使没有创建类的对象实例也可以访问该变量

2.类变量内存模型

 

(1).在JDK7以前,静态变量存放于方法区中的静态域内

(2).在JDK7以后,静态域存储于定义类型的Class对象中,Class对象同堆中的其他对象一样,存在于GC堆中

(3).类在加载时会在堆里面生成一个对应的class对象

3.类变量的注意事项和细节

1.当需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量)

2.类变量是该类的所有对象共享的,而实例变量(普通属性)是每个对象独享的

3.加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量

4.实例变量不能通过 类名.类变量名 方式访问

5.类变量是在类加载时就初始化了,即使没有创建对象,只要类加载了,就可以使用类变量了

6.类变量的声明周期是随着类加载开始,随着类消亡而销毁

2.类方法

1.类方法的定义和语法

1.类方法也叫静态方法在使用static关键字修饰后,该方法就是静态方法——静态方法可以访问静态属性/变量

2.定义语法:

  访问修饰符 static 数据返回类型 方法名(){ } [推荐]

  static 访问修饰符 数据返回类型 方法名(){ }

3.调用方式:

  类名.类方法名

  对象名.类方法名

【前提是 满足访问修饰符的访问权限和范围】

2.类方法使用场景

当方法中不涉及任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率

开发自己的工具类时,可以将方法做成静态的,方便调用(不用创建对象就可以调用,例如Math类中的方法等)

3.类变量的注意事项和细节

1.类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区

  类方法中无this的参数(不可以使用this

 

  普通方法中隐含着this的参数(可以使用this),但是在普通方法中无法对类成员使用this

2.类方法可以通过类名调用,也可以通过对象名调用。一般是使用类名调用

  普通方法和对象有关,需要通过对象名调用,不能通过类名调用

3.类方法中不允许使用和对象有关的关键字,比如this和super,普通方法(成员方法)可以

4.类方法(静态方法)中,只能访问 静态变量 或 静态方法

 普通成员方法,既可以访问 普通变量(方法),也可以访问静态变量(访问)

总结:静态方法,只能访问静态的成员(属性和方法),非静态的方法,可以访问静态成员和非静态成员

2.main方法

1.main方法基础理解

1.main 方法是Java虚拟机调用的
2.虚拟机需要调用类的main()方法,所以该方法的访问权限必须为public(虚拟机与main方法不在同一个包(private,默认,proteced均不可以)
3.Java虚拟机在调用main()方法时不必创建对象,所以该方法必须是static
4.该方法接受String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数
5.在编译后,Java 执行的程序 参数1,参数2,参数3 .... (后面所跟参数就是传入String数组的参数)

2.深入理解

1.在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性

2.但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态变量

3.代码块

1.代码块基础

1.代码块又称初始化块,属于类中的成员[即 是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来

2.代码块和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显示调用,而是加载类时或创建对象时隐式调用

3.基本语法:

[修饰符]{
​       代码
};

(1).修饰符 可写可不写,若写只能为static

(2).代码块分两类,使用static修饰的称为静态代码块,没有static修饰的,称为非静态代码块/普通代码块

(3).逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)

(4).;(分号)可写可省略

2.代码块深入理解

1.代码块理解

1.代码块:

  (1)相当于另一种形式的构造器(对构造器的补充机制),可以做初始化的操作

 

  (2)场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性

 

2.static代码块也叫静态代码块作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次

 

3.普通的代码块,在创建对象(new 对象)实例时,会被隐式的调用,被创建一次,就会调用一次

   普通代码块,每创建一个对象实例,就会执行一次

 如果只是使用类的静态成员变量,普通代码块并不会执行

2.类的加载

1.创建对象实例时(new)

2.创建子类对象实例,父类也会被加载

3.使用类的静态成员时静态属性,静态方法

3.调用顺序

在创建一个对象时,在一个类中的调用顺序时:

1.调用静态代码块和静态属性初始化(静态代码块和静态属性初始化调用的优先级一样。如果有多个静态代码块和多个静态变量初始化,则按它们定义的顺序调用)

2.调用普通代码块和普通属性初始化(普通代码块和普通属性初始化调用的优先级一样。如果有多个普通代码块和多个普通变量初始化,则按它们定义的顺序调用)

3.调用构造方法

  构造器的最前面其实隐含了 super()和调用普通代码块,所以 普通代码块调用顺序优先于构造器。

  静态相关的代码块和属性初始化,在类加载时,就执行完毕了,因此是优先于构造器和普通代码块执行的

class 类名{
    super();
    //调用普通代码块
    代码
}

4.继承关系下调用顺序

1.父类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行)

2.子类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行)

3.父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)

4.父类的构造方法

5.子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)

6.子类的构造方法

4.final关键字

1.final基础介绍

final 可以修饰类、属性、方法和局部变量

1.当不希望类被继承时,可以用final修饰

2.当不希望父类的某个方法被子类覆盖/重写时,可以用final关键字修饰

3.当不希望类的某个属性的值被修改,可以用final修饰

4.当不希望某个局部变量被修改,可以使用final修饰

2.final深入理解

1.final 修饰的属性又叫常量,一般用 XX_XX_XX来命名

2.final 修饰的属性在定义时,必须赋初值,并且以后不能在修改,赋值可以在如下位置之一

  1.定义时

  2.在构造器中

  3.在代码块中

3.如果 final 修饰的属性是静态的,则初始化位置只能是 定义时在静态代码块中,不能在构造器中赋值(类加载在调用构造器之前

4.final 类不能继承,但是可以实例化对象

5.如果类不是final 类,但是含有final 方法,则该方法虽然不能重写,但是可以被继承

6.一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法(已经不会被继承,所以方法不会被重写)

7.final 不能修饰构造方法(即构造器)

8.final 和 static 往往搭配使用,效率更高,不会导致类加载使类不进行加载,底层编译器做了优化处理

9.包装类(Integer、Double、Float、Boolean等)、String类都是final类

5.抽象类

1.抽象类基础

1.当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类

  抽象方法就是没有实现的方法,没有实现就是指没有方法体当一个类中存在方法时,需要将该类声明为abstract类(抽象类)

2.用abstract关键字来修饰一个类时,这个类就叫抽象类

访问修饰符 abstract 类名{
       代码
}

3.用abstract关键字来修饰一个方法时,这个方法就是抽象方法

访问修饰符 abstract 返回类型 方法名(参数列表); //没有方法体

4.抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类()

5.抽象类在框架和设计模式使用较多

2.抽象类深入理解

1.抽象类不能被实例化不可以被new

2.抽象类不一定要包含abstract方法,也就是说,抽象类可以没有abstract方法

3.一旦类包含了abstract方法,那么这个类必须声明为abstract类

4.abstract 只能修饰类和方法,不能修饰属性和其他

5.抽象类可以有任意成员(抽象类本质上还是一个类) 比如:非抽象方法、构造器、静态属性等等

6.抽象方法不能有主体,即不能实现

7.如果一个类继承了抽象类,则他必须实现抽象类的所有抽象方法,除非他自己也声明为abstract类

只要有了方法体,就是实现了方法,无论方法体内是否有内容

8.抽象方法不能使用private、final 和 static 来修饰的,因为这些关键字都是和重写相违背的