实例化的对象和引用...while(**.next()){实例化位置 、、***list.add(实例化的那个对象) }...

public List<NewsCategory> getNewsCategoryList() {
		List<NewsCategory> newsCategoryList = new ArrayList<NewsCategory>();
		String sql ="select * from news_category";
		Object[] params = {};
		if(this.getConnection()){
			ResultSet rs = this.executeSQL(sql, params);
			try {
				while(rs.next()){
					//如果实例化NewsCategory写在while循环外 ,会导致list里面add进去6条重复数据!!!
					NewsCategory newsCategory = new NewsCategory();
					newsCategory.setId(rs.getInt("id"));
					newsCategory.setName(rs.getString("name"));
					newsCategory.setCreateDate(rs.getTimestamp("createDate"));
					
					newsCategoryList.add(newsCategory);
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				this.closeResource();
			}
		}
		
		return newsCategoryList;
	}

List 的add方法 添加的是 new出来对象的引用变量newsCategory,所以 如果要需要存储不同的对象 ,就要各自用new来实例化。

 

如果实例化NewsCategory写在while循环外,只是实例化了一个NewsCategory对象

          new操作也就是会在堆内存中分配一个对象的内存引用变量 newsCategory指向这个内存中的对象

 所以:List 的add方法增加的是同一个变量 newsCategory,并增加了6次

A: 要实例化同一个包中所有类,可以遵循以下步骤: 1.获取包名: ```java String packageName = "com.example.packageName"; ``` 2.获取包下的所有类名 ```java Class<?>[] classes = PackageUtil.getClasses(packageName); ``` 3.遍历所有类并实例化 ```java for(Class<?> cls : classes){ Object obj = cls.newInstance(); // 对obj进行操作 } ``` PackageUtil.getClasses()方法实现如下: ```java public class PackageUtil { public static Class<?>[] getClasses(String packageName) throws ClassNotFoundException, IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } ArrayList<Class<?>> classes = new ArrayList<>(); for (File directory : dirs) { classes.addAll(findClasses(directory, packageName)); } return classes.toArray(new Class[0]); } private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException { List<Class<?>> classes = new ArrayList<>(); if (!directory.exists()) { return classes; } File[] files = directory.listFiles(); assert files != null; for (File file : files) { if (file.isDirectory()) { assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." + file.getName())); } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); } } return classes; } } ``` 注意:该方法只能实例化无参构造方法的类,如有参数构造方法要进行额外处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值