通过之前对 JAVA基础 —— 面向对象 以及 JAVA基础 —— 面向对象内存图 的学习。
接下来我们将会进一步学习面向对象进阶的相关知识点。
static | JAVA基础 (面向对象进阶)—— Static |
继承 | JAVA基础 (面向对象进阶)—— 继承 |
多态 | JAVA基础 (面向对象进阶)—— 多态 |
包、final、权限修饰符、代码块、抽象类和抽象方法方法 | JAVA基础(面向对象进阶) —— 包、final、权限修饰符、代码块、抽象类和抽象方法方法 |
接口 | JAVA基础 (面向对象进阶)—— 接口 |
内部类 | JAVA基础 (面向对象进阶)—— 内部类 |
目录
一、 场景引用
// Student.java
public class Student {
//学生属性:姓名、年龄、性别
//新增:老师姓名
private String name;
private int age;
private String gender;
//public 公共属性
//修饰符static student所有对象共享一个teacherName属性
public static String teacherNanme;
public Student() {}
public Student(String name,int age,String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void show() {
System.out.println(name + "," + age + "," + gender + ","+ teacherNanme);
}
public void study() {
System.out.println(name + "正在学习");
}
}
//StudentTest.java
public class StudentTest {
public static void main(String[] args) {
//创建第一个学生对象
Student s1 = new Student();
s1.setName("张三");
s1.setAge(23);
s1.setGender("男");
s1.teacherNanme = "老师";
s1.study();
s1.show();
//创建第二个学生对象
Student s2 = new Student();
s2.setName("李四");
s2.setAge(24);
s2.setGender("男");
s2.study();
s2.show();
}
}
引用static之前 | 引用static之后 |
![]() | ![]() |
二、 静态概述
static表示静态,是Java中的一个修饰符,可以修饰成员方法、成员变量。
- 被static修饰的成员变量,叫做静态变量。
- 被static修饰的成员方法,叫做静态方法。
特点 调用方法 静态变量 被该类所有对象共享
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
- 多用在测试类和工具类中
- JavaBean类中很少会用
静态方法 类名调用(推荐)、对象名调用 类名调用(推荐)、对象名调用
2.1 Static内存图
![]() | ![]() |
![]() |
2.3 静态定义练习
需求: 请说出以下属性是否可以被定义为静态
三、 工具类
概念:帮助我们做一些事情的,但是不描述任何事物的类。
注意:类名见名知意、私有化构造方法
目前,我们已知的三大类:
Javabean类 用来描述一类事物的类。比如,Student、Teacher、Dog、Cat等。 测试类 用来检查其他类是否书写正确,带有main方法的类,是程序的入口。 工具类 不是用来描述一类事物的,而是帮我们做一些事情的类。
3.1 练习:定义数组工具类
需求:在实际开发中,经常会遇到一些数组使用的工具类。
请按照如下要求编写一个数组的工具类: ArrayUtil
- 提供一个工具类方法printArr, 用于返回整数数组的内容。
返回的字符串格式如: [10, 20, 50, 34, 100] (只考虑整数数组,且只考虑一维数组)
- 提供这样一个工具方法getAerage,用于返回平均分。(只考虑浮 点型数组,且只考虑一维数组)
- 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。
// ArrayUtil.java
public class ArrayUtil {
//私有化构造方法
//目的:为了不让外界创建他的对象
private ArrayUtil() {}
//需要定义为静态,方便实用
public static String printArr(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(",");
}
}
sb.append("]");
return sb.toString();
}
public static double getAverage(double[] arr) {
double sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum+ arr[i];
}
return sum + arr.length;
}
}
//TestDemo.java
public class TestDemo {
public static void main(String[] args) {
//测试工具类
int[ ] arr1 = {10, 20, 50, 34, 100};
String arr = ArrayUtil.printArr(arr1);
System.out.println(arr);
double[] arr2 = {10, 20, 50, 34, 100};
double avg = ArrayUtil.getAverage(arr2);
System.out.println(avg);
}
}
运行结果:
四、 static的注意事项
- 静态方法只能访问静态变量和静态方法
- 非静态方法可以访问静态变量或静态方法,也可以访问非静态的成员变量和非静态的成员方法
- 静态方法中是没有this关键字
总结:
静态方法中,只能访问静态 非静态方法可以访问所有 静态方法中没有this关键字
public class Student {
String name;
int age;
static String teacherName;
//this:表示当前方法调用者的地址值
//这个this:是有虚拟机赋值的
public void show1()(Student this){
System.out.println("this" + this);
System.out.println(this.name + "," + this.age +
", " + this.teacherName);
//调用其他方法
this.show2();
//非静态调用静态
method();
}
public void show2() {
System.out.println("show2");
}
public static void method() {
//报错:静态里面没this
System.out.println(this.name);
this.show1();
//共享的 与某一个变量没有关系
//所以没有this关键字
System.out.println("静态方法");
}
}