0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员
- 成员变量---可以修饰
- 构造方法---不可以
- 方法---可以修饰
- 初始化块---可以修饰
- 内部类(包括接口、枚举)---可以修饰
- 总的来说:静态成员不能访问非静态成员
静态变量
- static修饰的变量为静态变量
- 在创建对象时,静态变量位于方法区中,而非像实例变量一样,位于堆内存中
- 一个类的所有对象共用相同静态变量,通过类名来调用静态变量,通过实例来调用虽然也符合语法,但不推荐
- 示例:静态变量的一个用法
class Employee{
private static int nextId=1;
private int id;
public void setId{
id=nextId;
nextId++;
}
}
Employee harry=new Employee();
harry.setId();
静态常量
- 静态变量上再加个final修饰,则为静态常量
- 比如,Math类的的E和PI
public final class Math {
private Math() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
.
.
.
}
- 一般不要把实例变量设计为public,而是再写个set和get方法,但final修饰的变量却没关系,可以设置为public
静态方法
- static修饰方法
- 静态方法不能操作对象,因而不能调用实例变量,只能访问到静态变量
- 静态方法相当于没有this隐式参数的传递
- 通过类名调用方法,比如:Math.pow(x,a);通过对象调用静态方法,是符合语法规则的,但是不推荐
- 即使某个类型的引用为null,但也可以调用静态方法
- 什么时候用静态方法:
- 一个方法不需要访问对象的状态,所需的参数都通过方法签名(显式参数)传入
- 一个方法只需要访问静态变量
- 静态方法示例:
- java.lang.Math的所有方法都是静态方法
静态初始化块
- 静态块用于类的初始化,在类的初始化阶段执行
- 类获得初始化之后,静态块将永远不会获得执行的机会
- 关于静态块、非静态块、构造方法的执行顺序,参见:0023 Java学习笔记-面向对象-初始化代码块
单例类
- 什么是单例类:
- 这个类从始至终最多只能创建一个实例
- 何时用:
- 不允许自由创建该类对象,只允许创建一个对象的场景
- 比如:可能只能有一个窗口管理器;一个数据库引擎访问点
- 如何设计该类:
- 将该类的所有构造器用private修饰,外部就不能用构造器随意构造实例了
- 提供一个public方法作为访问点,用来创建那么一个实例,但要用static修饰,因为调用该方法之前还不存在对象,只能通过类名调用类方法
- 再创建一个static变量来保存这个唯一的实例
- 示例代码:
public class T1{
public static void main(String[] args) {
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println("s1和s2是否指向同一个对象: "+(s1==s2));
}
}
class Singleton{
private static Singleton instance; // 3. 用private static变量保存唯一的实例
private Singleton(){} //1. 用private修饰构造方法
public static Singleton getInstance(){ //2. 提供一个public static方法返回实例
if (instance==null){
instance=new Singleton(); //方法体保证最多只有一个实例
}
return instance;
}
}
其他
- 非静态方法,相当于有显式和隐式两个参数
- 显式参数:从方法签名中传入的
- 隐式参数:对象调用方法时,传入的this
0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类的更多相关文章
- Java学习笔记(二十四):单例设计模式singleton
为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...
- 0027 Java学习笔记-面向对象-(非静态、静态、局部、匿名)内部类
内部类 内部类就是把一个类写在另一个类的内部 用途: 如果一个类只希望它被某一个类访问,那么可以把它定义在另一个类的内部,并用private修饰 内部类可以访问它所在外部类的private成员:但所在 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- Java学习笔记之---static
Java学习笔记之---static static不能修饰类,局部变量 (一)静态成员的特征 static+属性 静态属性 无论实例化出来多少个对象,都会共用同一块静态空间,类对象共享 静态成员从第 ...
- 0029 Java学习笔记-面向对象-枚举类
可以创建几个对象? n多个:大部分的类,都可以随意创建对象,只要内存不爆掉 1个:比如单例类 有限的几个:采用单例类的设计思路,可以只允许创建少数的几个特定的对象:还有就是枚举类. 创建少数几个对象, ...
- 1.6(java学习笔记)static关键字
static关键字 1.static修饰变量也称静态变量,静态变量存放在静态区被该类的所有对象共享. 例如,定义了一个类class User{static Sring city = "a城& ...
- Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式
(注:静态变量修改为静态成员变量,静态方法改为静态成员方法) 静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些 ...
随机推荐
- Phar与Composer
如果你想把PHP玩出像Java那样的花来,那Phar.Composer甚至Phing应该都是必须要玩一遍的. Phar - Php Archive.包管理器,有些类似Java中的jar包,但有所不同. ...
- 关联查询 join on 和比较运算符 in
join on多表之间的关联查询 写法select 字段 from 表1 t join 表2 s on t.字段1 = s.字段1 where 条件: 也可以这么写select 字段 from 表1 ...
- python signal(信号)
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进 ...
- python-ldap实现登录案例
ldap_config = { 'ldap_path': 'ldap://xx.xx.xx.xx:389', 'base_dn': 'ou=users,dc=ledo,dc=com', 'ldap_u ...
- SQL语句操作数据-------开启旅程路线喽!
岁月,是一首诗,一首蕴含丰富哲理的诗,岁月是一峰骆驼,驮着无数人的梦想. 一.SQL的简介 SQL的全称是“结构化查询语言”(Structure Query Language),SQL语言是针对数据库 ...
- 基于NXBRE规则引擎实现的柔性折扣策略
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.应用背景 ...
- 实例之HTML标签属性
鼠标放在图片上会显示说明文字的代码 <img src="图片地址" width=620 height=138 border=0 title="说明文字" ...
- javascript创建对象的几种方式
javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用.主要为下面几种:1.对象字面量的方式 person={firstname ...
- 2034-人见人爱A-B(c++实现)
Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...
- mysql支持IOS的Emoji表情
原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 解决办法: 将Mysql的编码从utf8转换成utf8mb4 ...