JAVA基础学习博客003

学习目标:

掌握今日学习内容并理解,可以用自己语言描述,可以自己验证过程。

学习内容:

1、 static(静态)关键词
2、 Classloader加载过程

学习时间:

2020 11/9

学习产出:

1.以火车售票为实例进行static关键词的应用。
----这是一个类----

public class Ticket {
/***
* 默认票数
*/
private int ticketCount = 100;

public  void sale() {
	
	if(ticketCount>0) {
		System.out.println("售票一张,还剩余"+(--ticketCount)+"张");
		
	}
	
}
 
public  static void show() {
	System.out.println("--static method--");
	
}

}
-------分割线-------
以下为两个窗口(即两个对象)进行售票(调用同一类的同一属性)
public class yejiang {

public static void main(String[] args) {
	Ticket t1 = new Ticket();
	Ticket t2 = new Ticket();
	
	for(int i=0;i<50;i++) {
		t1.sale();
		t2.sale();
		
	}
	Ticket.show();
}

}
-------分割线-------
得到如下结果:
售票一张,还剩余99张
售票一张,还剩余99张
售票一张,还剩余98张
售票一张,还剩余98张
售票一张,还剩余97张
售票一张,还剩余97张
售票一张,还剩余96张
售票一张,还剩余96张
售票一张,还剩余95张
售票一张,还剩余95张
售票一张,还剩余94张
售票一张,还剩余94张
售票一张,还剩余93张
售票一张,还剩余93张
售票一张,还剩余92张
售票一张,还剩余92张
售票一张,还剩余91张
售票一张,还剩余91张
售票一张,还剩余90张
售票一张,还剩余90张
售票一张,还剩余89张
售票一张,还剩余89张
售票一张,还剩余88张
售票一张,还剩余88张
售票一张,还剩余87张
售票一张,还剩余87张
售票一张,还剩余86张
售票一张,还剩余86张
售票一张,还剩余85张
售票一张,还剩余85张
售票一张,还剩余84张
售票一张,还剩余84张
售票一张,还剩余83张
售票一张,还剩余83张
售票一张,还剩余82张
售票一张,还剩余82张
售票一张,还剩余81张
售票一张,还剩余81张
售票一张,还剩余80张
售票一张,还剩余80张
售票一张,还剩余79张
售票一张,还剩余79张
售票一张,还剩余78张
售票一张,还剩余78张
售票一张,还剩余77张
售票一张,还剩余77张
售票一张,还剩余76张
售票一张,还剩余76张
售票一张,还剩余75张
售票一张,还剩余75张
售票一张,还剩余74张
售票一张,还剩余74张
售票一张,还剩余73张
售票一张,还剩余73张
售票一张,还剩余72张
售票一张,还剩余72张
售票一张,还剩余71张
售票一张,还剩余71张
售票一张,还剩余70张
售票一张,还剩余70张
售票一张,还剩余69张
售票一张,还剩余69张
售票一张,还剩余68张
售票一张,还剩余68张
售票一张,还剩余67张
售票一张,还剩余67张
售票一张,还剩余66张
售票一张,还剩余66张
售票一张,还剩余65张
售票一张,还剩余65张
售票一张,还剩余64张
售票一张,还剩余64张
售票一张,还剩余63张
售票一张,还剩余63张
售票一张,还剩余62张
售票一张,还剩余62张
售票一张,还剩余61张
售票一张,还剩余61张
售票一张,还剩余60张
售票一张,还剩余60张
售票一张,还剩余59张
售票一张,还剩余59张
售票一张,还剩余58张
售票一张,还剩余58张
售票一张,还剩余57张
售票一张,还剩余57张
售票一张,还剩余56张
售票一张,还剩余56张
售票一张,还剩余55张
售票一张,还剩余55张
售票一张,还剩余54张
售票一张,还剩余54张
售票一张,还剩余53张
售票一张,还剩余53张
售票一张,还剩余52张
售票一张,还剩余52张
售票一张,还剩余51张
售票一张,还剩余51张
售票一张,还剩余50张
售票一张,还剩余50张
–static method–

通过观察我们可以发现,在t1,t2两个对象的调用下,进行了各五十次售票,然而和我们所预想的两个窗口各售卖五十张票不一致,问题出在哪里呢?我们发现,在运行结果中,同一张票卖了两次,那么体现出来的问题就是,这两个窗口(两个对象)并没有对同一个票数(我们所初始化的票数)进行售卖。根据我们对于内存的理解可知。问题出现在t1t2各自在堆中开辟空间(创建对象)的时候,每个对象内都进行了对默认票数的初始化=100,简而言之就是在“各卖各的”。
那么,如何让多个对象共用同一个类中的同一个属性呢?只需要在我们对于类中初始化的语句中加入static关键字即可。
tips:初始化和默认在加载的过程中并不等同,无论是否初始化,都会先加载默认值再进行下一步。

 更正后的类(static加粗强调):

public class Ticket {
/***
* 默认票数
*/
private static int ticketCount = 100;

public  void sale() {
	
	if(ticketCount>0) {
		System.out.println("售票一张,还剩余"+(--ticketCount)+"张");
		
	}
	
}
 
public  static void show() {
	System.out.println("--static method--");
	
}

}
-------------------分割------------------------
调用无变动

