(java)想用一个父类装载需要共用的方法,其他类都需要调用这些方法

VermouthChow 2018-01-03 06:39:14
(java)想用一个父类装载需要共用的方法,被其他很多的类调用这些方法。不需要覆写,不想生成父类实例对象。
才初学java,可能了解的不太多,现在能想到的方法是,子类里直接super调用,可是这样每个子类实例化都会先调用一遍父类构造;另一个能想到的方法是使用static,直接父类名调用,但是好像static方法是常驻内存。
想请问一下有没有其他的办法能解决这个问题?
...全文
407 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2018-01-05
  • 打赏
  • 举报
回复
你这种工具类还是写成静态方法的好,而且你搞成单例,不也一样在内存里占着地方不释放?没什么区别
VermouthChow 2018-01-04
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
abstract class 里面可以放非 static 方法
谢谢。可是抽象类的子类实例化仍然会调用父类的构造器,现在的问题是,这个父类有很多工具(方法),会被很多的子类选择性调用,想有不有更方便,且减少内存消耗的办法。就是尽量少用static方法占用内存,减少或者不用实例化父(工具)类对象。目前想到的一个方法是,把工具类设置成单独final的类,私有构造,然后产生单例的实例化对象,static的getInstance()方法返回这个对象,其余要调用这个工具类方法的类里,都统一使用这个对象来调用。即工具类只允许生成一个对象,就调用一次构造方法,一个static方法获取实例化对象,所有需要使用这个方法的类里,都统一使用生成的这一个对象调用。 不知道还有没有更好的办法。
VermouthChow 2018-01-04
  • 打赏
  • 举报
回复
引用 8 楼 SXJIAKE 的回复:
可以考虑使用这种懒加载模式来实现,不需要父类,就放一个单独的公共类。
public class BaseClass {
	// 父类原有的变量和方法此处略去
	// 在父类原有代码最后添加这两行
	private static class LazyHolder {
		private static final BaseClass INSTANCE = new BaseClass();
	}
	static public BaseClass getInstance() {
		return LazyHolder.INSTANCE;
	}
}
然后所有需要调用父类的方法你都可以这么来:
// 获取父类唯一实例
BaseClass base = BaseClass.getInstance();
// 调用父类方法
base.method();
任何地方第一次调用 getInstance() 时,才会 new 一个对象,不常驻内存。 并且,从第二次开始,任何 getInstance() 都始终获得同一个相同的对象。
学习了~谢谢
「已注销」 2018-01-04
  • 打赏
  • 举报
回复
可以考虑使用这种懒加载模式来实现,不需要父类,就放一个单独的公共类。
public class BaseClass {
	// 父类原有的变量和方法此处略去
	// 在父类原有代码最后添加这两行
	private static class LazyHolder {
		private static final BaseClass INSTANCE = new BaseClass();
	}
	static public BaseClass getInstance() {
		return LazyHolder.INSTANCE;
	}
}
然后所有需要调用父类的方法你都可以这么来:
// 获取父类唯一实例
BaseClass base = BaseClass.getInstance();
// 调用父类方法
base.method();
任何地方第一次调用 getInstance() 时,才会 new 一个对象,不常驻内存。 并且,从第二次开始,任何 getInstance() 都始终获得同一个相同的对象。
VermouthChow 2018-01-04
  • 打赏
  • 举报
回复
引用 6 楼 weixin_37627432 的回复:
首先,对于你考虑到的想使用父类,但又不想实例化父类,这个是不可能的,Java实例化子类的时候就会实例化他的父类,不管你调用不调用super()方法; 第二,你考虑到的static方法会常驻内存的问题,如果你去了解过java对象的生命周期的话,你就会理解,为什么那些工具类要么使用static方法存在类的内存里,要么就是实例化成单例存在内存里,这个是为了减少实例化带来的性能的开销 第三,对于你提的问题,至于你想使用父类的方法,只要你父类的方法是 protected 或者public,子类不加super也是可以直接调用的 建议你, 1. 如果你这个公用方法不是处理含有该对象状态的,可以直接定义成static的,如果有状态的就直接定义在父类里。 2. 目前尽量想怎样把代码写对,以后等有经验了再考虑优化性能
了解了~谢谢~
慢步蜗牛 2018-01-04
  • 打赏
  • 举报
回复
首先,对于你考虑到的想使用父类,但又不想实例化父类,这个是不可能的,Java实例化子类的时候就会实例化他的父类,不管你调用不调用super()方法; 第二,你考虑到的static方法会常驻内存的问题,如果你去了解过java对象的生命周期的话,你就会理解,为什么那些工具类要么使用static方法存在类的内存里,要么就是实例化成单例存在内存里,这个是为了减少实例化带来的性能的开销 第三,对于你提的问题,至于你想使用父类的方法,只要你父类的方法是 protected 或者public,子类不加super也是可以直接调用的 建议你, 1. 如果你这个公用方法不是处理含有该对象状态的,可以直接定义成static的,如果有状态的就直接定义在父类里。 2. 目前尽量想怎样把代码写对,以后等有经验了再考虑优化性能
「已注销」 2018-01-03
  • 打赏
  • 举报
回复
abstract class 里面可以放非 static 方法
VermouthChow 2018-01-03
  • 打赏
  • 举报
回复
引用 1 楼 SXJIAKE 的回复:
使用 abstract class 和 interface
额,这个父类里面不是abstract方法,是一系列已经定义好的方法,不需要覆写重新定义,想直接使用的。
VermouthChow 2018-01-03
  • 打赏
  • 举报
回复
额,这个父类里面不是abstract方法,是一系列已经定义好的方法,不需要覆写重新定义,想直接使用的。
「已注销」 2018-01-03
  • 打赏
  • 举报
回复
使用 abstract class 和 interface

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