2013-02-28 2 views
3

Как я недавно начал программировать, я немного застрял в этой области кодирования.Проблема с вложенными классами Java

Урок программирования, названный вложенными классами. Но когда я хочу использовать его, он фактически не делает то, что хочет домашняя работа. Вот пример того, что мне нужно достичь:

public class Zoo { 
    ... 
    public static class monkey { 
     ... 
    } 
} 

и в главном

Zoo zoo1 = new Zoo(); 
... 
zoo1.monkey.setage(int); 
... 

Но есть проблема здесь, что всякий раз, когда я хочу назвать обезьяну из zoo1, отладчик говорит, что это . не представляется возможным (Помните, что я хочу сделать это без создания экземпляра обезьяны)

заранее спасибо

Обновление: Я просто интересно, если это любопытный язык ограни то как сам оракул мог сделать это довольно легко с system.out.printf?

ответ

1

monkey выглядит статичным мне. Они должны быть public вместо Public.

Я бы сказал, что setage() не является статическим методом. Если это так, и если возраст - это свойство обезьяны, то было бы бессмысленно называть его статически - возраст которого вы бы установили?

Проблема заключается в том, что вы не можете получить доступ к статическому внутреннему классу через переменную внешнего типа класса.

Таким образом, это должно быть Zoo.monkey вместо zoo1.monkey.

Если вы хотите контролировать область видимости или присвоить имена, вы можете использовать packages.

Например, вы могли бы иметь следующее:

package com.example.application.feature; 

public class MyClass { 
    public void f() { 
     System.out.println("Hello"); 
    } 
} 

в исходном файле, который называется com/example/application/feature/MyClass.java.

+0

Спасибо за ваш вклад, но актуальная проблема заключается в том, что отладчик говорит, что сам класс обезьян не распознается. Поэтому я не могу просто написать: zoo1.monkey. Я все же могу написать Zoo.monkey. – lkn2993

+1

Мои деньги - это преднамеренное ограничение языка (зачем обращаться к статическому внутреннему классу через конкретный экземпляр внешнего класса, когда внутренний класс не может получить доступ к полям экземпляра?), Но я мог ошибаться. Что говорит отладчик точно? – Vlad

+0

В нем указано, что объект или поле не существует. – lkn2993

1

Edit: Я не видел вас внимание «(помните, что я хочу сделать это без создания экземпляра обезьяны)»

иногда, прежде чем спрашивать, поиск может помочь вам сэкономить time.Direct Quotion от этот адрес: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Inner Classes

As with instance methods and variables, an inner class is associated with an instance of its enclosing class and has direct access to that object's methods and fields. Also, because an inner class is associated with an instance, it cannot define any static members itself.

Objects that are instances of an inner class exist within an instance of the outer class. Consider the following classes:

class OuterClass { ... class InnerClass { ... } }

An instance of InnerClass can exist only within an instance of OuterClass and has direct access to the methods and fields of its enclosing instance. The next figure illustrates this idea.

An Instance of InnerClass Exists Within an Instance of OuterClass

To instantiate an inner class, you must first instantiate the outer class. Then, create the inner object within the outer object with this syntax:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

Additionally, there are two special kinds of inner classes: local classes and anonymous classes (also called anonymous inner classes). Both of these will be discussed briefly in the next section.

+0

Так что system.out.printf должен быть создан как экземпляр справа? – lkn2993

2

Вы не можете получить доступ к классу обезьян через экземпляр Zoo, на самом деле это не имеет никакого смысла. Если вы хотите получить доступ к статическим методам обезьяны от основных вы можете просто использовать пример ниже

public class Zoo { 

    public static void main(String[] args) { 
     // Example 1 
     monkey.setage(3); 
     // Example 2 
     Zoo.monkey.setage(3); 
    } 

    public static class monkey { 
     private static int age; 

     public static void setage(int age) { 
      monkey.age = age; 
     } 
    } 
} 

Но что вы на самом деле пытаетесь достичь?

+0

Если вы установили возраст обезьяны вне экземпляра, то как его можно переопределить самому экземпляру? Хорошо, что я пытаюсь сделать, так это то, что методы обезьяны экземпляра zoo1 (который является уникальным) должны быть доступны и вызваны (если это возможно). Еще раз спасибо :) – lkn2993

+0

Если вы не хотите создавать экземпляр обезьяны, то нет обезьяны, принадлежащей экземпляру zoo1. –

Смежные вопросы