public class yejiang{

public static void main(String[] args) {
	Ticket t1 = new Ticket();
	Ticket t2 = new Ticket();
	
	for(int i=0;i<50;i++) {
		t1.sale();
		t2.sale();
		
	}
	Ticket.show();
}

}
-------------------分割------------------------
得到预期结果如下:

售票一张,还剩余99张
售票一张,还剩余98张
售票一张,还剩余97张
售票一张,还剩余96张
售票一张,还剩余95张
售票一张,还剩余94张
售票一张,还剩余93张
售票一张,还剩余92张
售票一张,还剩余91张
售票一张,还剩余90张
售票一张,还剩余89张
售票一张,还剩余88张
售票一张,还剩余87张
售票一张,还剩余86张
售票一张,还剩余85张
售票一张,还剩余84张
售票一张,还剩余83张
售票一张,还剩余82张
售票一张,还剩余81张
售票一张,还剩余80张
售票一张,还剩余79张
售票一张,还剩余78张
售票一张,还剩余77张
售票一张,还剩余76张
售票一张,还剩余75张
售票一张,还剩余74张
售票一张,还剩余73张
售票一张,还剩余72张
售票一张,还剩余71张
售票一张,还剩余70张
售票一张,还剩余69张
售票一张,还剩余68张
售票一张,还剩余67张
售票一张,还剩余66张
售票一张,还剩余65张
售票一张,还剩余64张
售票一张,还剩余63张
售票一张,还剩余62张
售票一张,还剩余61张
售票一张,还剩余60张
售票一张,还剩余59张
售票一张,还剩余58张
售票一张,还剩余57张
售票一张,还剩余56张
售票一张,还剩余55张
售票一张,还剩余54张
售票一张,还剩余53张
售票一张,还剩余52张
售票一张,还剩余51张
售票一张,还剩余50张
售票一张,还剩余49张
售票一张,还剩余48张
售票一张,还剩余47张
售票一张,还剩余46张
售票一张,还剩余45张
售票一张,还剩余44张
售票一张,还剩余43张
售票一张,还剩余42张
售票一张,还剩余41张
售票一张,还剩余40张
售票一张,还剩余39张
售票一张,还剩余38张
售票一张,还剩余37张
售票一张,还剩余36张
售票一张,还剩余35张
售票一张,还剩余34张
售票一张,还剩余33张
售票一张,还剩余32张
售票一张,还剩余31张
售票一张,还剩余30张
售票一张,还剩余29张
售票一张,还剩余28张
售票一张,还剩余27张
售票一张,还剩余26张
售票一张,还剩余25张
售票一张,还剩余24张
售票一张,还剩余23张
售票一张,还剩余22张
售票一张,还剩余21张
售票一张,还剩余20张
售票一张,还剩余19张
售票一张,还剩余18张
售票一张,还剩余17张
售票一张,还剩余16张
售票一张,还剩余15张
售票一张,还剩余14张
售票一张,还剩余13张
售票一张,还剩余12张
售票一张,还剩余11张
售票一张,还剩余10张
售票一张,还剩余9张
售票一张,还剩余8张
售票一张,还剩余7张
售票一张,还剩余6张
售票一张,还剩余5张
售票一张,还剩余4张
售票一张,还剩余3张
售票一张,还剩余2张
售票一张,还剩余1张
售票一张,还剩余0张
–static method–
对于static的总结:

  • class文件也叫字节码文件,是由Java文件编译而来的,先编译为字节码文件,再转为机械码文件,然后计算机才能识别

  • 机械码文件,是计算机可以直接识别的文件,通常C编译后的文件就是机械码文件

  • 1、什么是static
    静态修饰符,修饰的方法称为静态方法,修饰的属性称为静态属性

  • 2、static的使用场景

  • 思考:非静态的属性和方法都是随着对象的创建而加载的(反过来讲就是只有当对象存在时,非静态的属性及方法才会存在),如果多个对象想要公用同一个属性或方法时怎么办?

  • 例如:售票功能(多个窗口可以售卖同一趟列车的同一个时间点的票,多个窗口相当于是多个对象,共用的票就是同一个属性)

  • 3、怎么使用、什么时候用?

  • 属性或方法使用static关键字修饰即可

  • 作用:数据共享

  • 编译后出现黄色警告线的原因:

  • 1、变量未使用

  • 2、泛型未定义

  • 3、静态的方法使用了对象调用

  • 思考:非静态与静态的属性或方法应该如何调用

  • 非静态:只能通过对象调用,因为非静态的属性或方法只有在创建对象的时候才会被加载进内存

  • 静态:既可以通过对象调用,也可以通过类名调用,建议使用类名调用(非静态的属性或方法属于对象的,静态的属性或方法属于类的)

  • 思考:如果相互调用了会出现什么问题,为什么?

  • 不能再静态的方法中调用非静态的属性或方法,因为非静态的属性或方法只有在创建对象的时候才会被加载进内存

  • 思考:静态的属性和方法时什么时候加载进内存的

  • Java文件在编译时会被加载进内存中,其中的静态的属性及方法都会随着class文件的加载而加载(简单点:类加载,那么静态的属性及方法就加载了)

2.Classloader加载过程
双亲委托机制,ClassLoader加载class文件
在这里插入图片描述

例如:某某想要killXXX,奈何自身没有这个本事,so,找了组织C,C接了任务后发现自己做不了就委托给组织B,B接了后发现自己也做不了就又委托给了组织A,A完成后将结果反馈给B,B在反馈给C,C在反馈给某某(每个节点也可能自己去完成任务)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值