注册 登录
编程论坛 JAVA论坛

如何在静态类创建非静态对象?怎么在静态方法里引用 非静态子类 的方法???

邹特强 发布于 2017-03-22 21:42, 4646 次点击
代码如下,表情位置编译错误,Dog是Animal的一个非静态子类,那么如何在静态的main方法里创建Dog对象呢?
上面是第一个问题,第二个问题:如何调用非静态子类里的非静态方法roar()???新手请多赐教
package 多态2;

public class Animal
{
    int i;
    public void roar()
    {
        System.out.println("Ruff!");
    }
    public class Dog extends Animal
    {
        public void roar()//静态方法不能被继承吗?对,也不能被覆盖,一般专业来说叫做被隐藏
        {
          System.out.println("I am a dog!");
          super.roar();//可以在子类方法中利用super引用父类方法
        }
    }
    public static void main(String args[])//这里如果用static ,表示静态方法,则其在类加载时就会分配内存,就是执行到这个类时,同时分配了内存,而类里面还有
    {                  //还有非静态成员,其必须在类的对象产生时才会分配内存,再通过类的对象去访问,也就意味着如果用dog a=new dog(),计算机在内存中找不到dog
        //定义的变量没有使用
        Dog a=new Dog();这里编译错误
    }
}
11 回复
#2
枫xby2017-03-23 09:52
public class Animal
{
    int i;
    public void roar()
    {
        System.out.println("Ruff!");
    }
   
    public static void main(String args[])
    {               
        //定义的变量没有使用
        Dog a=new Dog();//这里编译错误
    }
}

//一个.java文件中只有一个public修饰的类  
class Dog extends Animal
{
    //这是重写父类的方法
    public void roar()
    {
      System.out.println("I am a dog!");
     
    }
}
#3
纵横阳仔2017-03-23 11:16
我只能说写的一塌糊涂
什么叫静态类啊?我还没听过


[此贴子已经被作者于2017-3-23 11:17编辑过]

#4
邹特强2017-03-23 12:52
回复 3楼 纵横阳仔
恕我是新手,这个程序是没有逻辑的,只是为了想运用知识点随意写的,所以请不要从逻辑角度考虑。
其二,虽然我是新手,但静态类和静态方法是的确存在的,与静态方法和静态变量一样,带有static,如果我说的有错,请指点
#5
邹特强2017-03-23 13:07
回复 2楼 枫xby
多谢耐心指点,我懂你的意思了,但还有几个疑问:
1,你说一个java文件只能有一个public的类,但为什么我在源程序中用了两个public的类编译怎么没有错误?
还有既然编译没有错误,那么有一个public类和有两个或更多public类有什么区别?
2,我发现你把我设的子类提到父类外面去了,我想问,我把子类直接放到父类里,编译也没有错啊,那么两者有什么区别呢?
问题有些繁琐,请见谅!
#6
倾听心跳2017-03-23 23:49
程序代码:


class Animal {
    void roar() {
        System.out.println("Ruff!");
    }
}

class Dog extends Animal {
    void roar() {
        super.roar();
        System.out.println("I am a dog");
    }
}

public class Example1 {

    public static void main(String[] args) {
        Dog a = new Dog();
        a.roar();
    }

}
#7
纵横阳仔2017-03-24 10:19
回复 4楼 邹特强
静态类真的没有,static修饰的叫静态内部类,外部类不可以被static修饰
class A{
    static class B{
    }
    class C {
    }
    main(){
        B b = new A.B();           静态内部类
        C c = new A().new C();     成员内部类,系统默认 (new A()).new C();
   }
}
子类一般情况都在外面,(子类不能访问父类的私有成员)
放在里面的叫内部类,(如果你没学到内部类,那么你就定义错误了,否则你就搞混了)
内部类可以直接访问外部类的成员(包括私有成员),是不需要继承的.内部类的权限修饰符与外部无关,
内部类的东西还有许多,不一一列举了,内部类的使用不是用于子类继承父类,而是有其他的用处

[此贴子已经被作者于2017-3-24 12:11编辑过]

#8
邹特强2017-03-25 20:52
回复 7楼 纵横阳仔
嗯,大佬这么回答看得就很舒服,原谅我之前的一时气盛,大佬的回答的确很专业,是我学的还太少。
我还想问一个问题,就是我回复二楼提出的第一个问题,一个文件只能有一个public类的那个,能不能回答下?
#9
邹特强2017-03-25 21:05
回复 7楼 纵横阳仔
public class Animal
{
    int i;
    public void roar()
    {
        System.out.println("Ruff!");
    }
    public class Dog
    {
        public void roar()//静态方法不能被继承吗?对,也不能被覆盖,一般专业来说叫做被隐藏
        {
          System.out.println("I am a dog!");
          super.roar();//可以在子类方法中利用super引用父类方法
        }
    }
    public class Cat
    {
        public void Miao()//静态方法不能被继承吗?对,也不能被覆盖,一般专业来说叫做被隐藏
        {
          System.out.println("I am a cat!");
          super.roar();//可以在子类方法中利用super引用父类方法
        }
    }
    public static void main(String args[])//这里如果用static ,表示静态方法,则其在类加载时就会分配内存,就是执行到这个类时,同时分配了内存,而类里面还有
    {                  //还有非静态成员,其必须在类的对象产生时才会分配内存,再通过类的对象去访问,也就意味着如果用dog a=new dog(),计算机在内存中找不到dog
        //定义的变量没有使用
    }
}
还有,运用你说的静态内部类和成员内部类的概念,
把表情位置的代码改变成如上,
那么分别怎么调用方法roar()和Miao()啊,我试了几下,不知道怎么调用
#10
HolyOrder2017-03-26 18:24
Dog类属于成员内部类,调用内部类时用
类名.内部类名
例如:Animal am = new Animal();
    am.Dag.roar();
还有,super语句必须写在方法的第一行。
#11
邹特强2017-03-27 23:34
回复 10楼 HolyOrder
请问你说的表情位置的调用方法吗?无法通过编译啊,是我哪错了???
public class Animal
{
    int i;
    public void roar()
    {
        System.out.println("Ruff!");
    }
    public static class LittleAnimal
    {
        public void print()
        {
            System.out.println("you are smart!");
        }
    }
    public static void main(String args[])
    {               
        //定义的变量没有使用
        Dog a=new Dog();//这里编译错误
        LittleAnimal animal=new LittleAnimal();
        Animal.LittleAnimal.print();
        a.roar();
    }
}

//一个.java文件中只有一个public修饰的类  
class Dog extends Animal
{
    //这是重写父类的方法
    public void roar()
    {
      System.out.println("I am a dog!");
     
    }
}
//怎么调用静态内部类的非静态方法?
//怎么调用非静态类的方法fx
#12
纵横阳仔2017-04-01 19:55
内部类的权限修饰与外部无关,它相当于外部类的一个成员属性,该成员属性可以被四个权限修饰符修饰,在编译的时候,内部类会单独进行编译,他们说的是与外部类同一级别的类只能有一个类被public修饰

[此贴子已经被作者于2017-4-1 19:57编辑过]

1