java 继承创建父类对象

代码

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())
https://www.cnblogs.com/wxw7blog/p/7052757.html(java继承中是否创建父类对象?)

猜你喜欢

转载自blog.csdn.net/mccand1234/article/details/81144361