-
面向对象的三条主线
类和类的成员(属性、方法、构造器、代码块、内部类)
封装性(四个关键字)和多态
其他关键字及其使用(static、final、abstract、interface) -
Static
与final的区别:final属性在一个对象里只能调一次,static整体上就只能调一次
修饰属性:静态变量随着类的加载而加载(因为成员变量是通过构造方法创建的,而构造方法在类后创建,所以静态变量在成员变量前创建),可以通过类.静态变量的方式进行调用。由于类只加载一次,静态变量也只存在一份,存储在方法区的静态域中。静态变量 实例变量
类(调) Yes No
对象(调) Yes Yes
(实例变量随着对象的创建而加载,消亡而消亡;静态结构随着类的加载而加载,消亡而消亡。晚出生的可以调早出生的,反之不行。)
修饰方法:静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
有了静态方法,调方法的时候就可以不通过对象,而直接method(形参)了
static注意点:
- 1 在静态的方法内,不能使用this关键字、super关键字(这都是基于当前对象做指代的关键字,static方法没有对象)
- 2 关于静态属性和静态方法的使用,大家都从生命周期的角度去理解。
Static不能修饰构造器,因为
-------口-------
口是构造器
口左边是随着类以及类加载而加载的东西
口右边是对象以及随着对象加载而加载的东西
构造器的加载处于这两类事物之间 用来区分它们
静态方法 非静态方法
类 Yes No
对象 Yes Yes
单例模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对 某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构 造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生 类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无 法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象 的变量也必须定义成静态的。
对对象声明Static、private的原因等(宋红康323.15)
饿汉懒汉区别
public class SingletonTest1 {
public static void main(String[] args) {
// Bank bank1 = new Bank();
// Bank bank2 = new Bank();
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank1 == bank2);
}
}
//饿汉式
class Bank{
//1.私有化类的构造器
private Bank(){
}
//2.内部创建类的对象
//4.要求此对象也必须声明为静态的(因为静态方法只能调用静态结构)
private static Bank instance = new Bank();
//3.提供公共的静态的方法,返回类的对象
public static Bank getInstance(){
return instance;
}
}
- 类的成员之四:代码块(或初始化块)
代码块的作用:用来初始化类、对象
代码块如果有修饰的话,只能使用static.
分类:静态代码块 vs 非静态代码块
*
*静态代码块
-
>内部可以有输出语句
-
>随着类的加载而执行,而且只执行一次
-
>作用:初始化类的信息
-
>如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
-
>静态代码块的执行要优先于非静态代码块的执行
-
>静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
非静态代码块
-
>内部可以有输出语句
-
>随着对象的创建而执行
-
>每创建一个对象,就执行一次非静态代码块
-
>作用:可以在创建对象时,对对象的属性等进行初始化
-
>如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
-
>非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
对属性可以赋值的位置:
- ①默认初始化
- ②显式初始化/⑤在代码块中赋值
- ③构造器中初始化
- ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值
- 执行的先后顺序:① - ② / ⑤ - ③ - ④
- Final
final可以用来修饰的结构:类、方法、变量
final 用来修饰一个类:此类不能被其他类所继承。
-
比如:String类、System类、StringBuffer类
final 用来修饰方法:表明此方法不可以被重写
-
比如:Object类中getClass();
final 用来修饰变量:此时的"变量"就称为是一个常量
-
final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化(但是在方法里调用的时候应该是已经被初始化了的状态了,所以不能在方法里进行初始化)
-
final修饰局部变量:
-
尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,==就只能在方法体内使用此形参,但不能进行重新赋值。==
- static final 用来修饰属性:全局(s)常量(f)