概述
只记
static~ : 直接用类调用 (也可以用对象调用,会自动转换为类名调用)
非static(实例)~ : 要用对象调用
【this和super用法一样!!!!】
this表示:当前对象的
super表示:父类的
static
static:静态的,可以看作是共享的变量或者方法,存储在方法区内存中。
1. static修饰:无需对象参与便有的定方法或者定变量
那么:
(1)直接:" 类名. " 去访问 (可以用对象调用,不会报错,它会自动转换为类名调用)
(2)static与this不能共存
(3)static方法中也不能直接有实例变量(对象都不滴有 你哪来的实例变量)
当然可以在static方法里面可以创建对象 然后去访问实例变量(这跟上述不冲突)
2. 无static修饰:必须要有对象参与才有确切值的方法或者变量
必须要用对象调用!
static代码块
类在方法区内存加载顺序:类加载只加载一次!
- 进行逐行加载
- 遇见静态代码块(static{ … })直接执行!
- 遇见方法,加载方法属性(不加载方法体)
- 逐行加载结束
注:程序输出的“main方法”是主方法在栈内存中执行输出的!
用法:
对象初始时机:new 一次对象执行一次:
这两种语句块永远是父类先执行!
this
this表示当前对象:
this很多情况下可以省略
只记二: this在构造方法中的特殊用法
this在构造方法中:
- this在构造方法中可以直接 this(…) 调用另一个构造方法 【在super部分深析】
- this在构造方法中代表使用该构造方法所创建的对象,所以可以 this.实例方法
重要:
public class Test01 {
int i = 100;//实例变量
static int j = 250;//静态变量
public static void main(String[] args) {
//完整方式
Test01.methon();
//省略方式
methon();
Test01 t1 = new Test01();
t1.methon2();
System.out.println(t1.i);
System.out.println(j);//省略Test01.
}
public static void methon() {
System.out.println("methon");
//完整方式
Test01.doSame();
//省略方式
doSame();
Test01 t2 = new Test01();
t2.doSame1();
System.out.println(t2.i);
System.out.println(j);//省略Test01.
}
public void methon2() {
System.out.println("methon2");
//完整方式
Test01.doSame();
//省略方式
doSame();
//完整方式
this.doSame1();
//省略方式
doSame1();
System.out.println(i);//省略this.
System.out.println(j);//省略Test01.
}
public static void doSame() {
System.out.println("doSome");
}
public void doSame1() {
System.out.println("doSame1");
}
}
super
this、super用法一样
只是:super通过当前构造方法调用父类中的构造方法【注意:没extends继承,则调用的就是Object类的构造方法】(只记三)
只是:this、super在子类构造方法中:
- this()、super()都是调用构造方法。其中this()调用本类中其他的构造方法,super()调用父类的构造方法
- this()、super()只能出现在构造方法第一句
- this()、super()只能出现一次
- this()、super()不能同时出现
- 若没有this()或super()写出(或者它们的重载方法),则每个构造方法都会默认第一行为super();
那么,无论怎样,父类中的构造方法一定会先实现!
所以,如果重载了一个父类的构造方法,那么建议写一个无参构造方法,不然子类中默认构造方法中的super();就会报错!【当然也可以改变子类中的super()成super(“小明”)】:
super内存分析
注意:
构造方法执行过程中一连串调用父类构造方法,但只创建了一个对象;
super()调用父类构造方法实质是 初始化父类实例变量(父类特征),并不创建对象。这些初始化变量就包含在子类对象中,为子类对象所用。
子类可以通过继承的get(),set()方法去操控没有继承的private变量:
(每个子类对象都是一个下图,各有各的对应父类的private变量)
this包含super:
super指向的是父类的一堆特征:
this.变量/方法,也可以 super.变量/方法 ( 方法与变量情况一样!)
super不能省:
当子类与父类存在同名变量,想要访问父类中的这个变量,就必须用super.
原因:同样是就近原则(this.不能省也是),name==this.name就近访问子类中的同名变量。用super.就可以访问父类中的这个同名变量。