Java面向对象(七)

java 文章 2022-07-25 12:20 3324 0 全屏看文

AI助手支持GPT4.0

Java面向对象(七)

二十、static 关键字

  1. static:静态的,可以用来修饰:属性、方法、代码块、内部类

  2. 使用static修饰属性:静态变量(或类变量)

    属性,按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)

    • 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。

    • 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。

  3. static 修饰属性的其他说明:

(1)静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用

(2)静态变量的加载要早于对象的创建。

(3)由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。

类变量 实例变量
yes no
对象 yes yes

(4)静态属性举例:System.out;Math.PI

4.使用static修饰方法:静态方法

(1)随着类的加载而加载,可以通过"类.静态方法"的方式进行调用

静态方法 非静态方法
yes no
对象 yes yes

(2)静态方法中,只能调用静态的方法或属性

非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。

  1. static 注意点:
  • 在静态的方法内,不能使用this关键字、super关键字
  1. 开发中,如何确定一个属性是否要声明为static的?
  • 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
  • 类中的常量也常常声明为static。
  1. 开发中,如何确定一个方法是否要声明为static的?
  • 操作静态属性的方法,通常设置为static的。

  • 工具类中的方法,习惯上声明为static的。 比如:Math、Arrays、Collections。

二十一、单例模式

  • 单例设计模式:

    就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的

  • 单例模式的两种方式:饿汉式和懒汉式。

21.1 饿汉式单例模式代码

public class SingletonTest1 {
	public static void main(String[] args) {
	
		Bank bank1 = Bank.getInstance();
		Bank bank2 = Bank.getInstance();
		
		System.out.println(bank1 == bank2);		//true
	}
}

//饿汉式
class Bank{
	
	//1.私有化类的构造器
	private Bank(){		
	}
	
	//2.内部创建类的对象
	//4.要求此对象也必须声明为静态的
	private static Bank instance = new Bank();
	
	//3.提供公共的静态的方法,返回类的对象
	public static Bank getInstance(){
		return instance;
	}
}

21.2 懒汉式单例模式代码

//	线程不安全,非懒汉式单例模式完整代码
public class SingletonTest2 {
	public static void main(String[] args) {
		
		Bank bank1 = Bank.getInstance();
		Bank bank2 = Bank.getInstance();
		
		System.out.println(bank1 == bank2);		//true
		
	}
}


class Bank{	
	//1.私有化类的构造器
	private Bank(){
		
	}
	
	//2.声明当前类对象,没有初始化
	//4.此对象也必须声明为static的
	private static Bank instance = null;
	
	//3.声明public、static的返回当前类对象的方法
	public static Bank getInstance(){
		
		if(instance == null){		
			instance = new Bank();	
		}
		return instance;
	}
}

21.3 饿汉式和懒汉式

  1. 饿汉式:

    • 坏处:对象加载时间过长。
    • 好处:饿汉式是线程安全的
  2. 懒汉式:

    • 好处:延迟对象的创建。
    •      上述的写法坏处:线程不安全。(后面再修改)
      

21.4 单例模式应用场景

  • 网站的计数器,一般也是单例模式实现,否则难以同步。
  • 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志 文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  • 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
  • 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取
  • Application 也是单例的典型应用 。
  • Windows的Task Manager (任务管理器)就是很典型的单例模式
  • Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

二十二、类的成员之四——代码块(初始化代码块)

  • 代码块的作用:用来初始化类、对象。

  • 代码块如果有修饰的话,只能使用static。

  • 分类:静态代码块和非静态代码块。

22.1 静态代码块

  1. 内部可以有输出语句。

  2. 随着类的加载而执行,而且只执行一次。

  3. 作用:初始化类的信息。

  4. 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行

  5. 静态代码块的执行要优先于非静态代码块的执行

  6. 静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构

22.2 非静态代码块

  1. 内部可以有输出语句。

  2. 随着对象的创建而执行。

  3. 每创建一个对象,就执行一次非静态代码块。

  4. 作用:可以在创建对象时,对对象的属性等进行初始化。

  5. 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行。

  6. 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法。

22.3 例子

class Root{
	static{
		System.out.println("Root的静态初始化块");
	}
	{
		System.out.println("Root的普通初始化块");
	}
	public Root(){
		super();
		System.out.println("Root的无参数的构造器");
	}
}

