摘要:属性声明虽然是在类的结构中,但是并不受到对象的控制,是独立存在的。所修饰的在静态数据区。也就是说,在没有产生实例化对象的情况下,依然可以使用对象。
static 关键字,我们在开发用的还是比较多的。在《Java编程思想》有下面一段话
</>复制代码
static 方法就是没有 this 的方法。在 static 方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法。这实际上正是 static 方法的主要用途。
static 的用法比较广泛:静态变量、静态成员、静态函数等。我们在使用单列模式的时候,就会用到它。并且 static 数据成员存储在静态存储区,只存储一次,可以节省内存。
static 声明属性 static 修饰成员变量当我们需要在一个类(class)中定义一个属性为公共的属性,就好比说我们需要这个属性是所有类都是共有的,并且这个属性的值是同一个。
Test.java
</>复制代码
class Book{
// 设置一个默认的值
static String pub = "清华大学出版社";
// 用来和 static 作为对比
String description = "描述";
// Book 类正常的属性
private String title;
private double price;
// Book 的构造类
public Book(String title, double price) {
this.title = title;
this.price = price;
}
// 获取 Book 的信息
public void getInfo(){
System.out.println("图书名称:"+ this.title + ",价格为:"+ this.price + ",出版社为:"+ this.pub + ",描述 "+ this.description);
}
}
public class Test {
public static void main(String[] args) {
// 实例化三个Book类
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();
System.out.println("————————————————————无敌分割线————————————————————");
// 我们给 book1 设置一个 pub 属性
book1.pub = "中信出版社";
book1.description = "这本书很牛逼,看了你就知道";
book1.getInfo();
book2.getInfo();
book3.getInfo();
}
}
控制台输出
</>复制代码
图书名称:Android开发实战,价格为:69.8,出版社为:清华大学出版社,描述 描述
图书名称:Java EE开发实战,价格为:49.8,出版社为:清华大学出版社,描述 描述
图书名称:Java 开发教程,价格为:79.8,出版社为:清华大学出版社,描述 描述
————————————————————无敌分割线————————————————————
图书名称:Android开发实战,价格为:69.8,出版社为:中信出版社,描述 这本书很牛逼,看了你就知道
图书名称:Java EE开发实战,价格为:49.8,出版社为:中信出版社,描述 描述
图书名称:Java 开发教程,价格为:79.8,出版社为:中信出版社,描述 描述
从控制台输出的结果,可以看到:
如果给 属性 赋默认值,在上面的例子中是(description 和 pub),输出的结果为都是默认的。
当我们修改了类中 static 关键字声明的属性,那么只要修改了一次,那么其他所有的对象的这个属性都配修改了。
通过类调用 static 声明的属性但是基于上面的代码,我们发现如果是其中的一个类对象就改变了所有的对象的属性,这样子操作是不是感觉不是特别好?然后在Java中,如果是使用 static 声明的属性值,是可以直接通过类调用的。
</>复制代码
public class Test {
public static void main(String[] args) {
// 实例化三个Book类
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();
System.out.println("————————————————————无敌分割线————————————————————");
// 我们使用 Book 类直接调用pub
Book.pub = "中信出版社";
book1.description = "这本书很牛逼,看了你就知道";
book1.getInfo();
book2.getInfo();
book3.getInfo();
}
}
没有实例化类时,调用 static 属性
Test.java
</>复制代码
class Book{
// 设置一个默认的值
static String pub = "清华大学出版社";
// 用来和 static 作为对比
String description = "描述";
// Book 类正常的属性
private String title;
private double price;
// Book 的构造类
public Book(String title, double price) {
this.title = title;
this.price = price;
}
// 获取 Book 的信息
public void getInfo(){
System.out.println("图书名称:"+ this.title + ",价格为:"+ this.price + ",出版社为:"+ this.pub + ",描述 "+ this.description);
}
}
public class Test {
public static void main(String[] args) {
// 在没有实例化对象时,就调用
System.out.println(Book.pub);
// 没事实例化对象的时候,去给static属性赋值上默认值
Book.pub = "北京大学出版社";
System.out.println(Book.pub);
// 新建一个类,输入 pub 属性
Book book = new Book("Java", 88);
book.getInfo();
}
}
控制台输出
</>复制代码
清华大学出版社
北京大学出版社
图书名称:Java,价格为:88.0,出版社为:北京大学出版社,描述 描述
由此,我们看出,在没有实例化对象的时候,就可以直接通过类去掉用 static属性,并且还可以修改 static 的属性。static 属性声明虽然是在类的结构中,但是并不受到对象的控制,是独立存在的。
static 属性与非 static 属性的区别static 声明的属性和普通属性(非 static 属性)最大的区别在于保存的内存区域不同。static 所修饰的在静态数据区。而不是在堆和栈。
static 属性与非 static 属性还有一个最大的区别,就是在于所有非 static 属性必须产生实例化之后才可以访问,但是static 属性不受实例化对象的控制。也就是说,在没有产生实例化对象的情况下,依然可以使用 static 对象。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72175.html
摘要:前面一篇已经介绍了部分关于的用法,主要是介绍的是修饰变量的一些知识。现在的这篇介绍下修饰方法。方法调用非方法或者属性错误的调用以下的操作都在下面进行的。只能调用属性或者方法。所有的定于的结构不受实例化对象的控制。 前面一篇已经介绍了部分关于 static 的用法,主要是介绍的是 static 修饰变量的一些知识。现在的这篇介绍下 static 修饰方法。 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...
阅读 1582·2021-10-14 09:43
阅读 1578·2021-10-09 09:58
阅读 2042·2021-09-28 09:42
阅读 3846·2021-09-26 09:55
阅读 1850·2021-08-27 16:23
阅读 2862·2021-08-23 09:46
阅读 981·2019-08-30 15:55
阅读 1625·2019-08-30 15:54