面向对象进阶
static
static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。
静态变量
特点:
- 被该类所有对象共享
- 跟对象无关,随着类的加载而加载,优先于对象存在
调用方式:
- 类名调用(推荐)
- 对象名调用
public class Student { // 属性:姓名 年龄 性别 private String name; private int age; private String gender; // 新增:老师的姓名 public static String teacherName; }
public class StudentTest { public static void main(String[] args) { // 设置公共老师名称 Student.teacherName = "阿玮老师";//类名调用 // 1.创建第一个学生对象 Student s1 = new Student(); // s1.teacherName "阿玮老师"; // 2.创建第二个学生对象 Student s2 = new Student(); // s2.teacherName = "阿玮老师"; s1.teacherName = "666";//对象名调用 //s2.teacherName的值也会跟着一起修改为666 } }
static的内存图
在堆内存中存在一个静态区(在java8之前是在方法区中)
静态变量随类加载立即初始化(JVM类加载阶段,在new之前,会先赋值为数据的默认值)
静态方法
静态方法更像是java的一种约束与规范,通过该规范,Java 区分了“类级别(class‑level)”与“实例级别(instance‑level)”的成员,保证了编译期类型安全与成员访问的一致性
特点:
- 多用在测试类和工具类中
- Javabean类中很少会用
调用方式:
- 类名调用(推荐)
- 对象名调用
static的注意事项
静态方法只能访问静态变量和静态方法
这两个都不行
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
静态方法中是没有this关键字
类中有一个默认的对象this,表示方法调用者的地址值,是由虚拟机赋值的
理解
补充说明(方法的调用)
对象的对象头中有一个指向其在方法区中对应类的指针,我们可以通过这个指针找到虚方法表,再通过虚方法表中存的地址来执行方法
重新认识main函数
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
方法签名解析
public 被JVM调用,访问权限足够大
static 被JVM调用,不用创建对象,直接类名访问,因为main方法是静态的,所以测试类中其他方法也需要是静态的
void 被JVM调用,不需要给JVM返回值
main 一个通用的名称,虽然不是关键字,但是被JVM识别
String[] args 以前用于接收键盘录入数据的,现在没用