摘要:前面一篇已经介绍了部分关于的用法,主要是介绍的是修饰变量的一些知识。现在的这篇介绍下修饰方法。方法调用非方法或者属性错误的调用以下的操作都在下面进行的。只能调用属性或者方法。所有的定于的结构不受实例化对象的控制。
前面一篇已经介绍了部分关于 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 定于的结构不受实例化对象的控制。即:在没有实例化对象的时候访问。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72383.html
摘要:属性声明虽然是在类的结构中,但是并不受到对象的控制,是独立存在的。所修饰的在静态数据区。也就是说,在没有产生实例化对象的情况下,依然可以使用对象。 static 关键字,我们在开发用的还是比较多的。在《Java编程思想》有下面一段话 static 方法就是没有 this 的方法。在 static 方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类...
摘要:通过修饰以后,可以表示其修饰的类方法和变量不可改变。如果不希望子类重写父类的某个方法,那就使用关键字。在一些时候由于父类中的某些方法具备某些隐藏的特性,那么并且子类必须使用此方法操作的时候,就加上关键字。 简介 在 Java 中我们把 final 称为终结器,在 Java 中可以使用 final 定义类、方法、属性。通过 final 修饰以后,可以表示其修饰的类、方法和变量不可改变。 ...
摘要:注解提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序元素类方法成员变量等进行关联。为程序的元素类方法成员变量加上更直观更明了的说明,这些说明与程序的业务逻辑无关,并且提供给指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后开始引入的新特性,中文为注解。注解提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(...
摘要:前半句是指线程内表现为串行的语义,后半句是指指令重排序现象和工作内存和主内存同步延迟现象。关于内存模型的讲解请参考死磕同步系列之。目前国内市面上的关于内存屏障的讲解基本不会超过这三篇文章,包括相关书籍中的介绍。问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile...
摘要:前半句是指线程内表现为串行的语义,后半句是指指令重排序现象和工作内存和主内存同步延迟现象。关于内存模型的讲解请参考死磕同步系列之。目前国内市面上的关于内存屏障的讲解基本不会超过这三篇文章,包括相关书籍中的介绍。问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile...
阅读 3820·2021-10-12 10:12
阅读 1453·2021-10-11 10:58
阅读 2290·2021-10-09 10:01
阅读 2597·2021-09-24 09:48
阅读 2699·2021-09-09 11:38
阅读 3526·2019-08-30 15:44
阅读 1724·2019-08-30 14:22
阅读 518·2019-08-29 12:42