2017-06-30
- 函数即是最小的封装单位
- 封装就是避免对于类属性的直接访问,通过提供对外的方法,然后操作传入的数据,提高代码健壮性
构造代码块执行优先于构造函数,定义的是不同对象共性的初始化内容。
下面的代码,输出的name会是null,因为java并不会把”小李子”这个值赋给堆内存中p的name,它认为两个name是同一个局部变量name。
class Person { private String name; Person(String name) { name = name; //java认为是同一个局部变量name System.out.println("name" + name); } } calss PersonDemo { public static void main(String[] args) { Person p = new Person("小李子"); } }
下面把局部变量name换成n,是可以的。因为java编译的时候,在Person方法中找不到name,就会往上在类里面找到成员变量name。 但是n这个变量定义的没有语义,不知道它是用来干嘛的。
class Person { private String name; Person(String n) { name = n; System.out.println("name" + name); } } calss PersonDemo { public static void main(String[] args) { Person p = new Person("小李子"); } }
因此,变量出现重名情况时候,this关键字解决了这个问题。this代表了所在函数的所在对象的引用,哪个对象在调用this所在的函数,this就代表哪个对象。其实调用的时候,都是通过this完成的,因为自始至终都是对象在运行,通过this才能知道操作的是哪一个对象,才能知道操作的是哪一个对象的哪一个属性或者方法。在类中的大部分时候,this关键字是被省略的。
class Person { private String name; Person(String name) { this.name = name; System.out.println("name" + this.name); //这里其实省略了this } }
本类对象中定义的方法,如果需要调用本类对象,那么就需要this关键字来创建一个指向后期调用该方法的对象的引用。比如下面compare的方法比较p1和p2的两个是否同龄
class Person{ private int age; Person(int age) { this.age = age; } public boolean compare(Person p) { return this.age==p.age; } } class PersonDemo{ public static void main (String[] args){ Person p1 = new Person(20); Person p2 = new Person(30); boolean b = p1.compare(p2); System.out.println(b); } }
构造函数可能对外只提供了一个,但是类的内部存在很多初始化的构造方法,彼此间调用。构造函数间互相调用,只能用this关键字。并且,this关键字的调用只能放在构造函数中的的第一个语句。
class Person { private int agel private String name; Person (Stirng name) { this.name = name; } Person (String name, int age) { this(name); // this 后面是不加点的。属于构造函数间调用,且为第一个语句 this.age = age; } }