Java 是面向对象的编程语言,面向对象有三大特性: 封装、继承、多态。 先介绍下封装性。
一、什么是封装
封装是指将对象的状态信息隐藏在对象的内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
二、封装的目的 1、只能通过规定的方法访问数据 2、隐藏类的实现细节,便于修改和实现
三、如何实现封装 1、修改属性的可见性 。例如: 将属性设置为 private 2、创建getter/setter方法用于属性读写 3、在getter/setter方法中加入属性控制语句,对属性值的合法性进行判断
四、实践 创建一个Person类,如下
package com.leomon; public class Person { //定义私有属性 名字 private String name; // 定义私有属性 年龄 private int age; // name 属性的get方法 public String getName() { return name; } // name 属性的set方法 public void setName(String newName) { name = newName; } // age属性的get方法 public int getAge() { return age; } // age属性的set方法 public void setAge(int newaAge) { age = newaAge; } }我们是这么访问的
public static void main(String[] args) { Person jack = new Person(); //访问set 方法 jack.setName("jack"); // 获取值 System.out.println("name:"+jack.getName()); }五、this关键字的使用
Java 中的this关键字总是指向调用对象,即代表当前对象。
先总结下this关键字的作用 : 1、解决局部变量和成员变量重名(变量类型和变量名都相同)的问题 2、用于构造器间的调用
1、前面有说到,我们通过getter/setter 方法对对象的属性值进行存取。那么当一个类的属性有很多,难道我们要手动为一个个写getter/setter方法? 肯定不是啦。在eclipse有快捷键帮助我们完成这个任务。
点击菜单栏source -> Generate Getter and Settter 弹出如下界面 点击ok后,自动帮助我们生成如下
package com.leomon; public class Person { //定义私有属性 名字 private String name; // 定义私有属性 年龄 private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }我们可以注意到,上述set方法中,传进来的形参名字和我们自定义的参数名字一样。为了方便区分,我们用this关键字进行区分。 从而,我们可以进一步说明: this总是指向调用的对象。
2、this.属性 操作当前对象的属性 this.方法 操作当前对象的方法
this 是为了解决当全局变量和局部变量的数据类型和名称都相同时,全局变量会被隐藏,不能够使用的问题。也就是说,如果不存在同名,访问属性和方法时候,this.是可以省略的。
例如:
public void speak(){ System.out.println("我在说话"); }在name的setter方法中调用 speak() 方法
public void setName(String name) { this.name = name; this.speak(); // speak();这么写也是成立的! }3、构造器如何调用构造器
class Person{ public int age; public String name; //单参数构造方法 public Person(int age){ this.age = age; } // 双参数构造方法 public Person(int age,String name){ this.age = age; // 可替换成this(name),这样就会去调用单参数构造器了! this.name = name; } /* 我们可以看到,双参数里面的this.age = age,已经有构造函数已经实现了。 但是我们都知道,构造函数触发的时机是产生新对象的时候,为了不产生新对象,充分利用每一段代码,我们可以将 public Person(int age,String name)构造器中的 this.age = age ,修改成 this(name), 这样就会直接去调用单参数的构造器了,提高代码的复用率,而且不产生新对象; 注意 : 这个语法仅适用于构造方法间相互调用 */ }4、举一个简单的例子 (类似Object类的equals方法)
例如 : 创建一个类Person,添加age(int)属性,并添加比较两个对象年龄是否相等的方法
class Person { public int age; //构造器 public Person(int age){ this.age = age; } //比较年龄是否相等 public boolean compare(Person p){ return this.age = p.age; } //在方法入口中调用 Person tom = new Person(10); Person Jack = new Person(20); boolean isEqual = tom.compare(Jack); // this 就代表 tom ,this和tom的地址是一样的,指向堆区同一个实体(this总是指向调用的对象) }注意: 前面有说到,我们一般通过getter/setter 方法对对象的属性值进行操作,那我们可不可以通过自定义的方法对对象的属性值进行操作呢? 答案是可以的。但是就编程规范来讲,我们一般通过getter/setter 对对象的属性进行操作访问。
