一,static的介绍以及基本使用
问题1:
如果现在在测试类中调用了许多学生类,里面有姓名,年龄,教室,但他们的教室都需要更改,现在该怎么办?
定义static关键字
1.概述:static是一个静态关键字
2.使用:
a.修饰一个成员变量:
static 数据类型 变量名
b.修饰一个方法:
修饰符 static 返回值类型 方法名(形参){
方法体
return 结果
}
3.调用静态成员:
类名直接调用(不用new对象)
4.静态成员特点:
a.静态成员属于类成员,不属于对象成员(非静态的成员属于对象成员)
b.静态成员会随着类的加载而加载
c.静态成员优先于非静态成员存在在内存中
d.凡是根据静态成员所在的类创建出来的对象,都可以共享这个静态成员
示例,学生类
public class Student {
String name;
int age;
static String classroom;
}
测试类
public class test {
public static void main(String[] args) {
Student.classroom = "561";
//静态赋值,直接调用
Student student = new Student();
student.name = "张三";
student.age = 23;
System.out.println(student.age+"........"+student.name+"........."+Student.classroom);
Student student1 = new Student();
student.name = "李四";
student.age = 43;
System.out.println(student.age+"........"+student.name+"........."+Student.classroom);
}
}
静态赋值主要用在公用数据中,方便任何类的调用,它与类和栈是同时产生同时消失的,因此没有内存浪费,在之前的jdk中静态关键字在堆中,但在后续版本改为在类和栈中,所以idea版本的不同并不代表会有新的功能或方法,更多的是对内存的优化和方法的调用改变
二,static修饰成员的访问特点
1.在静态方法中能直接访问非静态成员嘛? 不能
想要调用的话:new对象调用
演示
创建Person类
public class Person {
public void eat(){
System.out.println("ganfan");
}
}
创建测试类
public class test {
public static void main(String[] args) {
//静态成员中访问非静态成员
Person person = new Person();
person.eat();
test test = new test();
test.method03();
}
public static void method01(){
}
public static void method02(){
}
public void method03(){
}
}
不管是不是在一个类中,都需要new一片空间出来,再调用
2.在非静态方法中能直接访问静态成员嘛? 能
a.同类:
直接调用
类名调用
public class test {
public static void main(String[] args) {
//静态成员中访问非静态成员
Person person = new Person();
person.eat();
test test = new test();
test.method03();
}
public static void method01(){
}
public static void method02(){
}
public void method03(){
//同类中非静态成员访问静态成员
method01();
method02();
test.method01();
test.method02();
}
}
b.不同类:
类名调用
给Person类加一个静态方法
public class Person {
public void eat(){
System.out.println("ganfan");
}
public static void drink(){
System.out.println("heshui");
}
}
然后在test类里面的method3方法里调用
public void method03(){
//同类中非静态成员访问静态成员
method01();
method02();
test.method01();
test.method02();
//不同类中非静态成员访问静态成员
Person.drink();
}
3.在静态方法中能直接访问静态成员嘛?能
a.同类:
直接调用
类名调用
public static void method01(){
//同类静态成员中访问静态成员
method02();
test.method02();
}
b.不同类:
类名调用
public static void method01(){
//同类静态成员中访问静态成员
method02();
test.method02();
//不同类静态成员中访问静态成员
Person.drink();
}
4.在非静态方法中能直接访问非静态成员嘛?能
a.同类:
直接调用
new对象调用
public void method04(){
//同类中非静态成员访问非静态成员
method03();
test test = new test();
test.method03();
}
b.不同类:
new对象调用
public void method04(){
//同类中非静态成员访问非静态成员
method03();
test test = new test();
test.method03();
//不同类中非静态成员访问非静态成员
Person person = new Person();
person.eat();
}
总结:
1.不管在不在同一个类中,非静态成员都可以new对象调用
2.不管在不在同一个类中,静态成员都可以类名调用
问题2:
既然static成员那么好使(类名直接调用),那么我们在实际开发中,能不能将所有的成员都定义成静态的呢?
不能
原因:由于静态成员会随着类的加载而加载,如果将所有的成员都变成静态的,那么类一加载,静态成员都会进内存,会大量占用内存空间
问题2:那么静态成员都啥时候定义呢?
一般情况下,我们在抽取工具类的时候可以将工具类中的所有成员都定义成静态的
问题3:啥时候定义工具类?
比如我们在写代码的过程中,发现有的功能在反复实现,代码一样,功能一样,此时就可以抽取出来,形成工具类
示例
创建ArraysUtils类
public class ArraysUtils {
/*
构造方法用private修饰
工具类中的成员都是静态的,静态成员都是类名调用,不需要new对象
所以工具类中的构造方法都是用private修饰
如果构造方法被private修饰,那么在别的类中,就不能利用构造方法new对象
*/
private ArraysUtils(){
}
//定义一个方法,实现获取int数组最大值
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max<arr[i]){
max = arr[i];
}
}
return max;
}
}
test类
public class Test01 {
public static void main(String[] args) {
int[] arr = {5,3,4,6,7,54,8};
int max = ArraysUtils.getMax(arr);
System.out.println("max = " + max);
}
}
public class Test02 {
public static void main(String[] args) {
int[] arr = {5,4,5,7,8,9};
int max = ArraysUtils.getMax(arr);
System.out.println("max = " + max);
}
}
获取数组最大值这个方法一直需要被test调用,所以设置为静态方法,与类同时生成,方便调用
标签:Java,--,成员,静态,static,void,test,public From: https://blog.csdn.net/THRUSTER11111/article/details/143757057