Java基础十一(private、this关键字和构造函数)
私有private关键字
成员变量是否一定需要全部向外界访问? 如果需要向外界访问 则public,如不需要向外界访问 则private,但是一般而言 都会将成员变量私有化,给成员变量+private是彻底不想给外界类中不需要对外提供的内容都私有化,包括属性和行为。
注意:私有仅仅是封装的体现形式而已
访问器
给成员变量加了private关键字外界就不能访问和更改,但是对于一些特殊情况我们又需要让外界访问更改,按照之前所学习的封装的原理,隐藏后,还需要提供访问方式。只要对外提供可以访问的方法,让其他程序访问这些方法。同时在方法中可以对数据进行验证。
一般对成员属性的访问动作:赋值(设置 set),取值(获取 get),因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。
成员变量初始化
对象在堆中创建 其成员变量有默认初始化
默认初始化–显式初始化–针对性初始化
构造函数
当我们需要在创建对象的同时赋给对象的属性值时,就需要面向对象中比较重要的一个方法——构造函数,构造函数就是为对象创造时用的函数,即就是对象创建时要执行的函数。所以在new对象时,知道其执行的构造函数是什么,就可以在执行这个函数的时候给对象进行属性赋值。
构造函数的三个特殊性 :
- 构造函数必须具备和所在类相同的名字 。
- 构造函数没有返回值类型 , 甚至连 void 也没有 。
- 构造函数是在创建一个对象使用new 操作符时调用的 。 构造函数的作用是初始化对象 。
- 和所有其他方法一样 , 构造方法也可以重载 ( 也就是说 , 可以有多个同名的构造方法 , 但它们要有不同的签名 ) , 这样更易于用不同的初始数据值来构造对象 。
注意:构造方法在使用new 操作符创建对象的时候被调用 。
构造函数的格式
修饰符 构造函数名(参数列表){
}
如果一个类里面没有定义任何构造函数则会有一个隐藏的无参构造函数
权限修饰符 类名(参数列表){
return;
}
如果一旦定义出其他的构造函数 则默认的无参构造函数不存在了!所以建议一般把无参构造函数都写出来
写一个构造函数例子:
class Dog
{
//Dog的成员属性age和name
private String name;
private int age;
//Dog的构造函数,拥有参数列表
public Dog(int a , String nm)
{
//接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
Dog的成员函数speak
public void speak()
{
System.out.println("name="+name+",age="+age);
}
}
写一次测试类
class DogTest
{
public static void main(String[] args)
{
//创建Dog对象,并明确对象的年龄和姓名
Dog wangcai= new Dog(3,"旺财");
wangcai.speak();
}
}
构造函调用内存图解
上述代码的内存图解:
1、主函数进栈
2、先执行第一句的右半部分 new Dog(3,“旺财”);
3、在堆内存中随机给Dog分配一片区域,区域地址位0X666,并给成员变量默认初始化。
4、构造函数进栈执行构造函数,就会把 3,“旺财” 赋给成员变量age和name,执行结束,构造函数弹栈。
5、Dog对象创建完成,把0X666赋给wangcai。
this关键字
关键字 this 引用对象自身 。 它也可以在构造方法内部用于调用同一个类的其他构造方法 。
- 构造函数之间的调用可以通过this关键字来完成
- this 关键字可以用于引用类的隐藏數据域 。
- 关键字 this 可以用于调用同一个类的另一个构造方法 。
例如上面Dog的构造函数我们就可以写为:
public Dog(int age , String name)
{
this.age = age;
this.name = name;
}
public Dog()
{
this(3,"旺财");
}
第一个构造函数中的两个this用于引用所构建的对象的隐藏数据域 age和name,在第二个构造方法中,this(3,“旺财”) 这一行调用第一个构造方法 。
当在函数中出现了局部变量和成员变量同名的时候,我们也可以在成员变量名前面加上this来区别方法中成员变量和局部变量
构造函数和成员函数的区别
1、外界调用角度
- 构造函数只能在创建对象时调用,对象创建完毕之后不能已创建的对象调用
- 成员函数只能在对象创建之后调用,可以重复的
2、返回值角度
- 构造函数不需要返回值
- 成员函数可需可不需
3、权限修饰符
- 构造函数可以用任意权限修饰符
- 成员函数也可以用任意权限修饰符
4、内部调用
- 构造函数可以调用成员函数 ,但是这个成员函数一般不会当做对象行为去看待
- 构造函数可以调用构造函数,this(参数列表) 调用当前类中的其他构造函
- 构造函数之间不能相互调用,会无限递归而且this(…)必须在第一句!防止值的覆盖
- 成员函数可以调用成员函数
- 成员函数不能调用构造函数,但是可以new
(构造函数可以和成员函数重名!)