Java基础知识整理之static修饰方法

前面一篇已经介绍了部分关于 static 的用法,主要是介绍的是 static 修饰变量的一些知识。如今的这篇介绍下 static 修饰方法。java

static 修饰方法

没有实例化类时,调用 static 方法

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 声明的属性都不受对象的控制,便可以不用实例化对象就能够调用。测试

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 方法中有特别多的限制,可是在非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 方法不能直接方法 非 static 属性或者方法。只能调用 static属性或者方法。
  • 非 static 属性或者方法能够方法任何的static 方法或者属性,不受任何限制。

经过几个例子来讲明

咱们在一个类中调用 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) );
    }
}

分析

  • 全部 非static 定义的结构,必须在类已经明确的产生了实例化堆空间,才可使用。
  • 全部的 static 定于的结构不受实例化对象的控制。即:在没有实例化对象的时候访问。
相关文章
相关标签/搜索