第五章 高级特性2
关键字static
和对象无关的属性叫做类属性
类属性作为该类各个对象之间共享的变量。在设计类时,
分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法
类方法
和对象无关的方法叫做类方法
如果方法与调用者无关,则这样的方法通常被声明为类方法,
由于不需要创建对象就可以调用类方法,从而简化了方法的调用
使用范围
在Java类中,可用static修饰属性、方法、代码块、内部类
static修饰特点
被修饰后的成员具备以下特点:
static可以修饰属性, 方法, 语句块, 内部类.
随着类的加载而加载, 因为静态成员隶属于类
优先于对象的存在而存在
被所有对象所共享
在其他类中可以直接通过类访问静态成员, 不需要创建对象.
静态属性
静态属性, 也称为类属性. 隶属于类. 会被所有对象共享, 在内存中的永久区的类模板中
非静态属性
类的成员属性
静态方法
静态方法, 也称为类方法, 和调用者无关, 调用不需要对象, 只通过类即可调用.
非静态方法
类的成员方法
静态
它的存在是确定的, 一份的. 类模板
非静态
它的存在是不确定的, 只要有new一个对象, 它的存在就会产生一套新的, 多份的.
工具方法
只需要通过类就能调用的静态方法. Math.random(), Integer.parseInt()
工具类
所有的方法都是工具方法的类就是工具类. 比如 Math. Arrays.....
静态环境和非静态环境
静态环境中可以直接访问非静态成员吗? 非静态环境中可以访问静态成员吗? 各自的原因是什么?
非静态环境中可以直接访问静态成员, 因为对象共享类模板.
静态环境不可以直接访问非静态成员, 因为非静态成员必须 要隶属于某个对象.
或者可以先创建对象, 再通过对象来访问非静态成员.
/**
*
* 静态 : 它的存在是确定的, 一份的. 类模板
* 非静态 : 它的存在是不确定的, 只要有new一个对象, 它的存在就会产生一套新的, 多份的.
*
* 类属性作为该类各个对象之间共享的变量。在设计类时,
* 分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
*
* 如果方法与调用者无关,则这样的方法通常被声明为类方法,
* 由于不需要创建对象就可以调用类方法,从而简化了方法的调用
*
* 使用范围:
* 在Java类中,可用static修饰属性、方法、代码块、内部类
*
* 被修饰后的成员具备以下特点:
* 随着类的加载而加载, 因为它存在于类模板中
* 优先于对象存在, 创建对象前先必须加载类
* 修饰的成员,被所有对象所共享, 因为所有对象都能找到它的对应的类模板
* 访问权限允许时,可不创建对象,直接被类调用
*
*工具方法
*
* 构造器不可以被static修饰, 因为构造器是为对象初始化, 是绝对的非静态概念.
*
* 非静态环境中可以直接访问静态成员, 原因是在非静态环境中, 也就是和对象相关的概念中, 类模板早已处理好.
* 在静态环境中却不可以直接访问非静态成员!! 因为静态方法没有调用者对象, 所以不可以使用this和super关键字
* 可以通过创建一个对象, 再通过这个对象来访问
*/
public class Employee {
// 静态属性, 也称为类属性. 隶属于类. 会被所有对象共享, 在内存中的永久区的类模板中
public static String company = "atguigu";
private static int total = 1;
// emp是什么? 是静态的类属性, 在永久区中. emp中保存了对象在GC区中的地址
// 而emp永远不消失, 它指向的对象永远不会变垃圾!!!
private static Employee emp = new Employee();
// 静态方法, 也称为类方法, 和调用者无关, 调用不需要对象, 只通过类即可调用.
public static void test1() {
System.out.println(company);
System.out.println("static test1()...");
}
public static void test2() {
// 直接访问非静态成员不可以, 原因是此方法没有调用者对象的概念.
/*
this.id = 100;
this.name = "某员工";
this.age = 20;
this.salary = 5000;
System.out.println(super.hashCode());
*/
emp.id = 100;
emp.name = "某员工";
emp.age = 20;
emp.salary = 5000;
System.out.println(emp);
System.out.println("static test2()...");
}
// 非静态属性, 也称为对象属性, 在内存中的GC区中的对象内部.
private int id; // 表示员工号, 自动生成.
private String name;
private int age;
private double salary;
public Employee() {}
public Employee(String name, int age, double salary) {
this.id = total++; // 自动生成!!
this.name = name;
this.age = age;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {