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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不冬眠的蚂蚁 中级黑马   /  2014-1-11 12:21  /  1265 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java主函数时static 类型的方法 为什么(用对象)就可以去访问本类或外部类非静态函数和成员变量 不是说静态成员只能访问静态成员吗?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

5 个回复

倒序浏览
静态只能访问静态 main函数是一个特殊的函数 要去访问外部类的成员必须创建对象 或者该外部类必须有静态方法 才可以直接类名.调用
回复 使用道具 举报
不错,静态调用非静态属性时会出现问题,但这里你所说的,可能没有正确的表达你自己的意思吧?或许贴上代码会更好点
回复 使用道具 举报
staticd的方法只能访问静态成员的意思是指 像面向过程中调用方法那样去访问,这些方法在同一个类中:
  1. class Student{
  2.         private String name;
  3.         private int age;
  4.         private long id;
  5.         public Student(String name, int age){
  6.                 this.name = name;
  7.                 this.age = age;
  8.         }
  9.        
  10.         public static Student getStudent(){
  11.                 return new Student("zhangsan",18);
  12.         }
  13.        
  14.         public String getName(){
  15.                 return this.name;
  16.         }
  17.        
  18.         public int getAge(){
  19.                 return this.age;
  20.         }
  21.        
  22.         public static void main(String[] args){
  23.                 getStudent();//正确 ,静态访问静态
  24.                 getAge();//错误,静态只能访问静态
  25.         }
  26. }
复制代码


static之所以只能访问静态是因为如果直接访问getAge,他是对对象的操作,但是静态函数执行时没有对象,所以就会出错。
这个跟是不是main函数没有关系的,可以看一下下面的代码:
  1. public class PersonTest {

  2.         public static void main(String[] args){
  3.                 Student stu1 = new Student("tom", 20);
  4.                 stu1.getName(); //正确,因为代码知道去访问谁  这里是对对象的非静态方法的调用
  5.                 Student.getStudent();//静态要用类名进行调用
  6.                
  7.                 test1(); //不使用任何前缀调用本类的静态方法
  8.                 test2();//错误,静态只能调用静态
  9.                 new PersonTest().test2();//通过对象来调用非静态方法
  10.         }
  11.        
  12.         public static void test1(){
  13.                 Student stu1 = new Student("tom", 20);
  14.                 stu1.getName(); //正确,因为代码知道去访问谁  这里是对对象的非静态方法的调用
  15.                 //不是main函数,普通的static方法也是可以这样子去调用对象的非静态方法
  16.         }
  17.        
  18.         public void test2(){
  19.                 System.out.println("非静态方法");
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
Lillian 发表于 2014-1-12 22:56
staticd的方法只能访问静态成员的意思是指 像面向过程中调用方法那样去访问,这些方法在同一个类中:

谢谢 和详细
回复 使用道具 举报
这一点,我以前有点理解误区,直到今天我看了陈昊鹏的《JAVA编程思想》,我才豁然开朗,书中原文是这样的:由于在用static方法前不需要创建对象所以对于static方法,不能简单地通过调用其他非static属性和方法而没有指定某个命名对象来直接访问非static属性或方法,因为非static属性或方法必须与某一特定对象关联。也就是说我们可以在static方法中,通过实例化的对象来访问其中的非static属性或方法!!!!!

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马