我有以下代码:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
我知道Thing什么也不做,但是我的Hello, World程序没有它编译也很好。只有我定义的类不及格。
它拒绝编译。在创建一个新Thing的行中,我得到了Hello类型的No封闭实例。我猜是:
我有系统级的问题(在DrJava或我的Java安装)或
我对如何在java中构建一个工作程序有一些基本的误解。
什么好主意吗?
Java 14之前
您必须添加静态关键字来从静态上下文访问类Thing。
class Hello {
static class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Java 14 +
从Java 14开始,您可以使用内部记录类,它们是隐式静态的。所以你会有:
class Hello {
record Thing(int size) { }
public static void main(String[] args) {
Thing thing1 = new Thing(0);
System.out.println("Hello, World!");
}
}
嗯…很多很好的答案,但我想补充更多。简要介绍Java中的内部类——Java允许我们在另一个类和类中定义一个类
能够以这种方式嵌套类有一定的优势:
它可以对其他类隐藏(它增加了封装性)类-特别是当类只被包含它的类使用时。在这种情况下,没有必要让外界知道。
它可以使代码更具可维护性,因为类是根据需要的位置逻辑地分组在一起的。
内部类可以访问其包含类的实例变量和方法。
我们主要有三种类型的内部类
当地的内心
静态内部类
匿名内部类
要记住一些要点
我们需要类对象来访问它所在的局部内部类。
静态内部类可以直接访问,就像它存在于同一类的任何其他静态方法一样。
匿名内部类对外部世界以及同一类(存在于其中)的其他方法或类都是不可见的,并且在声明时使用它。
让我们试着实际地看待上面的概念_
public class MyInnerClass {
public static void main(String args[]) throws InterruptedException {
// direct access to inner class method
new MyInnerClass.StaticInnerClass().staticInnerClassMethod();
// static inner class reference object
StaticInnerClass staticInnerclass = new StaticInnerClass();
staticInnerclass.staticInnerClassMethod();
// access local inner class
LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
localInnerClass.localInnerClassMethod();
/*
* Pay attention to the opening curly braces and the fact that there's a
* semicolon at the very end, once the anonymous class is created:
*/
/*
AnonymousClass anonymousClass = new AnonymousClass() {
// your code goes here...
};*/
}
// static inner class
static class StaticInnerClass {
public void staticInnerClassMethod() {
System.out.println("Hay... from Static Inner class!");
}
}
// local inner class
class LocalInnerClass {
public void localInnerClassMethod() {
System.out.println("Hay... from local Inner class!");
}
}
}
我希望这对大家都有帮助。详情请参考
将INNER类Thing声明为静态的,它将毫无问题地工作。
我记得当我将内部类Dog声明为类Dog {only时,我也有同样的问题。我和你有同样的问题。有两种解决方案:
1-将内部类Dog声明为静态。或
2-移动内部类狗自己到一个新的类。
下面是例子:
公共类ReturnDemo {
public static void main(String[] args) {
int z = ReturnDemo.calculate(10, 12);
System.out.println("z = " + z);
ReturnDemo.Dog dog = new Dog("Bosh", " Doggy");
System.out.println( dog.getDog());
}
public static int calculate (int x, int y) {
return x + y;
}
public void print( ) {
System.out.println("void method");
return;
}
public String getString() {
return "Retrun String type value";
}
static class Dog {
private String breed;
private String name;
public Dog(String breed, String name) {
super();
this.breed = breed;
this.name = name;
}
public Dog getDog() {
// return Dog type;
return this;
}
public String toString() {
return "breed" + breed.concat("name: " + name);
}
}
}