A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙涛00 中级黑马   /  2013-10-25 19:18  /  1466 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙涛00 于 2013-10-27 19:16 编辑

public static void main(String[] args)
{
String str = "java";
public String str2 = "itcast";
}
这两种有什么区别关于public成员修饰符。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

正序浏览
成员变量才有访问修饰符
回复 使用道具 举报
本帖最后由 MeryStyle 于 2013-10-27 14:30 编辑

首先,str和str2不是成员变量。变量和方法在不加访问修饰符的情况下默认都是protected。protected和public的区别在于protected只可以被其子类和同一包的类访问到,而public可以被任何类访问到。对于私有成员,单讨论其访问修饰符范围是无意义的(个人认为),protected和public都一样,主要看其所在方法的访问修饰符是什么
回复 使用道具 举报
恩,懂了。
回复 使用道具 举报
public protected private 还有一个是default 这是Java的四个权限修饰符。
其中default这个修饰符没有显式的声明,在成员变量和方法前什么修饰符都不用,默认也就default。
public static void main(String[] args)
{
String str = "java";
public String str2 = "itcast";
}
所以你那个String str = "java";也就是default修饰符修饰的变量。
与下面的那个public String str2 = "itcast";的分别也就是访问修饰符的访问权限的分别了。
下面这个图说明它们的分别:
由图可知:它们的访问权限为 public > protected > default > private

2013-10-26_164330.png (34.07 KB, 下载次数: 11)

2013-10-26_164330.png
回复 使用道具 举报
在我一楼的例子中第一个字符串(str1)是没有改过来的,就是因为他没有public修饰?所以才问这个问题
回复 使用道具 举报
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。
1、一个编译单元只能有一个public类的原因:
第一、public的意思是所有类都能访问,包括包以外的类。public是作为这个编译单元的公开接口存在的。
第二、java程序的入口是main方法,所以被定为public的这个类一定是main方法的类,且这个类的名称要和文件名一直,因为虚拟机是要开始找main方法这个入口的。
第三、你可以根据需要,添加任意辅助功能的public权限的类,但是如果这个编译单元(注意是编译单元)里面有两个或以上public类的话,那么编译器就会报错。2、被public修饰的类与文件名必须同名的原因:
第一、java是被编译执行的,它在运行时并不是将你写的所有类都先加载一遍的,而是当遇到import或使用到了其他类的时候,才会去在文件目录中找相应的class文件的。
第二、对于一个public类。上面也说了,是可以被项目中的任何一个类引用的,只需通过import导入即可。既然是作为虚拟机入口的main函数要用public修饰而成为一个公共接口,那么将类名和文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相关的信息;但是你如果不这么做,虚拟机很难去找,开销也会跟着增大的。
public作为一个公共接口(此接口非interface这个接口),修饰作为虚拟机入口的main函数,就是为了方便虚拟机找到相应的类,从而节省开销。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
  1. public class ReflectPoint {

  2.         String str1 = "sontao";
  3.         public String str2 = "foxiaotao";//此处必须是public
  4.         public String str3 = "ou mygod";//此处必须是public
  5.         public String toString()
  6.         {
  7.                 return str1+" : "+str2+" : "+str3;
  8.         }
  9. }
复制代码
  1. import java.lang.reflect.Field;

  2. public class ReflectChangeString {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)throws Exception {
  7.                 // TODO Auto-generated method stub
  8.                 ReflectPoint rpt = new ReflectPoint();
  9.                
  10.                 Field[] fields = rpt.getClass().getFields();//得到ReflectPoint类下所有的成员变量
  11.                 for(Field field : fields)
  12.                 {
  13.                         if(field.getType()==String.class)//如果成员变量的字节码和String.class是同一个字节码,说明这是一种String类的变量
  14.                         {
  15.                                 String oldValues = (String)field.get(rpt);
  16.                                 String newValues = oldValues.replace('o','u');
  17.                                 field.set(rpt, newValues);
  18.                         }
  19.                 }
  20.                 System.out.println(rpt);
  21.         }

  22. }
复制代码
结果是:sontao : fuxiautau : uu mygud
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马