封装和隐藏
- 使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。
- 对不能让调用者随意使用的属性做封装和隐藏。
一、信息的封装和隐藏
- java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节
- 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作
- 便于修改,增强代码的可维护性
- 示例:
//Person.java
public class Person{
private int age;
public void printAge(){
System.out.println("年龄是:" + age);
}
public void setAge(int a){
if(){
age = a;
}else{
System.out.println("输入的年龄" + a + "不在0-150之间");
}
}
}
//Test.java
import day06.Person;
public class Test{
public static void main(){
Person p = new Person();
p.setAge(12);
p.printAge();
}
}
二、四种访问权限修饰符
- java权限修饰符public、protected、private置于类的成员定义前,用来限定对象对该类成员的访问权限
修饰符 | 类内部 | 同一个包 | 子类 | (除前面情况之外的)任何情况 |
---|---|---|---|---|
private | Y | |||
(缺省) | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
- 对于class的权限修饰符只可以用public和default(缺省)
- public类可以在任意地方被访问
- default类只可以被同一个包内部的类访问
- 在同一个Java文件中可以写多个class,但是只能有一个public修饰的,其他的class只能是缺省的
三、类的成员之三:构造器(构造方法)
new对象实际上就是调用类的构造方法
1、 构造器的特征:
- 它具有与类相同的名称
- 它不声明返回值类型(与声明为void不同)
- 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
2、 构造器的作用:
创建对象;给对象进行初始化
3、 示例:
public class Person4{
//默认的构造方法前面有没有访问的修饰符与定义的类有关,类是public的,默认的构造方法就是public;类是缺省的,默认的构造方法就是缺省的
public Person4(){}
}
4、 构造器
- 根据参数不同,构造器可以分为如下两类:
- 隐式无参构造(系统默认提供)
- 显示定义一个或多个构造器(无参、有参)
- 注意 :
- java语言中,每个类至少有一个构造器
- 默认构造器的修饰符与所属类的修饰符一致
- 一旦显示定义了构造器,则系统不再提供默认构造器
- 一个类可以创建多个重载的构造器
- 父类的构造器不可被子类继承
5、 示例一
//Person6.java
public class Person6{
public Person6(){
age = 18;//初始化定义每个人的年龄为18
}
public int age;
}
//Test.java
public class Test{
public static void main(String[] args){
Person6 p6 = new Person6();
System.out.println(p6);
}
}
//输出18
6、 示例二
//Person6.java
public class Person6{
public Person6(int a,String n){
age = a;
name = n;
}
public int age;
public String name;
}
//Test.java
public class Test{
public static void main(String[] args){
Person6 p6 = new Person6(12,"张三");
System.out.println(p6.age);
System.out.println(p6.name);
}
}
7、构造方法重载
- 构造器一般用来创建对象的同时初始化对象。
- 构造器重载使得对象的创建更加灵活。
- 构造器重载,参数列表必须不同。
四、关键字——this
- 在Java中,this关键字比较难理解,它的作用和其词义很接近
- 它在方法内部使用,即这个方法所属对象的引用
- 它在构造器内部使用,表示该构造器正在初始化的对象
- this表示当前对象可以调用类的属性、方法和构造器
- 什么时候使用this关键字
- 当在方法内需要用到调用该方法的对象时,就用this
- 使用this,调用属性、方法
- 当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量是类成员
- 在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性
//Person7.java
public class Person7{
public Person7(int age,String name){
this.age = age; //this.age是类的成员变量age
this.name = name; //this.name是类的成员变量age
}
int age;
String name;
public void setName(String name){
this.name = name; //把形参name赋值给成员变量name
}
public void setName1(String name){
this.setName(name); //把setName1的形参name传递给setName
}
public void showInfo(){
System.out.println("姓名:" + this.name);
System.out.println("年龄:" + this.age);
}
}
- this可以作为一个类中,构造器相互调用的特殊格式
//Person7.java
public class Person7{
public Person7(){}
public Person7(int age){
this.age = age;
}
public Person7(String name){
this();//等同于调用public Person7()
this.name = name;
}
public Person7(int age,String name){
this(1);//等同于调用public Person7(int age)
this.age = age; //this.age是类的成员变量age
this.name = name; //this.name是类的成员变量age
}
int age;
String name;
public void setName(String name){
this.name = name; //把形参name赋值给成员变量name
}
public void setName1(String name){
this.setName(name); //把setName1的形参name传递给setName
}
public void showInfo(){
System.out.println("姓名:" + this.name);
System.out.println("年龄:" + this.age);
}
}
- 注意:
- 使用this()必须放在构造器的首行
- 使用this()调用本类中其它构造器,保证至少有一个构造器是不用this的(实际上就是不能构造器自己调用自己)
//Person7.java
public class Person7{
public Person7(){
this();//方式1:错误
this("name");//方式2:错误(this.("name")调用了public Person7(String name),相当于变相的调用了自己public Person7())
}
public Person7(int age){
this.age = age;
}
public Person7(String name){
this();//等同于调用public Person7()
this.name = name;
}
public Person7(int age,String name){
this(1);//等同于调用public Person7(int age)
this.age = age; //this.age是类的成员变量age
this.name = name; //this.name是类的成员变量age
}
int age;
String name;
五、JavaBean
- JavaBean是一种JAVA语言写成的可重用组件
- 所谓JavaBean,是指符合如下标准的
- 类是公共的
- 有一个无参的公共的构造器
- 有属性(属性一般是私有的),且有对应的get、set方法
- 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象、用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
- 示例
//一个完整的JavaBean
//私有的属性
//属性对应的get和set方法
public class Person8{
private String name;
private int sex;//性别,0男1女
private int age;
private void setName(String name)[
this.name = name;
}
public String getName(){
return this.name;
}
public void setSex(int sex){
this.sex = sex;
}
public int getSex(){
return this.sex;
}
public void setAge(int age){
this.age = age;
}
public void getAge(){
return this.age;
}
}
//Test.java
Person p8 = new Person8();
p8.setName("张三");
p8.setSex(0);
p8.setAge(20);