黑马程序员技术交流社区
标题:
两段代码中的问题。<已解决>
[打印本页]
作者:
王德升
时间:
2012-5-28 17:39
标题:
两段代码中的问题。<已解决>
本帖最后由 王德升 于 2012-6-3 23:15 编辑
//第一段代码。
abstract class Animal
{
public abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("吃饲料");
}
public void gongDi()
{
System.out.println("拱地");
}
}
class DuoTaiDemo1
{
public static void main(String[] args)
{
funcation(new Dog());
/*
Cat c1 = new Cat();
//c.eat();
//c.catchMouse();
funcation(c1);
//Dog d1 = new Dog();
funcation(new Dog());
Pig p = new Pig();
p.eat();
*/
}
public static void funcation(Cat c)
{
c.eat();
}
/*
public static void funcation(Dog d)
{
d.eat();
}
*/
}
1,上面为什么在主函数里面不能这样调用:funcation(new Dog1());?
但是funcation(d)却可以呢,为什么d1却是可以的呢。
2,上面的Cat,Dog,里面的特有方法可以私有吗?即private。
3,funcation加static是不是因为要被主函数调用,因为主函数是静态的,
所以它也要加静态的?
//第二段代码。
abstract class Student
{
public abstract void study();
public void sleep()
{
System.out.println("躺着睡");
}
}
class DoStudent
{
public void doSome(Student s)//为什么这里加不加静态都可以?都可以运行成功。
{
s.study();
s.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 studay");
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
//BaseStudent bs = new BaseStudent();
//doStudent(new BaseStudent());
//doStudent(new AdvStudent());
//bs.study();
//bs.sleep();
/*
AdvStudent as = new AdvStudent();
as.study();
as.sleep();
*/
}
/*
public static void doStudent(BaseStudent bs)//这里不加静态就会报错。这是为什么呢?
{
//BaseStudent bs = new BaseStudent();
bs.study();
bs.sleep();
}
public static void doStudent(AdvStudent as)
{
as.study();
as.sleep();
}
*/
}
//上面的主函数调用自己类中的方法时候要加静态,而调用外部类的时候加不加都行呢,为什么?
作者:
小小企鹅
时间:
2012-5-28 18:33
本帖最后由 小小企鹅 于 2012-10-27 22:35 编辑
1.funcation(new Dog1());没有定义Dog1类所以不能调用
2.可以
3.静态代码块static{} :用于给类初始化。静态方法在类加载的时候就已经加载,可以用类名直接调用。
4.执行main时,还没有创建类的对象,需要加static修饰,调用外部类的方法时对象在堆中已经创建,可以访问成员方法,如果没有创建类的方法也可以调用,在方法前加static不需要实例化就可以被调用
作者:
杨永峰
时间:
2012-5-28 20:06
第一段代码:
1> 代码中无名为Dog1的类,所以编译器找不到它,无法通过编译。function(d1)可以,因为d1 指向了一个 Dog 类的对象。function(d),不可以吧,没发现哪儿定义了d啊。
2>Cat,Dog类不是抽象类,特有方法可以私有。
3>定义为静态的话可以直接调用,如果不是静态,则必须实例化一个本类的对象调用,比如: new DuoTaiDemo1().function(d);
第二段代码:
dosome()方法都是DoStudent类创建的对象调用的,如下;
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
doStudent(new BaseStudent()); 这样调用时,方法前面没有任何对象,而静态方法可以这样调用。
如果改变方法的定义,如下
public void doStudent(BaseStudent bs)
{
//BaseStudent bs = new BaseStudent();
bs.study();
bs.sleep();
}
则必须实例化一个本类的对象来调用: new DuoTaiDemo3().doStudent(new BaseStudent());
我觉得这个主要是初始化的顺序决定的,先初始化的不能调用在它之后才初始化的。
静态方法随着类的加载而完成初始化,普通成员方法在创建对象时才完成初始化话。所以静态方法可以在没有创建对象时被调用,普通方法只有在所属的类创建对象后,通过对象调用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2