黑马程序员技术交流社区

标题: java主函数问题 [打印本页]

作者: 不冬眠的蚂蚁    时间: 2014-1-11 12:21
标题: java主函数问题
java主函数时static 类型的方法 为什么(用对象)就可以去访问本类或外部类非静态函数和成员变量 不是说静态成员只能访问静态成员吗?
作者: 黄晓鑫    时间: 2014-1-11 13:11
静态只能访问静态 main函数是一个特殊的函数 要去访问外部类的成员必须创建对象 或者该外部类必须有静态方法 才可以直接类名.调用
作者: mrwise1991    时间: 2014-1-12 18:18
不错,静态调用非静态属性时会出现问题,但这里你所说的,可能没有正确的表达你自己的意思吧?或许贴上代码会更好点
作者: Lillian    时间: 2014-1-12 22:56
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. }
复制代码

作者: 不冬眠的蚂蚁    时间: 2014-1-12 23:00
Lillian 发表于 2014-1-12 22:56
staticd的方法只能访问静态成员的意思是指 像面向过程中调用方法那样去访问,这些方法在同一个类中:

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2