问题描述
我刚开始学习 Java。 IntelliJ 在第 4 行给我一个警告“通过实例引用访问的静态成员”。它是坏的,我应该以某种方式修复它,还是应该忽略它?
这是我的代码:
__dict__
和狗类:
public class MainClass {
public static void main(String[] args) {
Dog randomDog = new Dog();
Dog myDog = new Dog(4,"Charlie",new Dog().breed.Labrador);
System.out.println("Random dog's name is: " + randomDog.name + ",it's age is: " + randomDog.age + " and it's breed is: " + randomDog.breed);
System.out.println("My dog's name is: " + myDog.name + ",it's age is: " + myDog.age + " and it's breed is: " + myDog.breed);
}
}
解决方法
一个问题(这会导致其他问题)是您通过在同一范围内还具有相同名称的 字段 来隐藏 type breed
.
这是一个非常罕见的问题,因为 Java 的命名约定通常会防止这种冲突:类型(类、接口、枚举、注释)通常用 CamelCase
编写,而字段名称以较低的开头大小写字母 (fieldName
)。虽然这在技术上不是编译器强制执行的“规则”,但遵循此规则会使您的代码对其他人更具可读性,并且还避免了隐藏类型的后续问题。还要注意常量字段。
我还进行了两项更改,这些更改都是不错的想法,但与您的问题并不真正相关:
- 常量值(即大多数
static final
字段和枚举常量)使用ALL_UPPER
大小写,因此我也更改了您的Breed
值 - 我已将嵌套类型定义移至
Dog
类的顶部,以免将其隐藏在所有实例字段中。这只是为了让那些在逻辑上属于一起的东西彼此靠近。
public class Dog {
enum Breed { POODLE,SHEPHERD,LABRADOR }
int age;
String name;
Breed breed;
Dog(int age,String name,Breed breed) {
this.age = age;
this.name = name;
this.breed = breed;
}
Dog() {
this.age = 0;
this.name = "Rex";
this.breed = Breed.LABRADOR;
}
}
更改主类中的所有这些名称并仅用 new Dow().breed
替换不需要的 Dog.Breed
生成以下工作代码:
public class MainClass {
public static void main(String[] args) {
Dog randomDog = new Dog();
Dog myDog = new Dog(4,"Charlie",Dog.Breed.LABRADOR);
System.out.println("Random dog's name is: " + randomDog.name + ",it's age is: " + randomDog.age + " and it's breed is: " + randomDog.breed);
System.out.println("My dog's name is: " + myDog.name + ",it's age is: " + myDog.age + " and it's breed is: " + myDog.breed);
}
}