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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

                  多态类中为什么静态的主函数可以调用非静态的类实例化对象
/*
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。
可以将这两类事物进行抽取。
*/
abstract class Student
{
public abstract void study();
public void sleep()
{
  System.out.println("躺着睡");
}
}
class DoStudent
{

public void doSome(Student stu)
{
  stu.study();
  stu.sleep();
}

}
class BaseStudent extends Student
{
public void study()
{
  System.out.println("base study");
}
public void sleep()
{
   System.out.println("坐着睡");
}
}
class AdvStudent extends Student
{
public void study()
{
  System.out.println(" adv study");
}
}


class  DuoTaiDemo3
{
public static void main(String[] args)
{
  DoStudent ds = new DoStudent();//此处为什么在静态的主函数中调用了非静态的方法实例化对象?
  ds.doSome(new BaseStudent());
  ds.doSome(new AdvStudent());
  
//  BaseStudent bs = new BaseStudent();
//  bs.study();
//  bs.sleep();
//  AdvStudent as = new AdvStudent();
//  as.study();
//  as.sleep();
}
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

8 个回复

倒序浏览
在一般的静态函数中也可以调用对象的。如果类也可以静态那都用类名调用就好了,不用创建对象了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
static是为了将某个成员变量或方法关联到类(class)而非实例(instance)。
你不需要创建一个对象就可以直接使用这个类的static成员,因而在static成员中不能调用非static成员,因为后者是关联到对象实例(instance)的。
类的static成员是在类第一次被JRE装载的时候初始化的。
你可以使用如下方法来使用非static成员:
public class A
{
private void someMethod() //非static成员
{}
public static void main(String args)
{
A a = new A(); //创建一个对象实例
a.someMethod(); //现在你可以使用非static方法了
}
}


通常情况下,方法必须通过它的类对象访问。但是如果该方法的使用完全对立于该类的任何对象,
可以利用static关键字。通过该关键字可以创建一个方法或者变量,它能够被自己使用,而不用引用特定的示例。
在方法或变量前面加上static即可。如果一个方法被声明为static,它就能够在它的类任何对象创建之前被访问,而不必引用任何对象。

public class StaticDemo1
{
      //s为静态变量
       public static String s="静态变量";
      //静态方法
       public static void printInfo(){
          System.out.println("静态方法");
      }
      public static void main(String[] args){
          //调用StaticDemo1中的printInfo方法时,不需要创建新的
          //StaticDemo1对象,直接访问即可
           StaticDemo1.printInfo();
          //直接调用StaticDemo1中的s变量时,直接访问即可
           System.out.println(StaticDemo1.s);
      }
}

java中static表示属于类,不必创建对象可以使用,因为常量应该不依赖任何对象。
final表示值不能改变,一般用作常量的静态成员变量访问权限设置为public,因为常量应该允许所有的类或对象访问。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报

静态方法里面不能直接使用在外面定义的非静态方法和非静态属性。因为jvm加载顺序,静态为先的。非静态的东西只有使用new一个对象才存在。这样直接在静态方法里面 new一个其他类,就可以使用其他类了,然后创建其对象,现在你就可以使用非static方法了。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
abstract class Student
{
public abstract void study();
public void sleep()
{
  System.out.println("躺着睡");
}
}
class DoStudent
{

public void doSome(Student stu)
{
  stu.study();
  stu.sleep();
}

}
class BaseStudent extends Student
{
public void study()
{
  System.out.println("base study");
}
public void sleep()
{
   System.out.println("坐着睡");
}
}
class AdvStudent extends Student
{
public void study()
{
  System.out.println(" adv study");
}
}


public class  aa
{
public static void main(String[] args)
{
       
  
  DoStudent ds = new DoStudent(); -----这句话运行后在内存中就已经有对象存在了, 所以这不是在静态方法中调用非静态方法,而是对象调用
  ds.doSome(new BaseStudent());       既然内存中已经有了DoStudent这个对象,那么通过这个对象调用自己的方法当然可以

  
  
  ds.doSome(new AdvStudent());
  
}
}

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
王飞 发表于 2012-7-15 21:20
abstract class Student
{
public abstract void study();

看到你简单的两行字,我懂了。上面的两位同学的回答,太专业了,没看懂!
回复 使用道具 举报
陆鹏 中级黑马 2012-7-16 08:05:09
7#
本帖最后由 陆鹏 于 2012-7-16 08:06 编辑

这里关系到理解main方法的语法了。
Java一开始就加载main类了。
因为Java虚拟机在首先执行main方法时不必创建对象,所以该方法必须是static的。
然后在静态方法main中可以创建对象,DoStudent ds = new DoStudent()算是创建了对象,所以在静态方法main中可以访问非静态方法。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
在静态方法中new了对象之后就可以调用该对象的方法了,即使被调用的方法是非静态的。
这个不同于直接在静态方法中调用非静态方法。
回复 使用道具 举报
王飞 中级黑马 2012-7-16 13:44:03
9#
丁朋 发表于 2012-7-16 07:34
看到你简单的两行字,我懂了。上面的两位同学的回答,太专业了,没看懂! ...

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