为什么我不能在 Java 中的本地 class 中声明对象?
Why can't I declare object in my local class in Java?
我最近开始学习编程。我知道它看起来毫无意义,但我想知道为什么我不能在本地 class 中声明我的对象。我可以在我创建的第二个 class 中声明它,但不能在主要的
中声明
这是我的代码:
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
student.name = "Jack";
}
你的 IDE 给你的错误,是关于你的陈述
student.name = "Jack";
您可以声明一个 User
,就像您在此处所做的那样
User student = new User();
它将被解释为您的 User
class 的属性。但是,您不能在方法之外编写任何逻辑。您只能声明字段以定义 class' 属性。如果你想将名字 Jack 分配给你的学生变量,你有三个选择:
- 定义一个接受名称的构造函数,并在实例化期间将值 Jack 传递给您的学生实例。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User("Jack");
public User(String name){
this.name = name;
}
}
- 在实例块中包含您的语句。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
{
student.name = "Jack";
}
}
- 在 class 构造函数中初始化您的学生字段。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
public User(){
this.student.name = "Jack";
}
}
但是,所有这些选项都没有什么意义,它们都是为了让您了解可以编写此类语句的上下文。此外,正如评论中所报告的那样,在你的 User
class 中创建一个新的 User
将在每次创建新的 User
时溢出堆栈,因为每个用户的创建触发创建另一个。
我想您只是想定义一个 User
及其实际字段(姓名、姓氏、年龄、公司名称),然后在“测试”上下文中声明一个 Student,就像 main 方法一样。这很可能是您尝试执行的操作:
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
}
}
附带说明一下,您应该将 class 的属性(其字段)定义为 private
。 public
访问修饰符通常用于对象(其方法)提供的服务。这也称为 information hiding
或 encapsulation
。基本上,您想隐藏 class 的内部实现并保护其状态(其字段)免受任何滥用,例如分配不一致的值。您的方法是调节对内部状态的访问的“外层”,它们包含防止误用和对对象状态进行不一致更改的逻辑。
无封装
public class User {
public String name;
public String surname;
public int age;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
//misuse of the object's attributes
student.age = -20;
}
}
封装
public class User {
private String name;
private String surname;
private int age;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public void setAge(int age) {
if (age < 0 || age > 120) {
return;
}
this.age = age;
}
public int getAge() {
return age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
student.age = -20; //gives you an error, you cannot access anymore this field directly
student.setAge(-20); //It won't update its age to -20
System.out.println(student.getAge()); //It still prints 15
student.setAge(25); //Regulates the update and allows the assignment
System.out.println(student.getAge()); //Prints 25
}
}
这篇文章很好地解释了封装的概念:
我最近开始学习编程。我知道它看起来毫无意义,但我想知道为什么我不能在本地 class 中声明我的对象。我可以在我创建的第二个 class 中声明它,但不能在主要的
中声明这是我的代码:
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
student.name = "Jack";
}
你的 IDE 给你的错误,是关于你的陈述
student.name = "Jack";
您可以声明一个 User
,就像您在此处所做的那样
User student = new User();
它将被解释为您的 User
class 的属性。但是,您不能在方法之外编写任何逻辑。您只能声明字段以定义 class' 属性。如果你想将名字 Jack 分配给你的学生变量,你有三个选择:
- 定义一个接受名称的构造函数,并在实例化期间将值 Jack 传递给您的学生实例。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User("Jack");
public User(String name){
this.name = name;
}
}
- 在实例块中包含您的语句。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
{
student.name = "Jack";
}
}
- 在 class 构造函数中初始化您的学生字段。
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
User student = new User();
public User(){
this.student.name = "Jack";
}
}
但是,所有这些选项都没有什么意义,它们都是为了让您了解可以编写此类语句的上下文。此外,正如评论中所报告的那样,在你的 User
class 中创建一个新的 User
将在每次创建新的 User
时溢出堆栈,因为每个用户的创建触发创建另一个。
我想您只是想定义一个 User
及其实际字段(姓名、姓氏、年龄、公司名称),然后在“测试”上下文中声明一个 Student,就像 main 方法一样。这很可能是您尝试执行的操作:
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
}
}
附带说明一下,您应该将 class 的属性(其字段)定义为 private
。 public
访问修饰符通常用于对象(其方法)提供的服务。这也称为 information hiding
或 encapsulation
。基本上,您想隐藏 class 的内部实现并保护其状态(其字段)免受任何滥用,例如分配不一致的值。您的方法是调节对内部状态的访问的“外层”,它们包含防止误用和对对象状态进行不一致更改的逻辑。
无封装
public class User {
public String name;
public String surname;
public int age;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
//misuse of the object's attributes
student.age = -20;
}
}
封装
public class User {
private String name;
private String surname;
private int age;
public User(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
public void setAge(int age) {
if (age < 0 || age > 120) {
return;
}
this.age = age;
}
public int getAge() {
return age;
}
public static void main(String[] args) {
User student = new User("Jack", "Black", 15);
student.age = -20; //gives you an error, you cannot access anymore this field directly
student.setAge(-20); //It won't update its age to -20
System.out.println(student.getAge()); //It still prints 15
student.setAge(25); //Regulates the update and allows the assignment
System.out.println(student.getAge()); //Prints 25
}
}
这篇文章很好地解释了封装的概念: