static主要作用
-
常见定义结构:public static void main();
-
static关键字可以用于定义属性及方法;
static定义属性
在一个类之中,主要的组成就是属性和方法(分为构造方法与普通方法两种),而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在不同的堆内存之中)
如果现在类中的某个属性希望定义为公共属性(所有对象都可以使用的属性)则可以在声明属性前加上static关键字。
范例:定义程序
class Book { // 描述的是同一个出版社的信息
private String title ; // 普通属性
private double price ; // 普通属性
static String pub = "清华大学出版社" ; // 定义一个描述出版社信息的属性,为操作方便,暂不封装
public Book(String title,double price) {
this.title = title ;
this.price = price ;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:" + this.pub ;
}
}
public class TestDemo {
public static void main(String args[]) {
Book ba = new Book("Java开发",10.2) ; // 实例化Book类对象
Book bb = new Book("android开发",11.2) ; // 实例化Book类对象
Book bc = new Book("Oracle开发",12.2) ; // 实例化Book类对象
ba.pub = "北京大学出版社" ; // 修改了一个属性的内容
System.out.println(ba.getInfo()) ;
System.out.println(bb.getInfo()) ;
System.out.println(bc.getInfo()) ;
}
}
程序执行结果:
图书名称:Java开发,价格:10.2,出版社:北京大学出版社
图书名称:Android开发,价格:11.2,出版社:北京大学出版社
图书名称:Oracle开发,价格:12.2,出版社:北京大学出版社
static属性保存
static是一个公共属性的概念,那么如果只是简单的由一个对象去修改static属性的做法很不合适,那么最好的做法是由所有对象的公共的代表来进行访问,那么就是类,所以来讲利用static定义的属性是可以由类名称直接调用的。
Book.pub = "北京大学出版社" ;
范例:在没有实例化对象产生时直接操作static属性
public class TestDemo {
public static void main(String args[]) {
System.out.println(Book.pub) ; // 在没有实例化对象的情况下直接输出属性内容
Book.pub = "北京大学出版社" ; // 修改static属性内容
Book ba = new Book("Java开发",10.9) ; // 实例化Book类对象
System.out.println(ba.getInfo()) ; // 输出Book类对象信息
}
}
程序执行结果:
清华大学出版社
图书名称:Java开发,价格:10.9,出版社:北京大学出版社
static定义方法
在定义类的普通方法时也可以使用static进行定义,那么很明显,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用。
范例:使用static定义方法
class Book { // 描述的是同一个出版社的信息
private String title ;
private double price ;
private static String pub = "清华大学出版社" // 定义一个描述出版社信息的属性
public Book(String title,double price) {
this.title = title ;
this.price = price ;
}
public static void setPub(String p) { // 定义static方法可以由类名称直接调用
pub = p ;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:" + this.pub ;
}
}
public class TestDemo {
public static void main(String args[]) {
Book.setPub("北京大学出版社") ; // 在没有对象产生的时候进行调用
Book ba = new Book("Java开发",10.2) ; // 实例化Book类对象
Book bb = new Book("Android开发",11.2) ;// 实例化Book类对象
Book bc = new Book("Oracle开发",12.2) ;// 实例化Book类对象
System.out.println(ba.getInfo()) ;
System.out.println(bb.getInfo()) ;
System.out.println(bc.getInfo()) ;
}
}
程序执行结果:
图书名称:Java开发,价格:10.2,出版社:北京大学出版社
图书名称:Android开发,价格:11.2,出版社:北京大学出版社
图书名称:Oracle开发,价格:12.2,出版社:北京大学出版社
范例:使用static定义方法
class Book { // 描述的是同一个出版社的信息
private String title ;
private double price ;
private static String pub = "清华大学出版社" // 定义一个描述出版社信息的属性
public Book(String title,double price) {
this.title = title ;
this.price = price ;
}
public static void setPub(String p) { // 定义static方法可以由类名称直接调用
pub = p ;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:" + this.pub ;
}
}
public class TestDemo {
public static void main(String args[]) {
Book.setPub("北京大学出版社") ; // 在没有对象产生的时候进行调用
Book ba = new Book("Java开发",10.2) ; // 实例化Book类对象
Book bb = new Book("Android开发",11.2) ;// 实例化Book类对象
Book bc = new Book("Oracle开发",12.2) ;// 实例化Book类对象
System.out.println(ba.getInfo()) ;
System.out.println(bb.getInfo()) ;
System.out.println(bc.getInfo()) ;
}
}
程序执行结果:
图书名称:Java开发,价格:10.2,出版社:北京大学出版社
图书名称:Android开发,价格:11.2,出版社:北京大学出版社
图书名称:Oracle开发,价格:12.2,出版社:北京大学出版社
static方法限制
类中的方法有两组:
- static方法
- 非static方法
这两组件方法间访问也将受到限制:
- static方法不能够直接访问非static属性或者是方法,只能够调用static属性或方法;
- 非static方法可以访问static的属性或者是方法,不受任何的限制;
主方法
Java语言最大的特点可能就在于主方法上了,因为在Java中的主方法的组成单元许多,下面来观察一下每一个组成单元的含义:
- public:主方法是程序的开始,所以这个方法对任何的操作都一定是可见的,那么既然是可见的就必须使用public(公共)。
- static:证明此方法是由类名称调用的;
- void:主方法是一切的执行的开始点,既然是所有的开头,那么就不能够回头,执行完毕为止;
- main:是一个系统规定好的方法名称,不能够修改;
- String args[]:指的程序运行的时候传递的参数,格式为:“java 类名称 参数 参数 参数”;
功能一:实现类实例化对象个数的统计
class Book {
private static int num = 0; // 保存统计个数
public Book() { // 只要是新对象实例化就执行此构造
num++; // 保存个数自增
System.out.println("这是第" + num + "个产生的对象!");
}
}
public class TestDemo {
public static void main(String args[]) {
new Book(); new Book(); new Book();
new Book(); new Book(); new Book();
}
}
程序执行结果:
这是第1个产生的对象!
这是第2个产生的对象!
这是第3个产生的对象!
这是第4个产生的对象!
这是第5个产生的对象!
这是第6个产生的对象!
功能二:实现属性的自动设置
class Book {
private String title ; // title属性
private static int num = 0 ; // 自动命名索引号
public Book() { // 没有设置title属性内容
this("NOTITLE - " + num ++) ; // 自动命名
}
public Book(String title){ // 设置title属性内容
this.title = title ;
}
public String getTitle() {
return this.title ;
}
}
public class TestDemo {
public static void main(String args[]) {
System.out.println(new Book("Java").getTitle()) ;
System.out.println(new Book().getTitle()) ;
System.out.println(new Book().getTitle()) ;
}
}
程序执行结果:
Java
NOTITLE - 0
NOTITLE - 1