高校招生热点问题
更多>>- 厦门学国际商务专业要学外语吗?需要学生具
- 中国经济发展的过程就是不断对外开放和对外贸易的过程。在国际国内双循环不断完善...查看更多>>
- 厦门纳税事务和会计事务有区别吗?中职学财
- 当今社会,会计行业因与企业经济利益密切相关而备受关注。其中,纳税和会计事务都...查看更多>>
- 厦门计算机与数码设备维修是什么专业?有什
- 科技的发展给生活带来了便利,电脑和数码设备的普及率越来越高,人们的日常生活已...查看更多>>
- 厦门中专学舞蹈毕业可以干什么?有什么相关
- 舞蹈是人类以体育锻炼的形式表达情感的一种方式。如今,人们安居乐业,舞蹈成为人...查看更多>>
作者:希曼舒·维尔马
原文:https://medium . com/swlh/4-things-that-Java-developer-things-things-things-things-thinks-thinks-thinks-thinks-most-following-complexing-87c 2598 f3f 0。
译者:新月,编辑:涂敏,CSDN出品(ID: CSDN新闻)
大家大概从学生时代就开始用Java了吧。我们一直在学习Java,但是Java里总有一些模糊的概念,无论是初级程序员还是高级程序员。因此,本文的目的是澄清这些概念。
看完这篇文章,你会对这些概念有更深的理解,明白所有灰色的东西。在本书中,我们将讨论匿名内联类、多线程、同步和序列化。
一个
匿名类
Java匿名类很像本地类或内联类,但是它们没有名字。我们可以使用匿名类,同时定义和实例化一个类。只有当局部类只使用一次时,才应该这样做。
匿名类不能有显式定义的构造函数。相反,每个匿名类都隐式定义了一个匿名构造函数。
创建匿名类有两种方法:
扩展已有的类(可以是抽象类,也可以是具体类)创建接口更好的理解代码的方法是先阅读它,所以让我们先看看代码。
匿名类可以在类和函数代码块中创建。您可能知道,匿名类可以通过接口或者扩展抽象或具体的类来创建。在上面的例子中,我首先创建了一个接口足球,然后在类和main()方法的范围内实现了一个匿名类。足球也可以是抽象类,也可以是与接口并列的顶级类。
足球可以是一个抽象类,请看下面的代码。
public abstract class Football { abstract void kick(); }匿名类不仅可以是抽象类,也可以是具体类。
// normal or concrete class public class Football { public void kick(){} }// end of class scope.足球类没有不带参数的构造函数怎么办?我们可以在匿名类中访问类变量吗?我们需要重载匿名类中的所有方法吗?
创建匿名类时可以使用任何构造方法。注意这里也使用了构造方法的参数。匿名类可以扩展顶层类,并实现抽象类或接口。所以,访问控制的规则依然适用。我们可以访问protected变量,而改成private就不能访问了。由于上述代码中扩展了Football类,我们不需要重载所有方法。但是,如果它是个接口或抽象类,那么必须为所有未实现的方法提供实现。匿名类中不能定义静态初始化方法或成员接口。匿名类可以有静态成员变量,但它们必须是常量。
匿名类的目的:
更清晰的项目结构:通常我们在需要随时改变某个类的某些方法的实现时使用匿名类。这样做就不需要在项目中添加新的*.java文件来定义顶层类了。特别是在顶层类只被使用一次时,这种方法非常好用。UI事件监听器:在图形界面的应用程序中,匿名类比较常见的用途就是创建各种事件处理器。例如,下述代码:button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // your handler code here } });我们创建了一个匿名类并实现了setOnClickListener接口。当用户单击按钮时,它的onClick方法被触发。
2
多线程
Java中的多线程可以同时执行多个线程。线程是轻量级子进程,是相对较小的处理单元。使用多线程的主要目的是最大限度地利用CPU。我们使用多线程而不是多进程,因为线程更轻,可以在同一个进程内共享内存空间。多线程用于实现多任务处理。
线程的生命周期
如上图所示,线程的生命周期主要有五种状态。让我们依次解释每个状态。
New:创建线程的实例后,它会进入new状态,这是第一个状态,但线程还没有准备好运行。Runanble:调用线程类的start()方法,状态就会从new变成Runnable,意味着线程可以运行了,但实际上什么时候开始运行,取决于Java线程调度器,因为调度器可能在忙着执行其他线程。线程调度器会以FIFO(先进先出)的方式从线程池中挑选一个线程。Blocked:有很多情况会导致线程变成blocked状态,如等待I/O操作、等待网络连接等。此外,优先级较高的线程可以将当前运行的线程变成blocked状态。Waiting:线程可以调用wait()进入waiting状态。当其他线程调用notify()时,它将回到runnable状态。Terminated:start()方法退出时,线程进入terminated状态。为什么要用多线程?
使用线程可以让Java应用同时做多件事,从而加快运行速度。用专业术语来说,线程可以帮助你在Java程序中实现并行操作。因为现代CPU速度非常快,可能包含多个内核,所以不可能只用一个线程就把所有的内核都用上。
需要记住的要点
多线程可以更好地利用CPU。提高响应性,提高用户体验减少响应时间同时为多个客户端提供服务创建线程有两种主要方式:
扩展Thread类实现Runnable接口通过扩展线程类创建一个线程
创建一个类来扩展Thread类。这个类应该重载Thread类中的run()方法。线程在run()方法中开始它的生命周期。我们创建一个新类的对象,然后调用start()方法开始执行线程。在线程对象中,start()调用run()。
也可以通过接口创建类。
以下代码创建一个类,实现java.lang.Runnable接口并重载run()方法。然后我们实例化一个线程对象并调用它的start()方法。
线程类和可运行接口
扩展Thread类,就无法扩展更多的类,因为Java不允许多重继承。多重继承可以通过接口实现。所以比较好是使用接口而不是Thread类。如果扩展Thread类,那么它还包含了一些方法,如yield()、interrupt()等,我们的程序可能用不到。而在Runnable接口中就没有这些排不上用场的方法。三
同步
同步是指多个线程的同步。一个同步代码块一次只能由一个线程执行。Java中的同步是一个非常重要的概念,因为Java是多线程语言,多线程可以并行执行。在多线程环境中,Java对象或Java类的同步非常重要。
为什么要同步?
如果代码在多线程环境中执行,那么多线程中共享的对象需要同步,以避免破坏状态或导致任何不可预测的行为。
在我们进入同步的概念之前,让我们先了解这个问题。
class Table { void printTable(int n) {//method not synchronized for (int i = 1; i <= 5; i++) { System.out.print(n * i+" "); try { Thread.sleep(400); } catch (Exception e) { System.out.println(e); } } } } class MyThread1 extends Thread { Table t; MyThread1(Table t) { this.t = t; } public void run() { t.printTable(5); } } class MyThread2 extends Thread { Table t; MyThread2(Table t) { this.t = t; } public void run() { t.printTable(100); } } class TestSynchronization1 { public static void main(String args[]) { Table obj = new Table();//only one object MyThread1 t1 = new MyThread1(obj); MyThread2 t2 = new MyThread2(obj); t1.start(); t2.start(); } }运行这段代码时,您会注意到输出非常不稳定,因为没有同步。让我们看看程序的输出。
输出:
100 5 200 10 300 15 20 400 500 25将synchronized添加到printTable()方法中,这样synchronized方法在执行完成之前不会让其他线程进入。下面的输出很稳定。
输出:
5 10 15 20 25 100 200 300 400 500类似地,Java类和对象也可以同步。
注意:我们不一定需要同步整个方法。有时最好只同步方法的一小部分。Java的同步代码片段可以实现这一点。
四
序列化
Java中的序列化是一种将对象状态写入字节流的机制。相反的操作称为反序列化,将字节流转换为对象。
序列化和反序列化的过程是平台无关的,即对象在一个平台上序列化,然后在另一个平台上反序列化。
序列化时调用ObjectOutputStream的writeObject()方法,反序列化时调用ObjectInputStream类的readObject()方法。
在下图中,Java对象被转换成字节流,然后存储在各种形式的存储中。这个过程称为序列化。在右边,内存中的字节流被转换成一个Java对象,这被称为反序列化。
我为什么要连载
显然,在程序执行结束或停止后,创建的Java类将被销毁。为了避免这个问题,Java提供了序列化功能,通过它可以存储对象,或者将状态持久化以备后用,或者在其他平台上使用。
下面的代码演示了这个过程。
输出:
Serialized data is saved in Employee.ser file.输出:
Serialized data is restored from Employee.ser file Name of employee is : Aman Salary of employee is : 0需要记住的要点
如果父类实现了Serializable接口,那么子类就不需要实现了,但反过来不一定成立。只有非静态数据成员可以在序列化过程中保存下来。静态数据成员和临时数据成员不会在序列化过程中保存下来。所以,如果不想保存某个非静态数据成员,则可以将其设置为transient。反序列化过程中不会调用对象的构造函数。关联对象必须实现Serializable接口。五
摘要
1.首先,我们解释匿名类,以及它的目的和用法。
2.其次,我们讨论了Java中的多线程、线程的生命周期和用途。
3.同步只允许一个线程通过进入同步的方法或代码块来访问资源,其他线程必须在队列中等待。
4.序列化是存储对象状态以备后用的过程。
- 2023-06-17 厦门学国际商务专业要学外语吗?需要学生具备什么品质?
- 2023-06-17 厦门纳税事务和会计事务有区别吗?中职学财会有前途吗?
- 2023-06-17 厦门计算机与数码设备维修是什么专业?有什么就业岗位?
- 2023-06-17 厦门中专学舞蹈毕业可以干什么?有什么相关专业?
- 2023-06-17 厦门淡水养殖要学什么内容?学生好就业吗?