Java中的封装和this关键字

封装

封装是面向对象的三大特征之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问

封装的具体步骤

1.修改属性的可见性来限制对属性的访问
2.为每个属性创建一对赋值方法和取值方法,用于对这些属性的存取
3.在赋值方法中,加入对属性的存取控制语句

封装的好处

1.隐藏类的实现细节
2.让使用者只能通过程序规定的方法来访问数据
3.可以方便的加入存取控制语句,限制不合理操作

封装时会用到多个权限控制符来修饰成员变量和方法,区别如下:

private:成员变量和方法,只能在其定义的类中被访问,具有类可见性
默认:成员变量和方法,只能在其定义的包里被访问,具有包可见性
protected:可以被同一个包里的类访问,被同一个项目中不同包中的子类访问
public:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限

/**
 * 宠物狗狗类,使用权限修饰符private和public进行封装
 */
class Dog {
	private String name="无名氏";
	private int health=100;
	private int love=0;
	private String strain="聪明的拉布拉多犬";
	/**
	 * 通过构造方法指定狗狗的昵称,品种
	 */
	public Dog(String name,String strain){
		this.name=name;
		this.strain=strain;
	}
	/**
	 * 通过吃饭增加健康值
	 */
	public void eat(){
		if(health>=100){
			System.out.println("狗狗需要多运动啊!");
		}else{
			health=health+3;
			System.out.println("狗狗吃饱饭了!");
		}
	}
	/**
	 * 通过玩游戏增加与主人的亲密度,减少健康值
	 */
	public void play(){
		if(health<60){
			System.out.println("狗狗生病了!");
		}else{
			System.out.println("狗狗正在和主人玩耍。");
			health=health-10;
			love=love+5;
		}
	}
	/**
	 * 读取狗狗的昵称
	 */
	public String getName(){
		return name;
	}
	/**
	 * 读取狗狗的健康值
	 */
	public int getHealth(){
		return health;
	}
	/**
	 * 读取狗狗与主人的亲密度
	 */
	public int getLove(){
		return love;
	}
	/**
	 * 读取狗狗的品种
	 */
	public String getStrain(){
		return strain;
	}
	/**
	 * 输出狗狗的信息
	 */
	public void print(){
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我是只"+this.strain+"。");
	}
	public static void main(String[] args) {
		Dog dog=new Dog("欧欧","酷酷的雪纳瑞");
		dog.play();
		System.out.println("健康值是"+dog.getHealth());
		dog.eat();
		dog.print();
	}

}


运行结果
在这里插入图片描述

This

1.使用this调用重在的构造方法,只能在构造方法中使用,必须是构造方法的第一条语句
2.因为this在对象内部指代自身的引用,所以this只能调用实例变量,实例方法和构造方法
3.this不能调用类变量和类方法,也不能调用局部变量

this调用成员变量解决成员变量和局部变量的冲突

	public Regal(String type,int id){
		this.type=type;//成员变量和局部变量相同,必须使用this
		this.id=id;

	public Regal(int ex){
			id=ex;//成员变量和局部变量的命名不同,可以不使用this
		}

this调用重载的构造方法,必须是构造方法的第一条语句,只能在构造方法中使用

public Book(int id,double price){
			this.id=id;
			this.price=price;
		}
		
		public Book(int id,double price,String bookName){
			this(id,price);
			this.bookName=bookName;
		}

用法:

表示当前对象(在哪个类就是哪个类的对象): this可以在非静态方法中直接使用,但是在静态方法中不能使用this
调用构造方法:只能在构造方法内部的第一行。且调用其它构造方法时不能方法一调用方法二,二调用三,三调用一,如此形成回路,会造成死循环。
}
(注**:需要注意的是,构造方法名必须与类名相同,且不能有返回值,如果有,则不是构造方法,而是和构造方法同名的成员方法**。)

调用属性:当参数与属性名字相同时,可以用this区分。如this.name=name;

** 总结 **

1.无参构造方法被重写时,即便又写了一个有参的构造方法 原来系统的构造方法已经不存在了。除非再写一个无参构造方法。

2.每new一次,就创建一个对象。

3.this可以被看作一个可以调用构造方法的对象(对象不能调用构造方法)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值