Java中的static关键字和new关键字作用介绍
一、static关键字的作用
1、可以用于修改类的成员变量、代码块和类
- 通过static可以将类的成员声明为静态成员,静态的成员归属于整个类,而不是属于某个对象。无论通过类还是对象访问静态成员,操作的都是同一个静态成员。
- 使用static修饰的代码块是静态代码块,静态代码块在类加载时执行。
- 静态代码块和静态方法不能访问非静态属性和方法。
- 静态方法可以被继承,但不能被覆盖(重写);如果父类中定义的静态方法在子类中被重新定义,那么父类中定义的静态方法将被隐藏。即:子类中如果有一个返回类型,方法名和参数列表均与父类同名的静态方法,那么该子类实际上只是将父类中该同名方法进行了隐藏,而非重写。它们的行为也不具有多态性。
具体示例如下所示:
class Person {
	private int age;
       //2.使用static修饰的代码块是静态代码块
	static {
		System.out.println("静态代码块!");
	}
	//构造代码块
	{
		eat();
		say();
		age = 10;
	}
	//3. 静态方法不能访问非静态属性和方法;因为其属于对象,静态方法执行时,
	//对象还没有创建
	public static void say() {
		//age = 12;
		System.out.println("静态方法说...");
	}
	public static void say(String str) {
		//age = 12;
		System.out.println("静态方法说...");
	}
	//非静态方法可以调用静态方法和属性
	public void eat() {
		say();
		System.out.println("吃..." + name);
	}
	public static String name;
}
class Teacher extends Person {
        //4.静态方法不能被重写,但是可以被继承
	//@Override
	public static void say() {
		System.out.println("子类静态函数重写");
	}
}
public class Demo01 {
	public static void main(String[] args) {
		/*Person p = new Person();
               //1.静态属性可以通过类和对象访问
		Person.name = "zhansangfen";
		System.out.println(Person.name);
		p.name = "李四";
		Person p1 = new Person();
		System.out.println(p.name);*/
		System.out.println(Person.name);
	}
}
2.静态的原理
使用static修改的成员属性、成员方法和代码块在类加载时,被放到静态区,并且只加载一次;只有当类被释放时,静态区所占的内存才会释放。因此,使用不当会造成内存泄漏。其原理图如下所示:

3.静态和非静态互访
总结:静态只能访问静态,普通可以访问所有(静态、普通)
| 静态属性 | 静态方法 | 普属性 | 普通方法 | |
| 静态方法 | 可以 | 可以 | 不可以 | 不可以 | 
| 静态代码块 | 可以:前提是只能访问到在静态代码块之前声明的静态属性,之后的不可以。 | 可以 | 不可以 | 不可以 | 
| 普通方法 | 可以 | 可以 | 可以 | 可以 | 
| 构造代码块 | 可以 | 可以 | 可以 | 可以 | 
| 静态方法可以重载吗? | 可以 | |||
| 静态方法可以重写吗? | 不可以 | 
4.静态的作用
- JVM的入口方法main是静态放方法
- 用作工具类:就是将一类常用功能提取成若干方法写入到一个类中,这些方法通常声明为静态方法方便使用。并且将该类的构造函数私有化,禁止创建对象,直接使用类名调用方法。比如常见的数学方法:Math.asin(double a)返回一个值得正弦角度。
- 其他情况下使用静态。
二、new关键字的作用
new关键字用于创建一个对象,在其创建对象的过程中大致经历了一下三个步骤;
1、将类加载到方法区
JVM首先会检查这个new指令的参数能否在常量池中定位到一个类的符号引用;如果找不到就将该类加载到方法区并经过解析和初始化等步骤,计算实例化对象所需要的内存;为类的静态变量赋予正确的初始值。
2、在堆中开辟一块内存用于存储新创建的对象
将类实例化出一个新的对象,根据类加载时计算所需的内存大小;在堆中开辟一块内存,用于存储新对象的成员属性和方法区地址的引用。成员方法引用指向方法区中该对象对应的方法。
3、在栈中创建指向对象的引用
在栈中创建一个栈针,用于指向堆中创建的对象。
Java中的static关键字和new关键字作用介绍的更多相关文章
- Java中 final static  super  this  instanceof  关键字用法
		一.final关键字 final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参 ... 
- (转)Java中的static关键字解析
		转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ... 
- 关于Java中的static关键字
		Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ... 
- Java中的static关键字解析
		Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ... 
- (转)Java中的static关键字解析
		转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ... 
- Java中的static关键字解析 转载
		原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ... 
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
		Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ... 
- Java中的static关键字
		写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ... 
- java中的static关键字详解
		static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ... 
- 【Java学习笔记之十五】Java中的static关键字解析
		Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ... 
随机推荐
- importlib 与__import__的区别
			importlib 与__import__的区别 importlib import importlib name = "lib.test" # lib.test指的是lib路劲下的 ... 
- WC2020「Fantasie」
			由于某些不可抗拒因素,这篇文章鸽了 
- Centos7 网卡Device does not seem to be present解决办法
			1.ifconfig -a 查看当前所有网卡 2.修改网络配置文件 3.在原来文件的基础上,修改网卡名称 DEVICE=ens32 NAME=ens32 并且把UUID以及mac地址删掉 mv ifc ... 
- 几种编辑器的markdown-toc生成目录在github上的表现
			Vscode vscode的markdown-toc插件的实现是比较好的, 目前发现的问题就只有在自动生成带链接目录的时候无法正确识别和生成一些特殊的字符. 例如: ▶ 这导致在标题中不能加入特殊字符 ... 
- ROS-5 : 自定义消息
			自定义消息一般存储在功能包的msg文件夹下的.msg文件中,这些定义可告诉ROS这些数据的类型和名称,以便于在ROS 节点中使用.添加完这些自定义消息后,ROS会将其转为等效的C++节点,从而可在其他 ... 
- POJ 1979 Red and Black 四方向棋盘搜索
			Red and Black Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 50913 Accepted: 27001 D ... 
- swoole之创建子进程
			一.代码 <?php /** * 进程就是正在运行的程序的一个实例 * 比如,在某个终端中执行一个PHP脚本,可以认为就是开启了一个进程,会有对应的进程id(pid) * * swoole进程与 ... 
- 从ofo到乐视,变卖资产好过冬靠谱吗?
			今年年底,有很多人"被迫"离职.他们为了应对生活压力和找工作的不确定性,尝试在二手平台上卖出自己的奢侈品或心爱之物,以期度过潜在的难关.而对于很多企业来说,这个冬天也非常冷.依靠常 ... 
- SpringIOC初始化过程源码跟踪及学习
			Spring版本 4.3.2,ssm框架 代码过宽,可以shift + 鼠标滚轮 左右滑动查看 web.xml <!--配置获取项目的根路径,java类中使用System.getProperty ... 
- GoJS组织结构图
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
