包含java仿真之銀行出納員的詞條

本文目錄一覽:

JAVA線程的機制有哪些?

Java的線程機制 摘 要: 多線程機制是Java的重要技術,闡述了線程和進程的差別;Java中線程4個狀態之間的轉換;並結合例子說明了兩種創建線程的方法。 線程是指程序中能順序執行的一個序列。一個線程只有一個入口點� 但可能有幾個出口點� 不過,每個時刻的執行點總是只有一個。線程是不能獨立運行的程序,而只是某個整體程序內部的一個順序執行流。 多線程是Java的一個重要特點。如果一個程序是單線程的,那麼,任何時刻都只有一個執行點。這種單線程執行方法使系統運行效率低,而且,由於必須依靠中斷來處理輸入/輸出。所以,當出現頻繁輸入/輸出或者有優先級較低的中斷請求時,實時性就變得很差。多線程系統可以避免這個缺點。所謂多線程,就是通過系統的調度使幾個具有不同功能的程序流即線程同時並行地運行。 在單處理器計算機系統中,實際上是不可能使多個線程真正並行運行的,而要通過系統用極短的時間、極快的速度對多個線程進行切換,宏觀上形成多個線程並發執行的效果。 1 線程和進程機制上的差別 線程和進程很相象,它們都是程序的一個順序執行序列,但兩者又有區別。進程是一個實體,每個進程有自己獨立的狀態,並有自己的專用數據段,創建進程時, 必須建立和複製其專用數據段,線程則互相共享數據段。同一個程序中的所有線程只有一個數據段, 所以, 創建線程時不必重新建立和複製數據段。由於數據段建立和複製這方面的差異,使線程的建立和線程間的切換速度大大優於進程,另一方面,線程又具備進程的大多數優點。 假設銀行系統辦理存款和取款手續,將帳本看成數據段。如果按進程這種機制,那麼,當儲戶去存/取款時,銀行應先把帳本複製一遍,為儲戶建立一個獨立的帳本再結算。如果按線程機制, 那麼,銀行里所有的出納員都用同一個帳本,儲戶來辦存/取款時,也從這個帳本直接結算。用線程機制省去了數據段複製這一步顯然是線程獨具的特點。 由於多個線程共享一個數據段,所以,也出現了數據訪問過程的互斥和同步問題,這使系統管理功能變得相對複雜。 總的來說,一個多線程系統在提高系統的輸入/輸出速度、有效利用系統資源、改善計算機通信功能以及發揮多處理器硬件功能方面顯示了很大優勢。因此,一些最新的操作系統如Windows95、Windows98、Windows NT等都提供了對多線程的支持。但是,在多線程操作系統下設計多線程的程序仍然是一個比較複雜和困難的工作。由於需要解決對數據段的共享,所以,原則上應該從程序設計角度採用加鎖和釋放措施,稍有不慎,便會使系統產生管理上的混亂。 而Java從語言一級提供對多線程的支持,這樣,可由語言和運行系統聯合提供對共享數據段的管理功能和同步機制,使得多線程並行程序設計相對比較容易。 2 Java線程的生命周期 每個線程都是和生命周期相聯繫的,一個生命周期含有多個狀態,這些狀態間可以互相轉化。 Java的線程的生命周期可以分為4個狀態;創建(new)狀態;可運行(runnable)狀態;不執行(notrunnable)狀態;消亡(dead)狀態。 創建狀態是指創建一個線程對應的對象的過程,Java系統中,些對象都是從Java.lang包內一個稱為Thread的類用關鍵字new創建的。剛創建的線程不能執行,必須向系統進行註冊、分配必要的資源後才能進入可運行狀態,這個步驟是由start操作完成的,而處於可運行狀態的線程也未必一定處於運行中,它有可能由於外部的I/O請求而處於不運行狀態。進入消亡狀態後,此線程就不再存在了。 一個線程創建之後,總是處於其生命周期的4個狀態之一中,線程的狀態表明此線程當前正在進行的活動,而線程的狀態是可以通過程序來進行控制的,就是說,可以對線程進行操作來改變狀態。 這些操作包括啟動(start)、終止(stop)、睡眠(sleep)、掛起(suspend)、恢復(resume)、等待(wait)和通知(notify)。每一個操作都對應了一個方法� 這些方法是由軟件包Java.lang提供的。通過各種操作,線程的4個狀態之間可按圖1所示進行轉換。 2.1 創建(new)狀態 如果創建了一個線程而沒有啟動它,那麼,此線程就處於創建狀態。比如,下述語句執行以後,使系統有了一個處於創建狀態的線程myThread:� Thread myThread=new MyThreadClass(); 其中,MyThreadClass()是Thread的子類,而Thread是由Java系統的Java.lang軟件包提供的。處於創建狀態的線程還沒有獲得應有的資源,所以,這是一個空的線程,線程只有通過啟動後,系統才會為它分配資源。對處於創建狀態的線程可以進行兩種操作: 一是啟動(start)操作,使其進入可運行狀態;二是終止(stop)操作,使其進入消亡狀態。如果進入到消亡狀態,那麼,此後這個線程就不能進入其它狀態,也就是說,它不復存在了。 start方法是對應啟動操作的方法,其具體功能是為線程分配必要的系統資源,將線程設置為可運行狀態,從而可以使系統調度這個線程。 2.2 可運行(runnable)狀態 如果對一個處於創建狀態的線程進行啟動操作,則此線程便進入可運行狀態。比如,用下列語句� myThread.start();�  � 則使線程myThread進入可運行狀態。上述語句實質上是調用了線程體即run()方法,注意,run()方法包含在myThread線程中,也就是先由java.lang包的Thread類將run()方法傳遞給子類MyThreadClass(),再通過創建線程由子類MyThreadClass,傳遞給線程myThread。 線程處於可運行狀態只說明它具備了運行條件,但可運行狀態並不一定是運行狀態,因為在單處理器系統中運行多線程程序,實際上在一個時間點只有一個線程在運行,而系統中往往有多個線程同時處於可運行狀態,系統通過快速切換和調度使所有可運行線程共享處理器,造成宏觀上的多線程並發運行。可見,一個線程是否處於運行狀, 除了必須處於可運行狀態外,還取決於系統的調度。 在可運行狀態可以進行多種操作,最通常的是從run()方法正常退出而使線程結束,進入消亡狀態。 此, 還可以有如下操作� 掛起操作,通過調用suspend方法來實現; 睡眠操作,通過調用sleep方法來實現; 等待操作,通過調用wait方法來實現; 退讓操作,通過調用yield方法來實現; 終止操作,通過調用stop方法來實現。 前面三種操作都會使一個處於可運行狀態的線程進入不可運行狀態。比如,仍以myThread線程為例,當其處於可運行狀態後,再用如下語句� myThread.sleep (5000); 則調用sleep方法使myThread線程睡眠5s(5000ms)。這5s內,此線程不能被系統調度運行,只有過5s後,myThread線程才會醒來並自動回到可運行狀態。 如果一個線程被執行掛起操作而轉到不可運行狀態,則必須通過調用恢復(resume)操作,才能使這個線程再回到可運行狀態。 退讓操作是使某個線程把CPU控制權提前轉交給同級優先權的其他線程。 對可運行狀態的線程也可以通過調用stop方法使其進入消亡狀態。 2.3 不可運行(not runnable)狀態 不可運行狀態都是由可運行狀態轉變來的。一個處於可運行狀態的線程,如果遇到掛起(suspend)操作、睡眠(sleep)操作或者等待(wait)操作,就會進入不可運行狀態。 另外,如果一個線程是和I/O操作有關的,那麼,在執行I/O指令時,由於外設速度遠遠低於處理器速度而使線程受到阻, 從而進入不可運行狀態,只有外設完成輸入/輸出之後,才會自動回到可運行狀態。線程進入不可運行狀態後,還可以再回到可運行狀態,通常有三種途徑使其恢復到可運行狀態。 一是自動恢復。通過睡眠(sleep)操作進入不可運行狀態的線程會在過了指定睡眠時間以後自動恢復到可運行狀態,由於I/O阻塞而進入不可運行狀態的線程在外設完成I/O操作後,自動恢復到可運行狀態。 二是用恢復(resume)方法使其恢復。如果一個線程由於掛起(suspend)操作而從可運行狀態進入不可運行狀態,那麼,必須用恢復(resume)操作使其再恢復到可運行狀態。 三是用通知(notify或notifyAll)方法使其恢復。如果一個處於可運行狀態的線程由於等待(wait)操作而轉入不可運行狀態,那麼,必須通過調用notify方法或notifyAll方法才能使其恢復到可運行狀態,採用等待操作往往是由於線程需要等待某個條件變量,當獲得此條件變量後,便可由notify或ontifyAll方法使線程恢復到可運行狀態。 恢復到可運行狀態的每一種途徑都是有針對性的,不能交叉。比如,對由於阻塞而進入不可運行狀態的線程採用恢復操作將是無效的。 在不可運行狀態,也可由終止(stop)操作使其進入消亡狀態。 2.4 消亡(dead)狀態 一個線程可以由其他任何一個狀態通過終止(stop)操作而進入消亡狀態。 線程一旦進入消亡狀態,那它就不再存在了,所以也不可能再轉到其它狀態。 通常,在一個應用程序運行時,如果通過其它外部命令終止當前應用程序,那麼就會調用(stop)方法終止線程。但是,最正常、最常見的途徑是由於線程在可運行狀態正常完成自身的任務而″壽終正寢″,從而進入消亡狀態,這個完成任務的動作是由run方法實現的。 3 Java線程的兩種創建途徑 一種途徑是通過對Thread的繼承來派生一個子類,再由此子類生成一個對象來實現線程的創建,這是比較簡單直接的辦法。Thread類包含在系統API提供的8個軟件包之一Java.lang中,Thread類中包含了很多與線程有關的方, 其中,一個名為run的方法就是用來實現線程行為的。比如:� 1 import java.lang.*� //引用lang包 2 class Mango exteds Thread { 3 public void run() { 4 ...... 5 �} 6 �} 上述程序段中,第1行語句引用軟件包lang,這樣做是為了給編譯器一個信息,從而使後面程序中有關lang包中的方法可直接用方法名,而不必帶前綴「Java.lang」。第2行語句是從lang包Thread派生一個子類Mango, 而這個子類中提供了run方法的實現,這樣,運行時,將由子類Mango 的 run方法置換父類Thread的run方法。 不過這一步還沒有創建線, 必須由子類生成一個對象,並且進行啟動操作,這樣才能得到一個處於可運行狀態的線程。生成對象其實就是完成線程的創建,而啟動是對已創建的線程進行操作。具體語句如下:� Mango t=new Mango();  � t.start();  � 上面先用關鍵字new使線程進入創建狀態,又調用start()方法使線程進入可運行狀態。注意,start()方法是由Thread繼承給子類Mango、然後又在生成對象時由對象t從類Mango得到的。 另一種途徑是通過一個類去繼承接口runnable來實現線程的創建� 而這個類必須提供runnable接口中定義的方法run()的實現。runnable是Java.lang包中的一個接口,在runnable接口中,只定義了一個抽象方法run()。所以,如用這種途徑來創建線程,則應先由一個類連接接口runnable,並且提供run()方法的實現。比如,下面的程序段實現了與接口的連接。 1 public class xyz implements Runnable{ 2 int i; � 3 public voed run(){ 4 while (true){  � 5 System.out.println(“Hello”+i++); 6 � } 7 � } 8 � } 然後再創建一個線程� runnable r=new xyz();  � Thread t=new Thread(r); 這種途徑創建線程比第一種途徑靈活。當一個類既需要繼承一個父類又要由此創建一個線程時,由於Java不支持多重繼承,這樣,用第一種途徑將行不通,因為,按此思路創建線程也是以繼承的方法實現的。 於是,就需要一個類既繼承Thread類,又繼承另一個父類。但用接口方法卻能實現這個目標。 4 線程的啟動和終止 Thread的start()方法對應於啟動操作,它完成兩方面的功能:一方面是為線程分配必要的資源,使線程處於可運行狀態,另一方面是調用線程的run()方法置換Thread的中run()方法或者置換runnable中的run()方法來運行線程。 使用start()方法的語句很簡單,即: ThreadName.start(); 下面的程序段先創建並啟動線程myThread, 然後使用sleep()方法讓其睡眠20000ms即20s,使其處於不可運行狀態,過20s後,線程又自動恢復到可運行狀態。 Thread MyThread=new MyThreadClass(); MyThread.start();�  � try{ � MyThread.sleep(20000); �} catch(InterrujptedException e){ }

