黑马程序员技术交流社区
标题: 多态类中为什么静态的主函数可以调用非静态的类实例化... [打印本页]
作者: 丁朋 时间: 2012-7-15 20:35
标题: 多态类中为什么静态的主函数可以调用非静态的类实例化...
多态类中为什么静态的主函数可以调用非静态的类实例化对象
/*
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。
可以将这两类事物进行抽取。
*/
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();
}
}
作者: 陆强强 时间: 2012-7-15 20:48
在一般的静态函数中也可以调用对象的。如果类也可以静态那都用类名调用就好了,不用创建对象了。
作者: 黄昆 时间: 2012-7-15 20:51
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,因为常量应该允许所有的类或对象访问。
作者: 苑占丽 时间: 2012-7-15 20:59
静态方法里面不能直接使用在外面定义的非静态方法和非静态属性。因为jvm加载顺序,静态为先的。非静态的东西只有使用new一个对象才存在。这样直接在静态方法里面 new一个其他类,就可以使用其他类了,然后创建其对象,现在你就可以使用非static方法了。
作者: 王飞 时间: 2012-7-15 21:20
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());
}
}
作者: 丁朋 时间: 2012-7-16 07:34
王飞 发表于 2012-7-15 21:20 
abstract class Student
{
public abstract void study();
看到你简单的两行字,我懂了。上面的两位同学的回答,太专业了,没看懂!
作者: 陆鹏 时间: 2012-7-16 08:05
本帖最后由 陆鹏 于 2012-7-16 08:06 编辑
这里关系到理解main方法的语法了。
Java一开始就加载main类了。
因为Java虚拟机在首先执行main方法时不必创建对象,所以该方法必须是static的。
然后在静态方法main中可以创建对象,DoStudent ds = new DoStudent()算是创建了对象,所以在静态方法main中可以访问非静态方法。
作者: 党巾水 时间: 2012-7-16 11:37
在静态方法中new了对象之后就可以调用该对象的方法了,即使被调用的方法是非静态的。
这个不同于直接在静态方法中调用非静态方法。
作者: 王飞 时间: 2012-7-16 13:44
丁朋 发表于 2012-7-16 07:34 
看到你简单的两行字,我懂了。上面的两位同学的回答,太专业了,没看懂! ...
呵呵 谢啦:P
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |