博客
关于我
static、this、super关键字
阅读量:234 次
发布时间:2019-03-01

本文共 2334 字,大约阅读时间需要 7 分钟。

概述

在这里插入图片描述


只记

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.就可以访问父类中的这个同名变量。

转载地址:http://aqsv.baihongyu.com/

你可能感兴趣的文章
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
Mysqldump参数大全(参数来源于mysql5.5.19源码)
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>