JAVA消息傳遞的具體含義

向大家解釋Java的多項設計思想,並從概念上解釋面向對象的程序設計。但要注意在閱讀完本章後,並不能立即編寫出全功能的Java程序。所有詳細的說明和示例會在本書的其他章節慢慢道來。

1.1 抽象的進步

所有編程語言的最終目的都是提供一種「抽象」方法。一種較有爭議的說法是:解決問題的複雜程度直接取決於抽象的種類及質量。這兒的「種類」是指準備對什麼進行「抽象」?彙編語言是對基礎機器的少量抽象。後來的許多「命令式」語言(如FORTRAN,BASIC和C)是對彙編語言的一種抽象。與彙編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們着重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位於「方案空間」)與實際解決的問題模型(位於「問題空間」)之間,程序員必須建立起一種聯繫。這個過程要求人們付出較大的精力,而且由於它脫離了編程語言本身的範圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的「編程方法」學科。

為機器建模的另一個方法是為要解決的問題製作模型。對一些早期語言來說,如LISP和APL,它們的做法是「從不同的角度觀察世界」——「所有問題都歸納為列表」或「所有問題都歸納為算法」。PROLOG則將所有問題都歸納為決策鏈。對於這些語言,我們認為它們一部分是面向基於「強制」的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的範圍,就會顯得非常笨拙。