class Mid extends Root{
	static{
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid(){
		super();
		System.out.println("Mid的无参数的构造器");
	}
	public Mid(String msg){
		//通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参数构造器,其参数值:"
			+ msg);
	}
}

class Leaf extends Mid{
	static{
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}	
	public Leaf(){
		//通过super调用父类中有一个字符串参数的构造器
		super("小钊");
		System.out.println("Leaf的构造器");
	}
}

public class LeafTest{
	public static void main(String[] args){
		new Leaf(); 
		System.out.println();
		new Leaf();
	}
}

/*	output:
	Root的静态初始化块
	Mid的静态初始化块
    Leaf的静态初始化块
    Root的普通初始化块
    Root的无参数的构造器
    Mid的普通初始化块
    Mid的无参数的构造器
    Mid的带参数构造器,其参数值:尚硅谷
    Leaf的普通初始化块
    Leaf的构造器

    Root的普通初始化块
    Root的无参数的构造器
    Mid的普通初始化块
    Mid的无参数的构造器
    Mid的带参数构造器,其参数值:尚硅谷
    Leaf的普通初始化块
	Leaf的构造器

*/

22.4 属性赋值的先后顺序

对属性可以赋值的位置:

① 默认初始化

② 显式初始化 / ⑤在代码块中赋值

③ 构造器中初始化

④ 有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值

执行的先后顺序:① - ② / ⑤ - ③ - ④

其中,② 和 ⑤ 的先后顺序决定了其赋值的先后顺序。

例子:

public class OrderTest {
	public static void main(String[] args) {
		Order order = new Order();
		System.out.println(order.orderId);
	}
}

class Order{
	
	int orderId = 3;
	{
		orderId = 4;
	}
		
}
//	output:
//	4
public class OrderTest {
	public static void main(String[] args) {
		Order order = new Order();
		System.out.println(order.orderId);
	}
}

class Order{
	
	{
		orderId = 4;
	}
    
    int orderId = 3;
		
}
//	output:
//	3

注意:一般情况下,代码块写在属性定义之后。

二十三、final 关键字

  1. final 可以用来修饰的结构:类、方法、变量

  2. final 用来修饰一个类:此类不能被其他类所继承。比如:String类、System类、StringBuffer类。

  3. final 用来修饰方法:表明此方法不可以被重写。比如:Object 类中 getClass();

  4. final 用来修饰变量:此时的"变量"就称为是一个常量

    (1)final 修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化

    (2)final 修饰局部变量: 尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。

  5. static final 用来修饰属性:全局常量

// 例子一:
public class Something {
	public int addOne(final int x) {
		/eturn ++x;    编译器报错,x值不能再变
		return x + 1;	// x 没被重新赋值,正确
	}
}

//例子2:
public class Something {
	public static void main(String[] args) {
	Other o = new Other();
	new Something().addOne(o);
	}
public void addOne(final Other o) {
	// o = new Other();	报错
	o.i++;	//实例 o 里的变量可以改变,正确
	}
}

class Other {
	public int i;
}
-EOF-

AI助手支持GPT4.0


国内超级便宜服务器

摸鱼人热门新闻聚合

钻级赞助商 我要加入

开发者在线工具

第三方支付技术请加QQ群

相关文章
Java获取两个日期之间相隔多少天
springboot项目启动报错Could not create connection to database server.
Java判断传入日期是否为前三个月的日期
基于crudapi零代码后端Java SDK二次开发之API认证和鉴权(二)
Java使用微秒计数
随便看看
BT面板查看网站入口、账号密码的命令 5828
ucloud海外服务器超级优惠券 3137
根据您的消费情况,您的延停权益已发生变化,变更后的延停权益为延停额度20.00元 5685
为什么我们喜欢迈克尔杰克逊。 4021
阿里云com、cn域名续费优惠码(2020年5月可用) 3446
阿里云com、cn域名续费优惠码(2020年6月可用) 3443
微信公众号开五联增值税发票怎么处理 2828
仙之侠道幻彩衣的合成和属性预览 4179
仙之侠道2.8四象玉的合成和图片属性预览 3800
仙之侠道2.8赤狱战甲合成和属性预览 3152