关键字 static 静态的
一、 静态的属性: 只有"一份"(相当于全局变量)
1) 是属于类的属性
2) 使用类名方访问(在本类中可以省略)
3) 是在类的加载期间分配, 在方法区中分配
4) 静态属性在软件运行期间只有"一份"
package day04;
/**
* 静态的属性: 只有"一份"(相当于全局变量)
1) 是属于类的属性
2) 使用类名方访问(在本类中可以省略)
3) 是在类的加载期间分配, 在方法区中分配
4) 静态属性在软件运行期间只有"一份"
*/
public class Demo01 {
public static void main(String[] args) {
Cat tom = new Cat(5);
Cat kitty = new Cat(3);
System.out.println(tom.age+","+kitty.age);
System.out.println(Cat.numOfCats);
}
}
class Cat{
int age;//实例变量, 每个对象都有一份
static int numOfCats;//猫的数量,全体猫类型共享一个变量
public Cat(int age) {
this.age = age;
Cat.numOfCats++;
}
}
二、静态的方法
1) 是属于类的方法
2) 使用类名直接调用, 在本类中可以省略类名
3) 静态方法中"没有" 隐含参数this(super) //与普通方法最大的差别
3.1 静态方法不能访问当前对象(this)的属性和方法
4) 静态方法经常用于工具方法和工厂方法
5) 静态方法与普通方法最大的差别就是this ,与当前对象无关的方法, 使用静态方法
6) 类的静态变量和方法存放在方法区
package day04;
/**
* 静态方法
1) 是属于类的方法
2) 使用类名直接调用, 在本类中可以省略类名
3) 静态方法中"没有" 隐含参数this(super)
3.1 静态方法不能访问当前对象(this)的属性和方法
4) 静态方法经常用于工具方法和工厂方法
与当前对象无关的方法, 使用静态方法
*/
public class Demo02 {
public static void main(String[] args) {
Point p1=new Point(3,4);
Point p2=new Point(6,8);
System.out.println(p1.distance(p2));//5
System.out.println(Point.distance(p1, p2));//5
}
}
class Point{
int x; int y;
public Point(int x, int y) {this.x=x; this.y=y;}
/** 计算当前(this)点到另外(other)一点的距离 */
public double distance(/*Point this*/Point other){
int a = this.x-other.x;int b=this.y-other.y;
return Math.sqrt(a*a + b*b);
}
/** 计算两点(p1, p2)间的距离 */
public static double distance(Point p1,Point p2){
int a=p1.x-p2.x; int b=p1.y-p2.y;
return Math.sqrt(a*a + b*b);
}
}
工具方法:
Arrays.toString() Arrays.sort()
Integer.toHexString()
三、代码块和静态代码块
代码块: 是在创建对象期间执行的代码块。类似构造器,一般使用构造器代替代码块的功能。
静态代码块: 在类加载期间执行的代码块, 只执行一次。有时候用于加载一次性资源, 如:背景图片
package day04;
/**
* 代码块: 是在创建对象期间执行的代码块
* 静态代码块: 在类加载期间执行的代码块, 只执行一次
* 静态代码块: 有时候用于加载一次性资源, 如:背景图片
*/
public class Demo03 {
public static void main(String[] args) {
new Koo();
new Koo();
}
}
class Koo{
//System.out.println("HI");//编译错误,类中不能写语句
{int a=8; System.out.println("HI"+a);}//代码块
static{System.out.println("LoadKoo()");}//静态代码块
}