面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具表達問題空間內的元素。由於這種表達非常普遍,所以不必受限於特定類型的問題。我們將問題空間中的元素以及它們在方案空間的表示物稱作「對象」(Object)。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與我們以前見過的相比,這無疑是一種更加靈活、更加強大的語言抽象方法。總之,OOP允許我們根據問題來描述問題,而不是根據方案。然而,仍有一個聯繫途徑回到計算機。每個對象都類似一台小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的「對象」或者「物體」相比,編程「對象」與它們也存在共通的地方:它們都有自己的特徵和行為。

Alan Kay總結了Smalltalk的五大基本特徵。這是第一種成功的面向對象程序設計語言,也是Java的基礎語言。通過這些特徵,我們可理解「純粹」的面向對象程序設計方法是什麼樣的:

(1) 所有東西都是對象。可將對象想像成一種新型變量;它保存着數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然後在程序中將其表達為一個對象。

(2) 程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。為了向對象發出請求,需向那個對象「發送一條消息」。更具體地講,可將消息想像為一個調用請求,它調用的是從屬於目標對象的一個子例程或函數。

(3) 每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可製作出新型對象。所以,儘管對象的概念非常簡單,但在程序中卻可達到任意高的複雜程度。

(4) 每個對象都有一種類型。根據語法,每個對象都是某個「類」的一個「實例」。其中,「類」(Class)是「類型」(Type)的同義詞。一個類最重要的特徵就是「能將什麼消息發給它?」。

