前面一篇已经介绍了部分关于 static 的用法,主要是介绍的是 static 修饰变量的一些知识。如今的这篇介绍下 static 修饰方法。java
Test.javaeclipse
class Book{ // 设置一个默认的值 private static String pub = "清华大学出版社"; // Book 类正常的属性 private String title; private double price; // Book 的构造类 public Book(String title, double price) { this.title = title; this.price = price; } public static void setPub(String p){ // 这里不能使用 this.pub = p, 使用 eclipse 工具的时候,会提示 Cannot use this in a static context // 由于 static 声明的属性是不受对象的控制的 pub = p; } // 获取 Book 的信息 public void getInfo(){ System.out.println("图书名称:"+ this.title + ",价格为:"+ this.price + ",出版社为:"+ this.pub ); } } public class Test { public static void main(String[] args) { // 在没有实例化对象时,调用static的方法 Book.setPub("人民日报出版社"); Book book1 = new Book("Android开发实战", 69.8); Book book2 = new Book("Java EE开发实战", 49.8); Book book3 = new Book("Java 开发教程", 79.8); // 在没有设置 pub 属性的状况下输出 book1.getInfo(); book2.getInfo(); book3.getInfo(); } }
控制台输入出工具
图书名称:Android开发实战,价格为:69.8,出版社为:人民日报出版社 图书名称:Java EE开发实战,价格为:49.8,出版社为:人民日报出版社 图书名称:Java 开发教程,价格为:79.8,出版社为:人民日报出版社
咱们能够看出来,用 static 声明的方法和 static 声明的属性都不受对象的控制,便可以不用实例化对象就能够调用。测试
如下的操做都在 eclipse 下面进行的。报错的提示在代码的注释上面。this
class Book{ // 设置一个默认的值 private static String pub = "清华大学出版社"; // Book 类正常的属性 private String title; private double price; // Book 的构造类 public Book(String title, double price) { this.title = title; this.price = price; } public static void setPub(String p){ // 这里不能使用 this.pub = p, 使用 eclipse 工具的时候,会提示 Cannot use this in a static context pub = p; //若是是使用 this.title = "title" 或者 调用 this.getInfo(),就会报错: Cannot use this in a static context this.title = "title"; // 若是是 title = "title" // 就会报错:Cannot make a static reference to the non-static field title,而且提示 将 title 修为 static title = "title"; // 若是是直接调用 getInfo() // 就会报错 Cannot make a static reference to the non-static method getInfo() from the type Book, 而且提示 将 getInfo() 修为 static 方法 getInfo(); } // 获取 Book 的信息 public void getInfo(){ System.out.println("图书名称:"+ this.title + ",价格为:"+ this.price + ",出版社为:"+ this.pub ); } }
在上面的例子咱们发现,在static 方法中有特别多的限制,可是在非static中,调用 static 属性或者方法呢?code
Test.java对象
class Book{ // 设置一个默认的值 private static String pub = "清华大学出版社"; // Book 类正常的属性 private String title; private double price; // Book 的构造类 public Book(String title, double price) { this.title = title; this.price = price; } public static void setPub(String p){ pub = p; } // 获取 Book 的信息 public void getInfo(){ // 调用static 方法 setPub("北京大学"); // 在打印输出的时,调用 static属性 System.out.println("图书名称:"+ this.title + ",价格为:"+ this.price + ",出版社为:"+ pub ); } } public class Test { public static void main(String[] args) { Book book1 = new Book("Android开发实战", 69.8); Book book2 = new Book("Java EE开发实战", 49.8); Book book3 = new Book("Java 开发教程", 79.8); // 在没有设置 pub 属性的状况下输出 book1.getInfo(); book2.getInfo(); book3.getInfo(); } }
控制台输出教程
图书名称:Android开发实战,价格为:69.8,出版社为:北京大学 图书名称:Java EE开发实战,价格为:49.8,出版社为:北京大学 图书名称:Java 开发教程,价格为:79.8,出版社为:北京大学
咱们在一个类中调用 static 方法的时候,能够直接调用 static方法。可是对于,非static 方法,咱们必需要实例化对象,才能调用。ip
public class Test { public static void print() { System.out.println("测试static 方法"); } public void printStr() { System.out.println("测试非 static 方法"); } public static void main(String[] args) { print(); // 对于非static,咱们必需要实例化对象了才能调用 new Test().printStr(); } }
咱们在开发中,常常会使用到工具类,咱们的工具类通常都是按照以下定义的,在这个类中机会全部的方法都是 static 的,调用的时候就经过 Utils.方法名
直接调用。开发
class Utils { public static int int2Str(String str) { return Integer.valueOf(str); } public static int add(int x, int y) { return x+y; } } public class Test { public static void main(String[] args) { System.out.println( Utils.add(0, 1) ); } }