我是一名Java学习者,实例化列表对象并在公共类中调用add方法时遇到错误。如果将代码放入main方法或将method声明为static,则相同的代码不会给我任何错误。下面是代码段。
public class UserDao {
//private static List<UserBean> user = new ArrayList<>();//----> no erros
private List<UserBean> user = new ArrayList<>();//--> remove static
//static {
user.add(new UserBean(1, "Harshit", "Madhapur"));//---->gives me error if remove comments.(static)
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
//}
public List<UserBean> findAll() {
return user;
}
public UserBean getUserById(Integer id){
for (UserBean userBean : user) {
if(userBean.getId() == id){
return userBean;
}
}
return null;
}
}
答案 0 :(得分:0)
您不能在方法或初始化程序之外执行语句 1 。
这是不可能的:
class A {
System.out.println("Hello world"); // Compilation error
}
这是可能的,但它是静态的:
class A {
static {
System.out.println("Hello world");
}
}
如果您要在此处删除static
,可以但不删除括号。它将成为一个初始化器。
class A {
{
System.out.println("Hello world");
}
}
但是由于超出此答案范围的原因,我们不建议这样做。
您想要的是在构造函数中执行初始化代码,该构造函数实际上是“最后一个”初始化程序 2 ,如果您有很多:
class A {
public A() {
System.out.println("Hello world");
}
}
1您可以在初始化程序之外执行代码,但只能作为字段声明的一部分,例如List lst = Arrays.asList("a", "b");
2并非完全如此,但又超出了此答案的范围。
答案 1 :(得分:0)
您无法从静态代码块(静态方法或静态初始化块)访问非静态字段。仅非静态代码块中可用的字段。这是合法的:
public class UserDao {
private List<UserBean> user = new ArrayList<>();//non-static field
{//access from non-static code block
user.add(new UserBean(1, "Harshit", "Madhapur"));
//skiped
}
//skiped
}
但是您可以从任何地方(静态方法,静态初始化块,非静态初始化块,非静态方法)访问静态字段
public class UserDao {
private static List<UserBean> user = new ArrayList<>();
static{//access to static field from static initialization block
user.add(new UserBean(1, "Harshit", "Madhapur"));
//skiped
}
{//access to static field from non-static initialization block
user.add(new UserBean(2, "Hars", "Shapur"));
}
//skiped
}
答案 2 :(得分:0)
静态块用于初始化静态变量。那就是为什么
private List<UserBean> user = new ArrayList<>();
static {
user.add(new UserBean(1, "Harshit", "Madhapur"));
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
}
将导致错误。
private static List<UserBean> user = new ArrayList<>();
static {
user.add(new UserBean(1, "Harshit", "Madhapur"));
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
}
将正常运行。
答案 3 :(得分:0)
创建对象后,请使用静态块或将元素添加到列表中。
// inside UserDao class
public void add(UserBean ub) {
user.add(ub);
}
[...]
public static void main(String[] args) {
UserDao user = new UserDao();
user.add(new UserBean(1, "Harshit", "Madhapur"));
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
}
答案 4 :(得分:0)
根据您的问题,它将给出错误,因为在这种情况下,静态块将尝试初始化非静态成员。不能静态引用非静态字段。
您可以根据自己的应用和成员的进一步使用情况选择以下两个选项: