JAVA_SE_Day10

封装与隐藏

  • 程序的设计追求 高内聚和低耦合
  • 高内聚 类的内部数据操作细节自己完成,不允许外部干涉
  • 低耦合 仅对外暴露少量的方法用于使用

引入

  • 我们创建一个类后,可以通过"对象.属性"的方式,对对象的属性进行赋值,此时对对象的属性的赋值操作只受到属性类型和存储范围的限制。
  • 在实际问题中我们要求对象属性进行限制,而这些条件不能在属性声明的时候体现,我们也需要避免用户通过"对象。属性"进行赋值。因此我们需要用private来修饰属性

封装性

  • 将类的属性私有化(private) 提供公共(public)的方法来设置(setXXX)和获取(getXXX)属性的值
  • 举例 set/get 单例模式 私有化的内部方法

封装性的体现 权限修饰符 private -> 缺省(什么也不写default) -> protected -> public

  • private 类内部
  • default 类内部 同一个包
  • protected 类内部 同一个包 不同包的子类
  • public 类内部 同一个包 不同包的子类 同一个工程
  • 四种权限修饰符可以用来修饰,构造器,内部类,属性,方法
  • 类只能用public或缺省修饰

构造器(构造方法, constructor)

构造器的作用

  • 创建对象

说明

  • 如果没有显式的定过类的构造器的话,系统默认提供一个空参的构造器
  • 构造器的格式: 权限修饰符 类名(形参列表){}
  • 一个类中定义的多个构造器,彼此构成重载
  • 一旦我们在类中定义了构造器,系统就不再提供空参的构造器
  • 一个类中至少有一个构造器

JavaBean 是指符合下列要求的Java类

  • 类是公共
  • 有一个无参的公共构造器
  • 有属性,并且有对应的get和set

this关键字

  • this可以用来修饰 属性 构造器 方法
  • 当this修饰属性和方法时 可以理解为 this 等于 当前对象或当前正在创建的对象
  • 使用格式 this.属性 或 this。方法
  • 通常情况下不写 this. 但当形参的变量名和类的数据名相同时,使用this关键字类区分

this调用构造器

  • 在类的构造器中,可以通过 “this(形参列表)” 的方式调用本类其他的构造器
  • 构造器不能通过this调用自己
  • 如果要使用this调用其他构造器,必须声明在当前构造器首行
  • 构造器内部只能声明一个"this(形参列表)"的方式调用其他构造器
public class Test {
    
    

	public static void main(String[] args) {
    
    
		Anim an = new Anim();
		an.name = "小黑";
		an.age = 2;
		// The field Anim.legs is not visible
		// an.legs = 4 ;
		an.setLegs(8);
		an.show();
		
		// 创建类的对象 new + 构造器 
		Per p = new Per("xiao");
		p.eat();
		p.show();
		
		System.out.println( 5211314 >> 2);
	}

}

class Per{
    
    
	String name;
	int age;
	// 构造器
	public Per() {
    
    System.out.println("Per 构造器");}
	public Per(String n) {
    
    name = n;}
	public Per(int a) {
    
    age = a;}
	public Per(String n,int a) {
    
    name = n;age = a;}
	public void eat() {
    
    
		System.out.println("eat");
	}
	public void show() {
    
    
		System.out.println("name = "+name+",age = "+age);
	}
}
class Anim{
    
    
	String name;
	int age;
	// 私有化
	private int legs;
	// 对于属性的限制
	public void setLegs(int l) {
    
    
		if (l >= 0 && l % 2 == 0) {
    
    
			legs = l;
		}else {
    
    
			l = 0  ;
		}
	}
	// 对于属性的获取
	public int getLegs() {
    
    
		return legs;
	}
	// age的get和set
	public void setAge(int a) {
    
    
		age = a;
	}
	public int getAge() {
    
    
		return age;
	}
	// name的get和set
	public void setName(String name) {
    
    
		this.name = name;
	}
	public String getName() {
    
    
		return name;
	}
	public void eat() {
    
    
		System.out.println("eat");
	}
	public void show() {
    
    
		System.out.println("name = " +name+", age= "+age+", legs= "+legs);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42091436/article/details/113131146