Java中的static关键字修饰属性和方法(推荐)
作者:俚语h。 发布时间:2021-09-29 05:46:20
static关键字
static关键词与对象无关。
static关键字主要修饰四个部分的内容
这里我们主要介绍static修饰属性和修饰方法。
1.static修饰属性(静态属性)
1.1.哪些成员属性可以被static修饰。
我们把static修饰的属性称为静态属性,又叫类属性。一个类里面的所有实例的这个属性值都相同,我们就可以把这个属性用static修饰,所有实例共享这个属性值。静态属性在程序运行中是保存在方法区中的,而非静态成员属性在创建一个个实例对象时,和这个对象一样存储在堆区。
1.1.1.所有实例的某个属性的值是一样的,就可以使用static关键字修饰
例如:生活在同一个城市的所有人的所在地区属性值是一样的。
那么在定义这个属性时就可以使用static关键字修饰。
public class Person {
String name;
int age;
String sex;
//所在地区
static String country;
}
1.1.2.类中的final常量
使用final修饰的常量的值是不能够被改变的,那么就意味着这个类中,所有实例的这个属性的值是一样的。非静态成员属性每次在创建实例时都会开辟内存,如果将final修饰的常量定义成静态属性,就可以节省每次创建实例后的一点内存。
注意:定义final成员属性时一定要赋初值。
public class Person {
String name;
String sex;
//所在地区
static String country;
static final int age=18;
1.2.静态属性的访问。
1.静态属性又称为类属性,对静态属性的访问不需要创建对象,可以直接使用类名称去访问。
public class Person {
String name;
int age;
String sex;
//所在地区
static String country;
public static void main(String[] args) {
System.out.println(Person.country);
}
}
2.如果这个类里面已经创建了实例对象,也可以通过实例对象访问静态属性。(不推荐)
public class Person {
String name;
int age;
String sex;
//所在地区
static String country;
public static void main(String[] args) {
Person per1=new Person();
System.out.println(per1.country);
}
}
我们就以前面这段代码解释一下代码运行过程中内存中的变化。
思考题:
1.我们可以在方法中定义静态变量吗?
答:不可以。方法中的变量是方法在被调用之后在栈区中存储的,而静态变量存在方法区的,不可能存在一个变量既存储在方法区又存储在栈区。
2.
public class Person {
String name;
String sex;
//所在地区
static String country;
static final int age=18;
public static void main(String[] args) {
Person per1=new Person();
per1=null;
System.out.println(per1.name);
}
}
上面这串代码在运行时会出现
即:空指针异常,这段代码中,per1引用指向的地址为空。
那么
public class Person {
String name;
String sex;
//所在地区
static String country;
static final int age=18;
public static void main(String[] args) {
Person per1=new Person();
per1=null;
System.out.println(per1.country);
}
}
这段代码可以运行吗?
答:可以的。因为conutry属性是静态属性。运行这段代码的时候系统会识别到是Person类中的,per1.country
就相当于Person.country
。所以不会出现空指针异常。
2.static关键字修饰方法
static关键字修饰的方法又叫类方法,工具方法,静态方法。同样的,他也是可以直接使用类名称.方法名称调用。没有对象就可以访问。
1.那些方法可以使用static修饰
1.工具类的方法设置为static方法
例如:
Arrays.sort(int [ ]):传入一个int[ ]就可以使用,不需要创建对象去使用
2.一个程序的主方法
程序的主方法就是程序的入口,如果设置成非静态方法,那么主方法的使用就需要创建对象,而程序都没有入口进入,怎么去创建对象,程序就无法运行。因此程序的主方法要设置成静态方法,直接使用,不需要创建对象。
2.常见的问题
1.静态方法能否访问成员变量和成员方法
答:不能。静态方法的访问是不需要创建对象的,也就是说静态方法使用中是没有对象的,而成员方法和成员变量的使用是需要创建对象的,所以静态方法是无法访问成员变量和成员方法。
2.成员方法能否访问静态属性和静态方法。
答:可以,成员方法的访问前提是有对象,静态方法和静态属性的访问是没有前提条件的。因此成员方法都可以访问,那么静态方法和静态属性是一定可以访问的
3.普通的类能否使用static修饰(不是内部类)。
答:不可以。类定义出来就是产生相应实例对象的,而用static修饰之后这个类没有对象就可以调用了,这个类就没有存在的意义了。在编译过程中程序也会报错。
来源:https://blog.csdn.net/qq_45681368/article/details/124164493


猜你喜欢
- 概述常用的弹窗有菜单,或者Dialog,但更加人性化和可自定义的还是PopupWindow如果只是展示列表数据或者弹窗列表选择,直接使用Li
- 前言之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升
- 这篇文章主要介绍了SpringBoot加载外部依赖过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法,具体内容详情如下所示:在Android Studio中
- 上篇博文:Java-多线程的使用equals与==1. ==的使用1.1 概述⭕ 用于基本类型比较值时:只要两个变量的值相等,即为true。
- 之前我写过直接用国内镜像的IP地址端口进行配置国内镜像的,如下链接:Android studio配置国内镜像源但是这种方法不一定在每台电脑上
- 利用链如下其中LazyMap.get()->ChainedTransformer.transform()-InvokerTransfo
- 本文实例为大家分享了UnityShader使用Plane实现翻书效果的具体代码,供大家参考,具体内容如下之前在网上看到一个Shadr可以实现
- 背景随着公司业务越来越复杂,在同一个列表中需要展示各种类型的数据。总体结构ItemViewAdapter: 每种类型的卡片分别都是不同的It
- Java中为什么需要Callable在java中有两种创建线程的方法:一种是继承Thread类,重写run方法:public class T
- 前言出去面试的时候,对java的集合框架考察的知识点还是蛮多的。除了基础的集合常见API使用,对集合底层的实现原理以及数据结构等也有很多考察
- 在application.properties中填写中文信息,在读取该文件时会出现中文乱码问题。比如:application.propert
- Java对象为什么需要被序列化序列化能够将对象转为二进制流,对象就可以方便的在网络中被传输和保存。实现序列化的方式实现Serializabl
- TabControl控件中TabPage选项卡切换时的触发事件选项卡切换触发的是TabControl控件的SelectedIndexChan
- 创建hander文件夹在 java 源码目录下创建hander文件夹, 在该文件夹下创建CustomAuthenticationFailHa
- 在servlet3.0标准之前,是每一个请求对应一个线程。如果此时一个线程出现了高延迟,就会产生阻塞问题,从而导致整个服务出现严重的性能情况
- 之前看过一句话,说的特别好。有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平。是的,大家都实现一个功能,不同的人有
- 手动将本地jar添加到Maven仓库将jar添加到本地仓库的做法以下面pom.xml依赖的jar包为例:实际项目中pom.xml依赖写法:&
- 本文实例讲述了Android编程实现动态支持多语言的方法。分享给大家供大家参考,具体如下:资源文件values/strings.xml中添加
- Maven修改打包文件名称对Maven打出的jar包名称不满意:想通过修改配置给jar包改名,查询找到了方法:pom.xml的<bui