static、this、super关键字

概述

在这里插入图片描述


只记

static~ : 直接用类调用 (也可以用对象调用,会自动转换为类名调用)
非static(实例)~ : 要用对象调用
【this和super用法一样!!!!】
this表示:当前对象的
super表示:父类的

在这里插入图片描述


static

static:静态的,可以看作是共享的变量或者方法,存储在方法区内存中。

1. static修饰:无需对象参与便有的定方法或者定变量
那么:
(1)直接:" 类名. " 去访问 (可以用对象调用,不会报错,它会自动转换为类名调用)
(2)static与this不能共存
(3)static方法中也不能直接有实例变量(对象都不滴有 你哪来的实例变量)

当然可以在static方法里面可以创建对象 然后去访问实例变量(这跟上述不冲突)
在这里插入图片描述

2. 无static修饰:必须要有对象参与才有确切值的方法或者变量
必须要用对象调用!
在这里插入图片描述在这里插入图片描述在这里插入图片描述

static代码块

在方法区内存加载顺序:类加载只加载一次!

  1. 进行逐行加载
  2. 遇见静态代码块(static{ … })直接执行!
  3. 遇见方法,加载方法属性(不加载方法体)
  4. 逐行加载结束

注:程序输出的“main方法”是主方法在栈内存中执行输出的!

在这里插入图片描述

用法:

在这里插入图片描述
对象初始时机:new 一次对象执行一次:
在这里插入图片描述

这两种语句块永远是父类先执行!

this

this表示当前对象:
在这里插入图片描述this很多情况下可以省略
在这里插入图片描述在这里插入图片描述只记二: this在构造方法中的特殊用法

this在构造方法中:

  1. this在构造方法中可以直接 this(…) 调用另一个构造方法 【在super部分深析】
  2. 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在子类构造方法中:

  1. this()、super()都是调用构造方法。其中this()调用本类中其他的构造方法,super()调用父类的构造方法
  2. this()、super()只能出现在构造方法第一句
  3. this()、super()只能出现一次
  4. this()、super()不能同时出现
  5. 若没有this()或super()写出(或者它们的重载方法),则每个构造方法都会默认第一行为super()

那么,无论怎样,父类中的构造方法一定会先实现!

在这里插入图片描述
所以,如果重载了一个父类的构造方法,那么建议写一个无参构造方法,不然子类中默认构造方法中的super();就会报错!【当然也可以改变子类中的super()成super(“小明”)】:

在这里插入图片描述

super内存分析

注意:
构造方法执行过程中一连串调用父类构造方法,但只创建了一个对象
super()调用父类构造方法实质是 初始化父类实例变量(父类特征),并不创建对象。这些初始化变量就包含在子类对象中,为子类对象所用。

在这里插入图片描述子类可以通过继承的get(),set()方法去操控没有继承的private变量:
(每个子类对象都是一个下图,各有各的对应父类的private变量)

在这里插入图片描述

this包含super:

在这里插入图片描述
super指向的是父类的一堆特征:
在这里插入图片描述
this.变量/方法,也可以 super.变量/方法 ( 方法与变量情况一样!)
在这里插入图片描述

super不能省:

当子类与父类存在同名变量,想要访问父类中的这个变量,就必须用super.

原因:同样是就近原则(this.不能省也是),name==this.name就近访问子类中的同名变量。用super.就可以访问父类中的这个同名变量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值