static关键字
1.static声明属性与方法的特点
2.static操作的基本形式以及应用
static定义属性
在一个类之中,主要的组成就是属性和方法(分为构造方法与普通方法两种),而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在不同的堆内存之中),如果现在类中的某个属性希望定义为公共属性(所有对象都可以使用的属性)则可以在声明属性前加上static关键字。
创建一个简单的类,然后定义一个非私有类,在main函数中发现b1.sex可以对单个的属性进行修改。同时如果要进行多次修改,就可以找到一个代表代替他们,于是可以使用类,如Book.sex=“女”,这样进行多数的修改,这样的好处是无论有没有修改类中的属性,此方法都可以对static定义的属性进行修改。
class Book{
private int id;
private String name;
static String sex = "男";
public Book(int id, String name) {
super();
this.id = id;
this.name = name;
}
public boolean compare(Book book){
if(this == null){
return false;
}
if(this == book){
return true;
}
if(this.id==book.id&&this.name.equals(book.name)){
return true;
}else{
return false;
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
public class Text0422 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Book b1 = new Book(1, "李华");
//Book b2 = new Book(2, "张三");
Book.sex = "女";
System.out.println(Book.sex);
//System.out.println(b2.toString());
}
}
static定义方法
在定义类的普通方法时也可以使用static进行定义,那么很明显,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用。
但是其中又有一个问题:
类中的方法有两组:static方法、非static方法。这两组件方法间访问也将受到限制:
static方法不能够直接访问非static属性或者是方法,只能够调用static属性或方法;
非static方法可以访问static的属性或者是方法,不受任何的限制;
static的实际应用
功能一:实现实例化对象个数的统计
希望没当实例化一个类对象的时候都可以打印一个信息:产生的第X个实例化对象
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();
}
}
功能二:实现属性的自动设置
现在某一个类有一个无参构造方法,一个有参构造方法,有参构造的主要目的是传递一个title属性,但是希望不管调用的是无参的还是有参的构造,都可以为title设置内容(尽量不使用重复的内容设置)
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()) ;
}
}