黑马程序员技术交流社区

标题: 请教为什么我用构造方法的重载在对象属性私有化的情况... [打印本页]

作者: 李东城    时间: 2013-2-10 22:10
标题: 请教为什么我用构造方法的重载在对象属性私有化的情况...
本帖最后由 李东城 于 2013-2-11 21:33 编辑

有如下代码,请教为什么我用构造方法的重载在对象属性私有化的情况下也能完成创建对象,而使用默认的构造方法时就得在Persion类里使用get和set方法呢
public class Persion1 {
    private int age;
    private String name;
    private String banji;
    public Persion1(int age,String name,String banji){
        this.age=age;this.name=name;this.banji=banji;
    }
    public Persion1() {
        
    }
    public void show(){
             System.out.println(name+"的年龄是"+age+"所在班级是"+banji);      
        }
    }




public class TestPersion1 {
    public static void main(String[] args) {
    Persion1 xiaohong=new Persion1(18,"小红","三班");
    Persion1 xiaoming=new Persion1();
    xiaoming.name="小明";       这个地方报错呢
   
    xiaohong.show();
作者: 冯佩    时间: 2013-2-10 22:32
私有化的属性只能在本类中被访问,外部对象若想访问,就只能通过该私有属性对外提供的set与get方法来访问了,用构造方法的重载在对象属性私有化的情况下能完成创建对象,是因为创建对象时,重载的构造方法是在内部在对私有成员进行访问。
作者: 许鑫星    时间: 2013-2-10 22:35
对象属性私有化与是否可以创建对象没有关系,创建对象只要构造方法不是私有就行,你重载的那个构造方法是public的,所以可以做到在构造时给私有变量赋值。。。报错的地方,你在另一个类中尝试给这个类中的私有变量赋值,当然会报错。。。
作者: 黄玉昆    时间: 2013-2-11 18:09
其实不管你是不是重载了,对于这里的构造函数Persion1(int age,String name,String banji)和Persion1(),JVM虚拟机都会将其初始化,那么就会有各自的初始值
对于Persion1(int age,String name,String banji),其实你创建对象的时候就对其初始化的过程,
即Persion1 xiaohong=new Persion1(18,"小红","三班");这个是显式的初始化,将xiaohong的初始值设置为:18,"小红","三班";但是你要是修改xiaohong的值,如xiaohong.name = "dahong";,就会报错
而 Persion1 xiaoming=new Persion1();这个使用的是构造函数public Persion1(){},初始化为age = 0;name = null;banji = null;由于name是私有的,所以不可直接访问的。
所以必须使用get和set方法来访问私有变量。
建议你可以多看看构造函数方面的知识,并且把内存是怎么分配给对象等知识多看看,希望对你有帮助。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2