Java最新静态关键字及其在Java中的用法(Peter)(1),Java社招最全面试题

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public class Student {

private String name; // Object variable
private int age; // Object variable
private String studentId; // Object variable
private static int numberOfStudents = 0; // Class variable

public Student(String name, int age, String studentId) {

this.name= name;
this.age= age;
this.studentId= studentId;

// Increase the number of students whenever an object is created
numberOfStudents ++;
}

public static int getNumberOfStudents () {
return numberOfStudents ;
}
}

该代码与上一Student类的区别只是一个新static方法。在第一个示例中,我们使用名称来引用public类变量numberOfStudents,但是这次我们制作了类变量private,并使用一种public static方法指向该变量。为了测试此代码,我们将使用以下代码:

package com.seckintozlu.article;

public class Program {

public static void main(String args[]) {

System.out.println("Number of students in the beginning: " + Student.getNumberOfStudents());

// Create two student object
Student student1 = new Student(“Obi-Wan Kenobi”, 19, “2010001”);
Student student2 = new Student(“Anakin Skywalker”, 16, “2010002”);

int numberOfStudents = Student.getNumberOfStudents();
System.out.println("Number of students: " + numberOfStudents);
}
}

此代码将生成以下输出:

Number of students in the beginning: 0
Number of students: 2

由于getNumberOfStudentsmethod是static,因此可以在不从Student类创建对象的情况下调用它。如果您已经有一个从Student类创建的对象,则可以使用对象引用来调用getNumberOfStudents(或任何static方法),但是建议使用类名以提高可读性。同样,在访问static变量时,我们也可以使用对象引用,但这会使您的代码可读性降低。

关于static方法要了解的最重要的事情是:我们无法引用方法中的非static元素static。如果numberOfStudents示例中的字段不是static变量,则在编译时会收到错误消息。同样,我们不能staticstatic方法内调用非方法。让我们举个例子:

package com.seckintozlu.article;

public class Student{

private String name; // Object variable
private int age; // Object variable
private String studentId; // Object variable
private static int numberOfStudents = 0; // Class variable

public Student(String name, int age, String studentId) {

this.name = name;
this.age = age;
this.studentId = studentId;

// Increase the number of students whenever an object is created
numberOfStudents++;
}

public int findNumberOfStudents() {
return numberOfStudents;
}

public static int getNumberOfStudents() {
return findNumberOfStudents();
}
}

我们增加了一个新的非static命名方法findNumberOfStudentsStudent类。它仅返回numberOfStudents变量的值。请在这里注意:我们不能staticstatic方法中引用非元素。但是这里我们做相反的事情,我们正在以完全有效static的非static方法访问字段。但是,static getNumberOfStudents方法正在尝试调用findNumberOfStudentsnot static。根据static我们刚刚提到的访问规则,这是无效的。当我们尝试编译此类时,将得到如下错误:“ Cannot make a static reference to the non-static method findNumberOfStudents() from the type Student”如果我们尝试引用一个非static字段(例如“ name”),则会收到相同的错误消息。

让我尝试解释该规则背后的原因。我们知道static变量和方法与对象无关。这意味着即使没有创建对象,我们也可以调用static方法并为static变量赋值。但是,非static元素只能在创建对象时存在。基于此,如果我们尝试staticstatic方法内部引用一个非变量,那么我们如何知道我们正在引用哪个对象的字段?那时,可能根本没有任何对象。true当我们在static方法内部调用非方法时,也会使用此语句static。因此,我们只能staticstatic方法内部引用元素。但是,我们可以引用staticstatic方法中的元素,因为static 元素已经在任何对象之前创建。

当我们在尝试调用一个非static方法时收到错误消息时static,使另一个方法也static可以工作,但这可能不是一个好主意。如果最终创建了很多static 方法,请停下来想一想是否需要使用方法static。我们将在本文结尾处对此进行说明。现在,让我们看看static关键字的另一种用法。

静态代码块

Static代码时钟用于为static变量分配初始值。这些也称为“ static初始化器”。变量加载到存储器中Static后立即执行块static。JVM保证static在为该类创建的对象之前执行代码块。

package com.seckintozlu.article;
import java.util.Random;

public class StaticInitializer {

private static int array[];
private static int length = 10;

static {

array = new int[length];
Random rnd = new Random();

for(int i=0; i < length; i++)
array[i] = rnd.nextInt(100);
}
}

查看上面的代码,我们正在创建带有随机分配值的整数数组。使用static代码块,一旦创建了“ array”变量,数组就会被随机整数填充。还有一件事,我们也无法访问代码块static内的非元素static。由于static块很少被使用,我不想进一步详细介绍。

静态导入

我们已经知道我们static使用类名引用方法。例如,在Java中,包中的Mathjava.lang充满了static方法,我们需要使用调用这些方法Math.nameOfMethod()。使用static导入,我们只能通过使用方法名称来调用它们。让我们看看它的用法:

package com.seckintozlu.article;

import static java.lang.Math.*;

public class Program {

public static void main(String args[]) {

System.out.println("Square root 25: " + sqrt(25));
System.out.println("Log(100): " + log(100));
System.out.println("Pi: " + PI);
}
}

如您在代码中所见,将staticimport放入代码中时,我们可以引用static方法和变量,而无需使用类名。通常情况下,我们会使用Math.sqrt()Math.PI如果我们没有static进口。

何时使用静态变量?

决定使用类变量或对象变量可能会使刚开始使用Java或任何其他具有“ static”功能的语言进行编程的人感到困惑。实际上,差异确实很明显。类变量(静态变量)对于该类的每个对象都是通用的,并且只有一个实例。另一方面,对象变量属于对象,其值根据对象本身而变化。在student我一开始就给出的类的第一个示例中,您可以很容易地看出,每个Student对象必须为诸如name和这样的变量具有一个单独的值studentId

另一方面,由于numberOfStudents变量保存student创建的对象数,因此它必须具有单个值。换句话说,它必须是一个static变量。我们可以将其存储为对象变量,但是在这种情况下,每个对象将具有一个单独的副本,并且当其值更改时,我们将需要更新所有它们。如您所知,这不是处理此问题的适当方法。

何时使用静态方法?

这是一个比上一个更困难的问题。在面向对象的编程语言中,对象具有行为和状态。我们拥有的变量指定状态,方法表示行为。如果方法取决于对象的状态,或者受对象的状态影响,则该方法必须是对象方法(非static)。如果它完全独立于状态,换句话说,如果对象的状态不影响方法将生成的结果,则可以将其定义为static方法。

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值