Java中的static关键字和new关键字作用介绍
2024-08-30 13:21:24
一、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、在栈中创建指向对象的引用
在栈中创建一个栈针,用于指向堆中创建的对象。
最新文章
- MVC4做网站六后台管理:6.1.4管理员列表、添加及删除
- IDEA 将已有项目添加到git
- css3 transition动画
- pdsh使用
- Helixoft VSdocman 是一个集成于Visual Studio并提供了命令行版本的帮助文档编译工具
- C语言第五节scanf函数
- php获取内容中第一张图片地址
- jQuery弹出层---artDialog 文档
- 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器
- spring MVC 如何获取session并实现传值到前台
- Centos下安装jdk详解
- 集美大学网络1413第十四次作业成绩(团队九) -- 测试与发布&;博客展示(Beta版本)
- flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台
- Open-Source Service Discovery
- UE4外包团队:更新一下UE4和Unity3D案例
- JavaScript之DOM对象获取(1)
- 掌握Docker命令-Docker for Web Developers(4)
- [LeetCode] questions conclustion_Path in Tree
- nginx反向代理和正向代理,优缺点
- Retrofit2.0+RxJava2.0问题
热门文章
- Python学习笔记之面向对象
- 服务端OLEVARIANT数据之后传输
- C++中%d,%s,%x,%f,%.100f,%的意思
- Mybatis框架模糊查询
- java并发:初探用户线程和守护线程
- v-show和element中表单验证validate起到的化学反应
- Day2:接着思考和可能的策划
- vs2010编译C++ 状态标志
- 201706 Ruby 基础 & 元编程
- iOS中html打开APP传参