(5) 同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由於類型為「圓」(Circle)的一個對象也屬於類型為「形狀」(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味着可讓程序代碼統一指揮「形狀」,令其自動控制所有符合「形狀」描述的對象,其中自然包括「圓」。這一特性稱為對象的「可替換性」,是OOP最重要的概念之一。

一些語言設計者認為面向對象的程序設計本身並不足以方便解決所有形式的程序問題,提倡將不同的方法組合成「多形程序設計語言」(注釋②)。

②:參見Timothy Budd編著的《Multiparadigm Programming in Leda》,Addison-Wesley 1995年出版。

1.2 對象的接口

亞里士多德或許是認真研究「類型」概念的第一人,他曾談及「魚類和鳥類」的問題。在世界首例面向對象語言Simula-67中,第一次用到了這樣的一個概念:

所有對象——儘管各有特色——都屬於某一系列對象的一部分,這些對象具有通用的特徵和行為。在Simula-67中,首次用到了class這個關鍵字,它為程序引入了一個全新的類型(clas和type通常可互換使用;注釋③)。

③:有些人進行了進一步的區分,他們強調「類型」決定了接口,而「類」是那個接口的一種特殊實現方式。

Simula是一個很好的例子。正如這個名字所暗示的,它的作用是「模擬」(Simulate)象「銀行出納員」這樣的經典問題。在這個例子里,我們有一系列出納員、客戶、帳號以及交易等。每類成員(元素)都具有一些通用的特徵:每個帳號都有一定的餘額;每名出納都能接收客戶的存款;等等。與此同時,每個成員都有自己的狀態;每個帳號都有不同的餘額;每名出納都有一個名字。所以在計算機程序中,能用獨一無二的實體分別表示出納員、客戶、帳號以及交易。這個實體便是「對象」,而且每個對象都隸屬一個特定的「類」,那個類具有自己的通用特徵與行為。

因此,在面向對象的程序設計中,儘管我們真正要做的是新建各種各樣的數據「類型」(Type),但幾乎所有面向對象的程序設計語言都採用了「class」關鍵字。當您看到「type」這個字的時候,請同時想到「class」;反之亦然。

建好一個類後,可根據情況生成許多對象。隨後,可將那些對象作為要解決問題中存在的元素進行處理。事實上,當我們進行面向對象的程序設計時,面臨的最大一項挑戰性就是:如何在「問題空間」(問題實際存在的地方)的元素與「方案空間」(對實際問題進行建模的地方,如計算機)的元素之間建立理想的「一對一」對應或映射關係。

如何利用對象完成真正有用的工作呢?必須有一種辦法能向對象發出請求,令其做一些實際的事情,比如完成一次交易、在屏幕上畫一些東西或者打開一個開關等等。每個對象僅能接受特定的請求。我們向對象發出的請求是通過它的「接口」(Interface)定義的,對象的「類型」或「類」則規定了它的接口形式。「類型」與「接口」的等價或對應關係是面向對象程序設計的基礎。

下面讓我們以電燈泡為例:

Light lt = new Light();

lt.on();

在這個例子中,類型/類的名稱是Light,可向Light對象發出的請求包括包括打開(on)、關閉(off)、變得更明亮(brighten)或者變得更暗淡(dim)。通過簡單地聲明一個名字(lt),我們為Light對象創建了一個「句柄」。然後用new關鍵字新建類型為Light的一個對象。再用等號將其賦給句柄。為了向對象發送一條消息,我們列出句柄名(lt),再用一個句點符號(.)把它同消息名稱(on)連接起來。從中可以看出,使用一些預先定義好的類時,我們在程序里採用的代碼是非常簡單和直觀的。

銀行出納崗位職責

1.按照國家有關現金管理和銀行結算制度的規定,辦理現金收付和銀行結算業務。出納員應嚴格遵守現金開支範圍,非現金結算範圍不得用現金收付;遵守庫存限額,超限額的現金按規定及時送存銀行;現金管理要嚴格做到日清日結,賬面餘額與庫存現金每日下班前應核對,發現問題,及時查對;企業銀行存款日記賬也要與銀行對賬單及時核對,如有不符,應立即通知銀行調整。

2.根據會計制度的規定,在辦理現金和銀行存款收付業務時,要嚴格核對有關原始憑證,再據以編製收付款憑證,然後根據所編製的收付款憑證按時間先後順序逐日逐筆地登記現金日記賬和銀行存款日記賬,並結出餘額。

3.按照國家外匯管理和結、購匯制度的規定及有關批件,辦理外匯出納業務。隨着經濟的發展,國際間經濟交往日益頻繁,外匯出納也越來越重要。所以出納人員應熟悉國家外匯管理制度,及時辦理結匯、購匯、付匯,避免外匯損失。

4.掌握銀行存款餘額,不準簽發空頭支票,不準出租、出借銀行賬戶為其他單位辦理結算。這是施工員考試必須遵守的一條紀律,也是防止經濟犯罪、維護經濟秩序的重要方面。出納員應嚴格遵守支票和銀行賬戶的使用和管理,從出納這個崗位上堵住結算漏洞。

5.保管庫存現金和各種有價證券(如國庫券、債券等)的安全與完整。要建立適合本單位情況的現金和有價證券保管責任制,如發生短缺,屬於出納員責任的要進行賠償。

6.保管有關印章、空白收據和空白支票。印章、空白票據的安全保管十分重要,出納員必須高度重視,建立嚴格的管理辦法。通常,單位財務公章和出納名章要實行分管,交由出納員保管的出納印章要嚴格規定使用用途,各種票據要辦理領用和註銷手續。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/219537.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 10:59
下一篇 2024-12-09 10:59

相關推薦

  • 銀行資金管理系統總結

    銀行資金管理系統是銀行日常業務運營的核心支撐系統,主要負責處理銀行的資金流動、結算、清算等業務。本文將從功能特點、技術架構、安全性以及未來發展趨勢等多個方面對銀行資金管理系統進行詳…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論