代码
public class A {
int a=1;
double d=2.0;
void show(){
System.out.println("Class A: a="+a +"\td="+d);
}
}
public class B extends A{
float a=3.0f;
String d="Java program.";
String c= "B property";
@Override
void show(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d+"\tc="+c);
}
void show1(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d);
}
public static void main(String[] args) {
// A a=new A();
// a.show();
A b=new B();
b.show();
// b.show2(); error 无法使用B类的方法
}
}
A a=new B();
先产生了一个父类对象A,再以A为基础产生了一个子类对象B(这个时候如果A类有属性、方法等B类会继承),然后把B对象的首地址赋值给变量a。但是因为a变量的类型是A,所以a变量只能拥有A里定义的方法和属性,而无法使用B类里定义的新方法和新属性,当然如果B类有override的时候,还是取B类的属性及方法。
如果存在继承,在实例化一个子对象时,会先实例化它的父对象,如果父对象还有继承,又去先实例化父对象的父对象,最后产生拥有所有父对象特性的子对象(有冲突的属性或者方法,按子优先父的方式只保留一个,但是可以通过super.方法名或者super.属性名访问得到)。
内存布局
布局规则
Hotspot中java对象的内存布局:
每个java对象在内存中都由对象头和对象体组成。
对象头是存放对象的元信息,包括该对象所属类对象Class的引用以及hashcode和monitor的一些信息。
对象体主要存放的是java对象自身的实例域以及从父类继承过来的实例域,并且内部布局满足由下规则:
规则1:任何对象都是8个字节为粒度进行对齐的。
规则2:实例域按照如下优先级进行排列:长整型和双精度类型;整型和浮点型;字符和短整型;字节类型和布尔类型,最后是引用类型。这些实例域都按照各自的单位对齐。
规则3:不同类继承关系中的实例域不能混合排列。首先按照规则2处理父类中的实例域,接着才是子类的实例域。
规则4:当父类中最后一个成员和子类第一个成员的间隔如果不够4个字节的话,就必须扩展到4个字节的基本单位。
规则5:如果子类第一个实例域是一个双精度或者长整型,并且父类并没有用完8个字节,JVM会破坏规则2,按照整形(int),短整型(short),字节型(byte),引用类型(reference)的顺序,向未填满的空间填充。
应用
多态性,一个底层entity,多种bean模型。
//使用 帖子
PostPromoDTO postPromoDTO = (PostPromoDTO)shoppingPromoAdminService.loadShoppingPromo(promoId);
//service
@Override
public ShoppingPromoDTO loadShoppingPromo(int promoId) {
if (promoId <= 0) {
return null;
}
ShoppingPromoBean promoBean = shoppingPromoDao.loadById(promoId);
if (promoBean == null) {
return null;
}
//活动的多种实现形式
switch (promoBean.getType()) {
case 1:
return buildPostPromo(promoBean);//帖子
case 2:
return buildH5Promo(promoBean);//h5
case 3:
return buildDealPromo(promoBean);//购买单
case 4:
return buildBrandNews(promoBean);//品牌简讯
case 5:
return buildShortPromo(promoBean);//短促
default:
return null;
}
}
//构建多种bean
private PostPromoDTO buildPostPromo(ShoppingPromoBean promoBean) {
PostPromoDTO postPromoDTO = (PostPromoDTO) getBasePromo(new PostPromoDTO(), promoBean);
PostBean postBean = postDao.loadPost(promoBean.getPromoID());
if (postBean == null) {
return null;
}
BeanUtils.copyProperties(postBean, postPromoDTO);
List<PostParagraphBean> postParagraphBeans = postDao.findParagraphs(promoBean.getPromoID());
}
return postPromoDTO;
}
private H5PromoDTO buildH5Promo(ShoppingPromoBean promoBean) {
H5PromoDTO h5PromoDTO = (H5PromoDTO) getBasePromo(new H5PromoDTO(), promoBean);
h5PromoDTO.setUrl(promoBean.getUrl());
return h5PromoDTO;
}
private BrandNewsDTO buildBrandNews(ShoppingPromoBean promoBean) {
BrandNewsDTO brandNewsDTO = (BrandNewsDTO) getBasePromo(new BrandNewsDTO(), promoBean);
brandNewsDTO.setSubTitle(promoBean.getSubTitle());
brandNewsDTO.setBrandId(promoBean.getBrandId());
return brandNewsDTO;
}
private ShortPromoDTO buildShortPromo(ShoppingPromoBean promoBean) {
ShortPromoDTO shortPromoDTO = (ShortPromoDTO) getBasePromo(new ShortPromoDTO(), promoBean);
shortPromoDTO.setSubTitle(promoBean.getSubTitle());
if (StringUtils.isNotBlank(promoBean.getContent())) {
ShortPromoContent shortPromoContent = JsonUtil.fromJson(promoBean.getContent(), ShortPromoContent.class);
shortPromoDTO.setRule(shortPromoContent.getRule());
}
return shortPromoDTO;
}
//bean 转promoDTO
private ShoppingPromoDTO getBasePromo(ShoppingPromoDTO promoDTO, ShoppingPromoBean promoBean) {
promoDTO.setPromoID(promoBean.getPromoID());
promoDTO.setType(promoBean.getType());
promoDTO.setTitle(promoBean.getTitle());
promoDTO.setBeginTime(promoBean.getBeginTime());
promoDTO.setEndTime(promoBean.getEndTime());
promoDTO.setTags(promoBean.getTags());
promoDTO.setPromoLocation(promoBean.getPromoLocation());
promoDTO.setThumb(promoBean.getThumb());
promoDTO.setAdminUserName(promoBean.getAdminUserName());
...
return promoDTO;
}
参考:
https://zhidao.baidu.com/question/177768075901671564.html?qbl=relate_question_0&word=java%20%BC%CC%B3%D0%20new%20%B6%D4%CF%F3(java通过子类实例化的对象A a=new B())
(java继承中是否创建父类对象?)