初级,集合框架 。对象同名的问题

普PIU 发布于 2016/12/01 16:40
阅读 232
收藏 0
public class UserTest {
public static void main(String[] args) {

while (true) {

System.out.println("--------------欢迎光临--------------");
System.out.println("1 登录");
System.out.println("2 注册");
System.out.println("3 退出");
System.out.println("请输入你的选择:");

Scanner sc = new Scanner(System.in);

String choiceString = sc.nextLine();

//我先选择2 注册,然后再选择1,登录,这时候测试类总红色处不加 static ,则登录不了

原因是,注册的信息,和登录的信息不再同一个集合??所以equals不了.?


UserDao ud = new UserDaoImpl();    //测试类不加static 时,因为是循环,所以会new两次,但是对像名也是相同    //的,不是应该是同一个吗?为什么,会建立两个集合呢? new 的时候对象名都相同,是不是开辟了两个不同的       //地址?为什么不是同一个地址呢?


switch (choiceString) {
case "1":

System.out.println("--------------登录界面--------------");
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();

boolean flag = ud.isLogin(username, password);
if (flag) {
System.out.println("登录成功,可以开始玩游戏了");


System.out.println("你玩吗?y/n");
while (true) {
String resultString = sc.nextLine();
if (resultString.equalsIgnoreCase("y")) {
// 玩游戏
GuessNumber.start();
System.out.println("你还玩吗?y/n");
} else {
break;
}
}
System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
// break; //这里写break,结束的是switch
} else {
System.out.println("用户名或者密码有误,登录失败");
}
break;
case "2":
// 欢迎界面,请输入用户名和密码
System.out.println("--------------注册界面--------------");
System.out.println("请输入用户名:");
String newUsername = sc.nextLine();
System.out.println("请输入密码:");
String newPassword = sc.nextLine();


// 把用户名和密码封装到一个对象中
User user = new User();
user.setUsername(newUsername);
user.setPassword(newPassword);


ud.regist(user);
System.out.println("注册成功");
break;
case "3":
default:
System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
break;
}
}
}
}


测试类

public class UserDaoImpl implements UserDao {

// 为了让多个对象共享同一个成员变量,用static
private static ArrayList<User> array = new ArrayList<User>();


@Override
public boolean isLogin(String username, String password) {
// 遍历集合,获取每一个用户,并判断该用户的用户名和密码是否和传递过来的匹配
boolean flag = false;


for (User u : array) {
if (u.getUsername().equals(username)
&& u.getPassword().equals(password)) {
flag = true;
break;
}
}


return flag;
}


@Override
public void regist(User user) {
// 把用户信息存储集合
// ArrayList<User> array = new ArrayList<User>();
array.add(user);
}
}


加载中
0
大白菜丶嘿咻
大白菜丶嘿咻
存放的对象放在内存中的时候是有自己的hash的,哪怕你的变量名一样。静态变量在内存中只有一份拷贝,而实例变量则不是。不同的实力变量有自己不同的hash,你不加Static你每次都new了,那么每次都是新的实例。hash肯定不是同一个啊。获取这个对象的时候肯定是根据内部地址hash找的呀,跟你的变量名是否相同无关
大白菜丶嘿咻
大白菜丶嘿咻
回复 @普PIU : 你每new一个就会开辟一个新的内存空间存放。
普PIU
我还有点模糊,拿最简单的学生,setname ,getname ,setage ,getage来举例。如果我在测试类里new 了student s1= new student (); 和student s2= new student ();它们的地址值肯定是不一样的。。如果我再new了一个s1,那么他和前一个s1的地址值肯定是一样的对吧?但是哈希值绝对不一样,是不是这个意思?
0
烟雨三月
烟雨三月
UserDao ud = new UserDaoImpl(); 放到while(true)外面。
返回顶部
顶部