-
static定义属性
一个类的主要组成是属性和方法(分为普通方法和构造方法),而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在不同的堆内存中),如果类中的某个属性希望定义为公共属性(所有对象都可以使用的属性),则可以在声明属性前面加上static关键字
package oop; /** * static定义属性 */ class Book2{ private String title;//普通属性 private double price;//普通属性 static String pub="清华大学出版社";//定义一个描述出版社的属性,为操作方便。暂不封装 //定义构造方法 //无参 public Book2() { } //有参 public Book2(String title, double price) { this.title = title; this.price = price; } //定义get和set方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //定义输出方法 public String getInfo(){ return "书名"+this.title+"价格"+this.price+"出版社"+this.pub; } } //定义测试类 public class TestDemo { public static void main(String[] args) { Book2 a=new Book2("java",78);//实现实例化对象 a.pub="北京大学出版社"; System.out.println(a.getInfo()); } }
本程序在定义Book2类的时候提供了一个static属性,而这个属性将成为公共属性,也就是说有任何一个对象修改了此属性的内容都将影响其他对象
常用内存区域:在Java中主要存在4块内存空间,这些内存空间的名称及作用如下:
-
栈内存空间:保存所有的对象名称(更准确的说是保存引用的堆内存空间的地址)
-
堆内存空间:保存每个对象的具体属性内容
-
全局数据区 :保存static类型的属性
-
全局代码区:保存所有的方法定义
static定义的属性是可以由类名称直接调用的:
Book.pub="北京大学出版社";
static属性和非static属性还有一个最大的区别,所有的非static属性必须产生实例化对象才可以访问,但是static属性不受实例化对象的控制,也就是说,在没有实例化对象产生的情况下,依然可以使用static属性
-
-
static定义方法
在定义类的普通方法时可以使用static进行定义,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用
package oop; /** * static定义方法 */ class Book3{ private String title;//定义属性 private double price;//定义属性 private static String pub="清华大学出版社";//定义一个描述出版社的属性 //定义构造方法 //无参 public Book3() { } //有参 public Book3(String title, double price) { this.title = title; this.price = price; } //定义get 和set的方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //定义static方法可以由类名称直接调用 public static void setPub(String p){ pub=p; } //定义一个输出的方法 public String getInfo(){ return "书名"+this.title+"价格"+this.price+"出版社"+this.pub; } } public class TestDemo { public static void main(String[] args) { Book3.setPub("北京大学出版社");//在没有对象产生的时候调用 //实例化对象 Book3 b=new Book3("java",89); System.out.println(b.getInfo()); } }
static定义的属性和方法都不收实例化对象的控制,也就是说都属于独立类的功能
static方法和非static方法将会受到如下限制:
-
static方法不能直接访问非static属性和方法,只能调用static属性和方法
-
非static方法可以访问static的属性和方法,不受任何限制
关于static方法访问限制的说明:
-
所有的非static方法的结构,必须在类已经明确产生实例化对象时才会分配堆内存空间,才可以使用
-
所有的static方法的结构,不受实例化对象的控制,即可以在没有实例化对象的时候访问
不保存普通属性时定义static方法:产生实例化对象是因为在堆内存中可以保存属性信息,所有如果一个类没有属性生成,就自然也没有必要去开辟堆内存保存属性内容了
-
-
-
主方法
-
public:主方法是程序的开始,所以这个方法对任何操作都是一定可见的,既然可见就必须使用public (公共)
-
static:证明此方法由类名调用
-
void:主方法是一切执行的开始点,既然是所有的开头,就不能回头,直到执行完毕为止
-
main:是一个系统规定好的方法名称,不能修改、
-
String args[]:指的是程序运行时传递的参数,格式为:"java 类名称 参数 参数 参数"
如果要为程序运行输入参数,只需要在执行是配置即可,不同参数之间使用空格隔离,而如果配置的参数本身包含空格,则可以使用" “ "声明,例如java TestDemo "Hello ghhu" "Hello dhu"
-
-
static的实际应用
static关键字具备以下特点:
-
不管有多少个对象,都使用同一个static属性
-
使用static方法可以避免实例化对象调用方法的限制
package oop; /** * 实现属性的自动设置 */ class Book4{ private String title; private static int num=0; //定义构造方法 public Book4() { this("书名"+ num++); } public Book4(String title) { this.title = title; } //定义get和set public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } public class TestDemo04 { public static void main(String[] args) { System.out.println(new Book4("java").getTitle()); System.out.println(new Book4().getTitle()); System.out.println(new Book4().getTitle()); } }
-