導航:首頁 > 源碼編譯 > 類外調用私有方法屬於編譯異常嗎

類外調用私有方法屬於編譯異常嗎

發布時間:2022-05-03 15:49:45

java 一個類調用另一個類的private方法

Java調用private方法利用的是Java中的類反射機制 。
定義一個class,定義一個內部private方法:
public class PrivateTest {
private void print() {
System.out.println("this is a private method");
}
}
再定義一個class去訪問剛才定義的private方法,也就是print()如下
import java.lang.reflect.Method;

public class PrivateTest2 {
public static void main(String[] args) {
try {
Method method = PrivateTest.class.getDeclaredMethod("print", new Class[]{});
method.setAccessible(true);
Method.invoke(new PrivateTest(), new Object[] {});
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
}
利用java的反射機制,即使是private方法,也可以被調用使用。

❷ java編譯錯誤:可以在類中訪問private

你所說的其實是JAVA中的子類能否訪問父類的私有成員(方法或屬性),在Java中,子類不繼承父類的私有成員變數,super常用於訪問父類中被子類覆蓋的那些方法或屬性。private修飾符作用范圍,只在本類可見,即使子類也不可訪問。Java是面向對象的,具有封裝性,一個聲明為private的變數後不可以被外界訪問。

❸ c++有趣現象:private的成員函數可以在類的外部調用

發現新大陸了呵呵,不錯,但是,它並不是C++的缺陷或是被設計者所忽視的問題。

當我們使用虛函數的時候,它的訪問規則是在聲明的時候被確定的,而不是在被「子類重寫」(overridden)的時候,虛函數的訪問規則不會受到來自被重寫的子類函數的影響,更進一步說,當某個對象A的引用B(特指間接訪問)用來調用該對象的虛函數時,對於該對象A的一切聲明信息,都取決於該對象的引用B,而不是這個引用所引用的對象A。

C++標准里有對該問題的具體說明:當一個子類函數通過基類的指針調用時,訪問許可權取決於基類對該函數的聲明。

參考C++ Standard ISO/IEC 14882:2003(E) 第11.6節:

11.6 Access to virtual functions [class.access.virt]

The access rules (clause 11) for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. [Example:
class B {
public:
virtual int f();
};
class D : public B {
private:
int f();
};
void f()
{
D d;
B* pb = &d;
D* pd = &d;
pb->f(); //OK: B::f() is public,
// D::f() is invoked
pd->f(); //error: D::f() is private
}
—end example]

Access is checked at the call point using the type of the expression used to denote the object for which the member function is called (B* in the example above). The access of the member function in the class in which it was defined (D in the example above) is in general not known.

至少我們在程序編譯時無法獲知這個指針的值,它會指向何種位置。

經驗:private僅僅是一個訪問限定符,它只限定函數和數據不能被「直接」訪問,而不擔保這些函數和數據會被通過其他方法間接地訪問到,在成員函數中返回一個類私有數據成員的引用也是這個道理。

另外,如果不是特殊的需要,一般來說,這並不是一個好的設計,有點自找麻煩的味道!

❹ java中子類引用父類私有變數時,編譯會否出錯

會出錯,私有變數只能自己使用,子類不能使用

❺ C++中通過類的對象訪問私有成員,編譯時說是錯誤的,怎麼回事

class
A
{
double
x,y;
//類默認訪問方式為私有,所以A類的x,y是在私有部分
//類的私有數據只能通過類的公有方法或者類友元函數訪問
public:
A(double
xx=0,double
yy=0)
{
x=xx;
y=yy;
cout<<"構造函數被調用("<
追問:
謝啦
評論
0
0
載入更多

❻ 一個類能調用另外一個類的私有成員方法嗎

既然是私有了,那麼應該在類外部是不可調用了的吧,想在外部調用,只能改變方法的許可權修飾符了,改成protected或public,如果沒法改變方法許可權修飾符那就在額外加多一個公共方法,對外提供操作那私有方法,老實說,還是不太清楚你的需求,最好打個比方

❼ c++中被聲明為私有的只能被本類中的成員函數引用,類外不能什麼意思

私有的成員函數不能被類外調用,如下所示:
類:A,成員函數test
如下調用則是錯的:
A a;a.test(); // 不能在類外調用類的私有成員函數

❽ Java調用方法的時候怎樣處理異常類型

暈。才學幾天其實沒有特別必要去了解java異常機制,因為很多東西你可能不太明白。這個知識點可以循環漸進的去深入。

簡而言之,異常主要分為兩大類,運行時異常和編譯時異常;

顧名思義,編譯異常就是在編譯過程中會出現的異常,必須提供方法去處理,否則就會編譯不過去。一般採用try..catch代碼塊,去捕獲然後在代碼塊內部提供處理方法。然後會發生異常的類通常要去拋出這個類型的異常,也就是throws**Exception,在類文件編譯的時候通知jvm,這個類會發生如下異常,在內部相對應拋出的處理代碼。舉個例子,讀取文件就是典型的IO異常,如果不提供異常拋出的方法,那麼如果所讀取文件的路徑非法,那麼程序會直接崩潰,為了避免發生這種情況,jvm機制強制要求你必須提供一個處理路徑非法的方法來避免程序崩潰。這類屬於編譯異常。

try{讀取文件的方法
}catch(Exceptione){
如果異常,在這里拋出路徑異常。。。
}finally{
不管是否異常,都要執行--關閉資源
}

另一個運行時異常就比較簡單了,指的是程序運行時才會發生的不可預知的異常;舉個例子,比如定義一個數組[10],但是用戶輸入了11個元素,那麼此時程序會給你拋出RunnableExcrption,告訴程序員,這個地方運行的時候發生錯了,需要進行處理,而整個程序在編譯過程中是完全沒有問題的,這只是使用時才發生的。這類異常不需要強制拋出,只有發生錯誤才去處理就行了。

❾ java反射機制可以調用到私有方法,是不是就破壞了JAVA的卦裝性呢。

這是一個很值得探討的問題,許多人接觸反射時,對反射功能之強大都會抱有懷疑,感覺嚴重破壞了封裝的性質。可是,什麼是封裝,什麼是安全呢?
封裝,是將具體的實現細節隱藏,而把功能作為整體提供給類的外部使用,也就是說,公有方法能夠完成類所具有的功能。當別人使用這個類時,如果通過反射直接調用私有方法,可能根本實現不了類的功能,甚至可能會出錯,因此通過反射調用私有方法可以說是沒有任何用處的,開發人員沒有必要故意去破壞封裝好的類。從這點上看,封裝性並沒有被破壞。
所謂安全,如果意思是保護實現源碼不被別人看見,那沒有作用。不用反射也能輕易獲取源碼。
所以我以為反射機制只是提供了一種強大的功能,使得開發者能在封裝之外,按照特定的需要實現一些功能。就好比核技術,雖然造核彈很危險吧,但造核電站還是很有用處的(這個比喻似乎不是很恰當,將就將就)。

曾經給朋友討論過這個問題,感覺解釋得不是很清楚,大家一起探討探討,看看怎樣表述才能更容易理解:)

❿ c++里被指定為private的函數可以在類外定義嗎

可以的!你試試這個程序,能輸出的
#include <iostream>
using namespace std;
//------------------------------------------------------------------------------
class A
{
void b();
public:
void a();
};
void A::b(){cout<<"I can";}//在類外定義私有函數
void A::a(){b();}//因為b()是私有,所以只能在公有函數中調用了

int main()
{
A Test;
Test.a();

system("pause");
return 0;
}

閱讀全文

與類外調用私有方法屬於編譯異常嗎相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:577
python員工信息登記表 瀏覽:375
高中美術pdf 瀏覽:158
java實現排列 瀏覽:511
javavector的用法 瀏覽:980
osi實現加密的三層 瀏覽:230
大眾寶來原廠中控如何安裝app 瀏覽:912
linux內核根文件系統 瀏覽:241
3d的命令面板不見了 瀏覽:524
武漢理工大學伺服器ip地址 瀏覽:147
亞馬遜雲伺服器登錄 瀏覽:523
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:249
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348