博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java编程细节总结(四):深入了解static和final关键字
阅读量:3916 次
发布时间:2019-05-23

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

小编今天在java基础的学习过程中出现面试级的细节难题,什么是static静态类?非静态类是什么?为什么用static修饰的静态成员变量不需要实例化就可以用类去调用它的成员和方法?static的初始化和非静态变量的初始化谁的优先级高?final的修饰static会存在什么作用等等。。。这些问题就是本小结的最核心的部分,接下来看分析。


一、static关键字

   Java常用static去修饰静态成员或者静态方法,被修饰后的成员和方法均可以在类直接调用,不需要实例化。 这样是不是看起来超级方便?那是肯定的,同时,我们都希望节省内存,static类同时也会节省一定的内存。

   这两句话是什么意思呢?
请看如下代码。

public class  Employee{
private static int nextId;//nextId用static方法定义 private int id; private String name; public int data;//定义一个外部可以访问和随意修改的共有变量data {
System.out.println("非静态初始化" + nextId + "==name:" + name); id = nextId; nextId++; } static{
System.out.println("静态初始化"); Employee as = new Employee(); } public int getData() {
return data; } public void setData(int data) {
this.data = data; } public static int getNextId() {
return nextId; } public static void setNextId(int nextId) {
Employee12.nextId = nextId; } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getName() {
return name; } public void setName(String name) {
this.name = name; } }//建立一个Employee类 //建立一个外部类调用Employee类中的成员方法public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub Employee.setNextId(13);//不需要实例化直接用类名调用类中的方法,同时因为上面设置的属性是private类,所以 Employee e = new Employee();//实例化e e.setName("231");//调用e中的set方法,只有在实例化后才能调用 }}

有上面的例子可得出结论:

 1. 使用static关键字定义的无论是静态变量还是静态方法均可以不用通过对类实例化直接调用类去生成类内对应的方法和对象变量。
  2.静态的方法属于类,不属于任何独立的对象。所以,共享资源和互相调用是很方便的。
  3.含有static关键字的方法或者对象只被初始化一次,这后面会涉及到jvm,在jvm中它在方法区中只被允许分配一块内存。所以使用static是相当节省内存的。
 4.静态成员变量的初始化优先于非静态成员变量。


二、final关键字

   谈到final关键字,就想到String类,因为final和String都有唯一不可变的性质,实际上String类是一个final类里的其中一个部分。

   拥有final关键字的语句是具有不可更改的性质,被final关键字修饰的变量必须进行初始化,修饰的方法也不能被重写,同时,修饰的类也不能被继承。
   是不是觉得很厉害?但是很多小伙伴还是有很多问题,比如说其中一个,如果final类修饰引用类型呢?引用类型当然可能修改类的对象域中的值,那么此时final不就矛盾了吗?其实不矛盾,我们都说final修饰的类型是不可变的,只有这个是例外,但是我们都不推荐,因为是很危险的,final可以说不用在引用类型。
一、使用final修饰static
   在代码中我们都很常见就是public static final <类型> <变量名> 等,看到这一句代码时候,立刻下意识告诉自己就是存在不可修改的变量名,且希望被初始化一次,被所有调用该类的其他类共享这个变量。

public class Employee {
public static final int p = 3; } public static void main(String[] args) {
System.out.println(Employee.p); }

在这里插入图sdd1片描述

发现如果赋值这里会报错,这就是final关键字的性质了,具有唯一不变性。

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

你可能感兴趣的文章
调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇
查看>>
如何在 C# 中使用 委托
查看>>
Abp vNext 后台作业hangfire
查看>>
【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷&汪宇杰&文轩
查看>>
Dotnet Core多版本API共存的优雅实现
查看>>
如何在 ASP.NET Core Web API 中以三种方式返回数据
查看>>
开源项目葫芦藤:IdentityServer4的实现及其运用
查看>>
Abp vNext异常处理的缺陷/改造方案
查看>>
目录 | 数据结构与剑指Offer系列推文合集
查看>>
在 Windows 服务中托管 ASP.NET Core
查看>>
新鲜高频笔面试题分享,Redis、MongoDB、ElasticSearch...
查看>>
如何在 C# 中使用 const,readonly,static
查看>>
[Stardust]星尘分布式全链路监控
查看>>
.NET SDK-Style 项目(Core、Standard、.NET5)中的版本号
查看>>
如何在 C# 中使用 Buffer
查看>>
大学班里80%都去培训班,为什么我没去
查看>>
Beetlex之websocket/tls服务压测工具
查看>>
Abp小试牛刀之 图片上传
查看>>
使用Select.HtmlToPdf 把html内容生成pdf文件
查看>>
叮咚!你有一份来自明源云的圣诞邀约
查看>>