1.static定义属性
对于一个类的主要组成就是属性和方法,每一个对象都分别拥有各自的属性内容,如果类中的某个属性希望定义为公共属性(即所有对象都能使用的属性),则可以在声明属性前加上static关键字
例.定义程序
public class TestStatic {
public static void main(String args[]){
Bookb ba = new Bookb("java开发",10.2);
Bookb bb = new Bookb("Android开发",11.3);
Bookb bc = new Bookb("Oracle开发",15.5);
ba.pub = "北京大学出版社"; //修改了一个属性的内容
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
System.out.println(bc.getInfo());
}
}
class Bookb{
private String title;
private double price;
static String pub = "清华大学出版社"; //定义一个描述出版社信息的属性,为操作方便,暂不封装
public Bookb(String title,double price){
this.title = title;
this.price = price;
}
public String getInfo(){
return "图书名称:" + this.title + "; 价格:" + this.price + "; 出版社:" + pub;
}
}
图书名称:java开发; 价格:10.2; 出版社:北京大学出版社
图书名称:Android开发; 价格:11.3; 出版社:北京大学出版社
图书名称:Oracle开发; 价格:15.5; 出版社:北京大学出版社
对于本例中提供的static公共属性,任何一个对象修改了此属性的内容都将影响其他对象,因此修改static属性最好的方法就是利用一个公共代表去访问,这个公共代表就是类
Bookb.pub = "北京大学出版社"
static属性和非static属性最大的区别就是所有的非static属性必须产生实例化对象才可以访问,但是static属性不受实例化对象的控制
例.在没有实例化对象产生时直接操作static属性
public class TestDemo {
public static void main(String args[]){
System.out.println(Book.pub); //不用实例化对象的情况下直接输出属性内容
Book.pub = "北京大学出版社"; //修改了一个属性的内容
Book ba = new Book("Java开发",25.3);
System.out.println(ba.getInfo());
}
}
清华大学出版社
图书名称:Java开发; 价格:25.3; 出版社:北京大学出版社
2.static定义方法
显然,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用
例.使用static定义方法
public class TestDemo {
public static void main(String args[]){
Book.setPub("北京大学出版社"); //修改了一个属性的内容
Book ba = new Book("Java开发",25.3);
Book bb = new Book("Android",26.6);
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
}
}
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){
pub = p; //定义static方法可以由类名称直接调用
}
public String getInfo(){
return "图书名称:" + this.title + "; 价格:" + this.price + "; 出版社:" + pub;
}
}
图书名称:Java开发; 价格:25.3; 出版社:北京大学出版社
图书名称:Android; 价格:26.6; 出版社:北京大学出版社
本程序对Book类中的pub属性继续封装,因此专门定义一个setPub的static方法,这样就可以通过类名称直接调用setPub()方法来修改pub属性内容
但是会出现一个问题:此时类中的方法就变为static方法和非static方法两组,这两组方法间的访问也将受到如下限制:
- static方法不能直接访问非static属性或方法,只能调用static属性或方法
- 非static方法可以访问static属性或方法,不受任何限制
补充:关于主方法的操作问题:
如果一个方法定义在主类中,并且直接由主方法调用时,需要添加static关键字,代码如下:
public class TestDemo{
public static void main(String args[]){
fun(); //static方法调用static方法
}
public static void fun(){ //static定义的方法
System.out.println("HEllo World!");
}
由于主方法存在static声明,所以主方法就是一个static方法,而static方法只能调用static声明的方法,在定义fun()时就必须使用static关键字
如果此时fun()取消了static,就变为一个非static方法。所有的非static方法必须由对象调用,即static方法要调用非static操作,必须首先要产生对象,代码如下:
public class TestDemo{
public static void main(String args[]){
new TestDemo().fun(); //对象调用方法
}
public void fun(){ //非static定义的方法
System.out.println("HEllo World!");
}
3.主方法
- public:主方法是程序的开始,因此这个方法对任何操作都是可见的;
- static:证明此方法由类名称调用;
- void:主方法是一切执行的开始点,既然是开头,就不能回头,直到执行完毕为止;
- main:是一个系统规定好的方法名称,不能修改;
- String args[]:指程序运行时传递的参数,格式为:Java类名称 参数 参数 参数
例.得到参数(javac -encoding utf-8 TestDemo.java)
public class TestDemo{
public static void main(String [] args){
for(int x=0;x<args.length;x++){
System.out.println(args[x]);
}
}
}
>>java TestDemo yootk mldn
yootk
mldn
4.static的实际应用
static关键字具备如下特点:
- 无论有多少个对象,都使用同一个static属性;
- 使用static方法可以避免实例化对象调用方法的限制;
功能一:实现类实例化对象个数的统计
每当实例化一个类对象时都可以打印一个信息:产生第x个实例化对象
只要是新的实例化对象产生了,就一定会调用类中的构造方法,因此可以在构造方法中增加一个统计数据的操作,每当新对象产生后统计的内容就自增一个
public class TestDemo{
public static void main(String [] args){
new Book();new Book();new Book();
new Book();new Book();new Book();
}
}
class Book{
private static int num = 0;
public Book(){
num++;
System.out.println("这是第" + num + "个产生的对象");
}
}
这是第1个产生的对象
这是第2个产生的对象
这是第3个产生的对象
这是第4个产生的对象
这是第5个产生的对象
这是第6个产生的对象
注:此处只能实现个数增加,后续将学习实例化对象个数减少的操作
功能二:实现属性的自动设置
例如,某一个类有一个无参构造方法,一个有参构造方法。有参构造的目的主要是传递一个title属性,但是希望不管调用的是无参还是有参的构造方法,都可以为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());
}
}
class Book{
private String title;
private static int num = 0;
public Book(){
this("NOTITLE-" + num++);
}
public Book(String title){
this.title = title;
}
public String getTitle(){
return this.title;
}
}
java
NOTITLE-0
NOTITLE-1
本程序提供两个构造方法,如果调用有参构造方法则会将指定的内容赋值给title属性,而如果调用无参构造方法,title属性会采用自动命名的方式配置