导航:首页 > 源码编译 > 类外调用私有方法属于编译异常吗

类外调用私有方法属于编译异常吗

发布时间: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