关于继承里面子类get/set方法的小总结

/**
编写Computer类,包含CPU、内存、硬盘等属性,getDetails方法用于返回Computer的详细信息
编写PC子类,继承Computer类,添加特有属性和方法
编写NotePad子类,继承Computer类,添加特有属性和方法
编写Test类,在main方法中创建PC和NotePad对象,分别访问对象中特有的属性、方法,以及从Computer类继承的属性和方法并打印输出。

 */
public class TestComputer {

    public static void main(String[] args) {

        PC pc = new PC("联想","intel",8,120);

        System.out.println(pc.getDetails());


        NotePad np = new NotePad(2000,"amd",8,500);

        System.out.println(np.getDetails());


    }

}
class PC extends Computer{

    public String getDetails(){

        return brand+"\t"+super.getDetails();

    }

    public PC(String brand,String cpu,int disk,int ram) {
        this.brand = brand;
        this.setCpu(cpu);
        //我的问题出在这里,不理解为什么不能this.cpu=cpu来赋值
        this.setDisk(disk);
        this.setRam(ram);
    }

    private String brand;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }


}


class NotePad extends Computer{



    public NotePad(int size,String cpu,int disk,int ram) {
        this.size = size;

        this.setCpu(cpu);
        this.setDisk(disk);
        this.setRam(ram);

    }

    private int size;

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }




}

class Computer{
    private String cpu;
     int ram;
    protected int disk;

    public String getDetails(){
        return "cpu="+cpu+"\tram="+ram+"\tdisk="+disk;
    }
    public String getCpu() {
        return cpu;
    }
    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public int getRam() {
        return ram;
    }
    public void setRam(int ram) {
        this.ram = ram;
    }
    public int getDisk() {
        return disk;
    }
    public void setDisk(int disk) {
        this.disk = disk;
    }



}

我之前的理解是既然是子类继承了父类的属性和方法,那么不是相当子类中也同样有cpu属性、get()方法和set()方法,那么就可以用this.cpu=cpu来直接给子类的cpu设置属性了,经过从网上搜集各类大神的解答,我对继承里面关于属性和get/set方法的继承有了新的理解:

1.子类继承父类,会继承父类的所有属性(properties)和方法(methods),包括private修饰的属性和方法,但是子类只能访问和使用非private的,所以可以这么理解: 子类对象的内部 包涵了一个完整父类对象;

如下图:
关于继承里面子类get/set方法的小总结_第1张图片

2.私有属性不能直接访问,需要通过公共的方法来访问。

3.子类构造器默认生成子类属性的有参构造器,如果需要通过子类构造器给父类继承来的属性赋值,需要用set方法访问父类的私有属性。

4.PC pc = new PC();就是创建一个子类对象,而子类对象内部包涵了父类对象,所以又要先new Computer, 也就是说:
创建子类对象 = 创建父类对象 + 其他

public PC{
    super();//jvm默认加上的
}

5.子类对象没有重写(Overriding)父类的方法,那么这个方法就还”包涵”在父类对象里,,子类对象用set()方法,其实质调用的是 子类对象”肚子里的”那个父类对象的方法.

6.return i; JAVA规定,变量前面没有特别说明是谁的变量,那么就适用”就近原则”,显然父类对象的属性int i是最近的,下面这个例子可以更好的理解就近原则;

总结:虽然子类继承了父类的,如果没有重写,严格意义上来说, 只能说子类能直接访问这个属性或者是方法,但是这个方法还是在父类的里面。子类相当于将整个父类放在了自己的里面。所以在没有重写的情况,由于这个方法还是在父类中间的方法,所以返回的还是父类的属性。

你可能感兴趣的:(java)