深入理解Java,细说java
00-1010 1.导言2。理解3。使用3.1使用范围3.2静态修改属性3.2.1设计思想3.2.2分类3.2.3注释3.2.4示例3.2.5类变量的内存分析3.3静态修改方法3.3.1设计思想3.3.2理解3.3.3注释:单例设计模式5.1概述5.2优点5.3单例设计模式-饥饿5.4单例设计模式-懒惰5.5应用场景
00-1010当我们写一个类的时候,我们实际上是在描述它的对象的属性和行为,但是我们并没有产生任何实质性的对象。只有通过new关键字我们才会产生对象,然后系统会给对象分配内存空间,其方法可以用于外部调用。有时候,我们希望内存空间中某个数据只有一个副本,不管有没有生成对象,也不管生成了多少个对象。
比如所有的中国人都有一个国名,所有的中国人都共享这个国名。没有必要在每个中文实例对象中分配一个变量来表示国家名称。
目录
静态:静态
1. 引入
00-1010在Java类中,static可以用来修饰属性、方法、代码块和内部类。
2. 理解
00-1010类属性是在该类的对象之间共享的变量。设计类的时候,分析哪些属性不随对象不同而变化,将这些属性设置为类属性。相应的方法被设置为类方法。
00-1010属性,根据是否使用静态装饰,分为:
静态属性(静态变量或类变量)与非静态属性(实例变量)
实例变量:我们创建类的多个对象,每个对象在类中独立地拥有一组非静态属性。当修改一个对象中的非静态属性时,不会导致其他对象中相同属性值的修改。
静态变量:我们创建了该类的多个对象,并且多个对象共享同一个静态变量。当一个静态变量被一个对象修改时,当其他对象调用它时,它也被修改。
00-1010静态变量随着类的加载而加载。它可以被“类”调用。“静态变量”。
静态变量在创建对象之前加载。
装饰成员由所有对象共享。
当访问权限允许时,类可以直接调用该对象,而无需创建它。
因为类只被加载一次,所以静态变量只存在于内存中:在方法区域的静态域中。
无论创建多少个对象,静态数据只占用一个存储区域。
static关键字不能应用于局部变量,因此只能应用于域。
如果一个域是静态基本类型域,并且没有初始化,那么它会得到基本类型的标准初始值。
如果是对象引用,默认初始化值为空。
静态变量和实例变量的可修改范围之间的差异:
静态变量实例变量类是否对象是是
00-1010静态属性示例:system . out;数学。PI;
应用示例:
示例1:
public class Test1 { public static void main(String args[]){ Circle C1=new Circle(2.0);圆c2=新圆(3.0);C1 . display();//name:这是一个圆半径:2.0 C2 . display();//name:这是一个圆半径:3.0}}类圆{私有双半径;Public static String name=这是一个圆;公共静态St
ring getName() { return name; } public Circle(double radius) { this.radius = radius; } public double findArea() { return Math.PI * radius * radius; } public void display() { System.out.println("name:" + name + "radius:" + radius); } }应用举例2:
class Person { private int id; public static int total = 0; public Person() { total++; id = total;} public static void main(String args[]){ Person Tom=new Person(); Tom.id=0; total=100; // 不用创建对象就可以访问静态成员 } }
应用举例3:
public class StaticDemo { public static void main(String args[]) { Person.total = 100; // 不用创建对象就可以访问静态成员 //访问方式:类名.类属性,类名.类方法 System.out.println(Person.total); Person c = new Person(); System.out.println(c.total); //101 }}
3.2.5 类变量内存解析
图解1:
图解2:
3.3 static修饰方法
3.3.1 设计思想
如果方法与调用者无关,则这样的方法通常被声明为类方法,由 于不需要创建对象就可以调用类方法,从而简化了方法的调用。
3.3.2 理解
static
修饰方法为静态方法。
3.3.3 使用
没有对象的实例时,可以用类名.方法名()
的形式访问由static
修饰的类方法。
静态方法与非静态方法可修饰的范围区别:
静态方法非静态方法类yesno对象yesyes
3.3.4 注意
因为不需要实例就可以访问static
方法,因此static
方法内部不能有this
。(也不能有super
)
static
修饰的方法不能被重写。
静态方法中,只能调用静态的方法或属性。
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
3.3.5 举例
public class StaticTest {public static void main(String[] args) {Chinese.nation = "中国";Chinese c1 = new Chinese();c1.name = "姚明";c1.age = 40;c1.nation = "CHN";Chinese c2 = new Chinese();c2.name = "马龙";c2.age = 30;c2.nation = "CHINA";System.out.println(c1.nation);//CHINA//编译不通过//Chinese.name = "张继科";c1.eat();Chinese.show();//编译不通过//Chinese.eat();//Chinese.info();}}//中国人class Chinese{String name;int age;static String nation;public void eat(){System.out.println("中国人吃中餐");//调用非静态结构this.info();System.out.println("name :" +name);//调用静态结构walk();System.out.println("nation : " + nation);}public static void show(){System.out.println("我是一个中国人!");//不能调用非静态的结构//eat();//name = "Tom";//可以调用静态的结构System.out.println(Chinese.nation);walk();}public void info(){System.out.println("name :" + name +",age : " + age);}public static void walk(){}}
4. 注意
关于静态属性和静态方法的使用,可都从生命周期的角度去理解。
开发中,如何确定一个属性是否要声明为static
的?
属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
类中的常量也常常声明为static
。
开发中,如何确定一个方法是否要声明为static
的?
操作静态属性的方法,通常设置为static
的。
工具类中的方法,习惯上声明为static
的。 比如:Math
、Arrays
、Collections
。
5. 单例 (Singleton)设计模式
5.1 概述
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。设计模免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。套路
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 如果我们要让类在一个虚拟机中只能产生一个对象,我们应该怎么做呢?
① 我们首先必须将类的构造器的访问权限设置为private
这样,就不能用new
操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。
② 其次,指向类内部产生的该类对象的变量也必须定义成静态的
因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
5.2 优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
5.3 单例设计模式-饿汉式
class Singleton { // 1.私有化构造器 private Singleton() { } // 2.内部提供一个当前类的实例 // 4.此实例也必须静态化 private static Singleton single = new Singleton(); // 3.提供公共的静态的方法,返回当前类的对象 public static Singleton getInstance() { return single; } }
5.4 单例设计模式-懒汉式
(1)单例设计模式-懒汉式(线程不安全)
class Singleton { // 1.私有化构造器 private Singleton() { } // 2.内部提供一个当前类的实例 // 4.此实例也必须静态化 private static Singleton single; // 3.提供公共的静态的方法,返回当前类的对象 public static Singleton getInstance() { if(single == null) { single = new Singleton(); } return single; } }
(2)单例设计模式-懒汉式(线程安全)
public class BankTest {}class Bank{ private Bank(){} private static Bank instance = null; public static Bank getInstance(){ //方式一:效率稍差// synchronized (Bank.class) {// if(instance == null){//// instance = new Bank();// }// return instance;// } //方式二:效率更高 if(instance == null){ synchronized (Bank.class) { if(instance == null){ instance = new Bank(); } } } return instance; }}
5.5 应用场景
网站的计数器,一般也是单例模式实现,否则难以同步。
应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置 文件数据,都生成一个对象去读取。
Application
也是单例的典型应用。
Windows
的Task Manager
(任务管理器)就是很典型的单例模式。
Windows
的RecycleBin
(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
到此这篇关于Java超详细透彻讲解static的文章就介绍到这了,更多相关Java static内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。