博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础知识整理之static修饰方法
阅读量:6686 次
发布时间:2019-06-25

本文共 4522 字,大约阅读时间需要 15 分钟。

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

static 修饰方法

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

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){        // 这里不能使用 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 下面进行的。报错的提示在代码的注释上面。

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 属性或者方法呢?

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 方法,我们必须要实例化对象,才能调用。

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 定于的结构不受实例化对象的控制。即:在没有实例化对象的时候访问。

转载地址:http://jfeao.baihongyu.com/

你可能感兴趣的文章
mysql的cmd窗口查看数据库信息
查看>>
Python之旅.第四章.模块与包
查看>>
CodeForces 876B Divisiblity of Differences (数学水题)
查看>>
HDU 6627 2017ACM/ICPC亚洲区域赛沈阳站 Rabbits
查看>>
审核功能
查看>>
搭建jsp运行环境
查看>>
Summary
查看>>
多文件上传组件FineUploader使用心得
查看>>
正则表达式
查看>>
深入设计模式(三)——适配器模式
查看>>
Java并发编程:如何创建线程?
查看>>
十五、curator recipes之DistributedQueue
查看>>
java基础---多线程---JUC线程池
查看>>
leetcode总结:permutations, permutations II, next permutation, permutation sequence
查看>>
RegexKitLite 正则表达式
查看>>
暑期第一弹<搜索> E - Find The Multiple(DFS)
查看>>
maven+spring mvc+mybatis+redis+dubbo+zookeeper
查看>>
PowerShell脚本保存密码
查看>>
前端基础(JavaScript)
查看>>
redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
查看>>