java成员变量和方法的public等访问限定符的访问权限

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在学习java的过程中,我写类经常会用到public,private 和protected 的,我的基本经验就是一般类的成员变量都是用private,方法用public,类内部用的方法用protected,如果是存在子类的,那我就会把父类中的成员变量变为protected。(其余的看具体实际情况而定)

不过在一些公司的笔试题中,他们会要求你具体的写出像public这些访问限定符的作用域。其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了。

这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新。

貌似默认(无)是friendly

如果你看到这里还不是很了解上面的表,或者是很久就没看书了,忘记了上面的表的内容的意义,那下面的例子就是帮助你温故知新的好东东。

例如,有一个包demo中的类P,它有一个private 成员变量data,一个public 默认构造方法,一个public 访问方法getData(),一个protected修改方法setData(),还有一个默认访问方式的辅助方法print()。

package demo;

public class P{

private int data;

public P(){

setData(0);

}

public int getData(){

return data;

}

protected void setData(int v){

data = v;

}

void print(){

System.out.println("used!")

}

}

本类的不用说了,在本类里面才不管什么访问限定符呢。

如有类Q,扩展了P,所以可以调用P的默认构造方法、访问方法getData()和修改方法 setData()。但类Q不能直接访问P的成员变量data,辅助方法print()也不行(可以把默认,也就是没加任何访问限定符,理解为"包访问 ",在子类中不能直接访问,但在同包中的类却可以访问)。

import demo.P

public class Q extends P{

public Q(){

super(); <---------------------------Q可以访问父类的默认构造方法

}

public Q(int v){

setData(v); <------------------------Q可以访问父类的protected的方法

}

public String toString(){

int v = getData(); <--------------------Q 可以访问父类的public的方法

return String.valueOf(v);

}

public void invalid1(){

data = 12;

<---------------------------Q不能直接访问父类的private数据域

}

public void invalid2(){

print();<-------------------------------Q不能直接访问父类默认权限的方法

}

}

对于默认访问,只有当2个类在同一个包中的时候,才可以互访对方的默认访问权限的成员。因此,由于类Q并不是包 demo 的一部分,它不可以访问P的辅助方法print()。

现在考虑包 demo 中的类R。R的方法可以调用P中 public 的默认构造方法和访问方法 getData(),protected 的修改方法 setData(),以及默认访问权限的辅助方法 print()。然而,类R不能直接访问P的 private 成员变量data。

package demo;

public class R{

private P p;

public R(){

p = new P();

<--------------------------R 可以访问P的默认构造方法

}

public void set(int v){

p.setData(v);

<---------------------------R可以访问P的protected的方法

public int get(){

return p.getData();

<---------------------R可以访问P的public的方法

}

public void use(){

p.print(); <-------------------------------R可以访问P的默认权限的方法

}

public void invalid1(){

p.data = 12;<------------------------- R不能直接访问P的private的数据域

}

}

下面考虑类S,它既不是demo包的一部分,也没有直接或者间接地扩展自类P。所以,类S仅仅可以调用P中的 public 访问权限的默认构造方法和访问方法getData()。

import demo.P;

public class S{

private P p;

public S(){

p = new P();

<-------------------------------S可以访问P的public的默认构造方法

}

public int get(){

return p.getData();

<------------------------S可以访问P的public的方法

相关文档
最新文档