Java - day10(面对对象上3 封装和隐藏 构造器 this的使用等)

封装与隐藏

在这里插入图片描述
一、问题的引入:
当我们创建建一个类的对象以后,我们可以通过“对象 . 属性”进行赋值。这里,赋值操作要收到属性的数据类型和存储范围的制约。除此之外,没有其他的制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,那么这个限制条件就不能在属性声明的时候体现,我们只能通过方法进行限制条件的添加。比如(setLegs())同时,我们需要避免用户在使用“对象,属性”的方式对属性进行赋值。则则需要将属性声明为私有的(private).
→此时正对属性就体现了封装性.

二、封装性的体现:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getxxx)和设置(setxxx) 此属性的值。一般set就相当于拿个工具去给人家修东西,修好了就走,不需要返回值,但是需要传参。而get就相当于去拿一个东西不需要传参,但是需要返回值。

拓展: 封装性的体现:①如上 ②不对外暴露的私有方法 ③单例模式 ……

三:封装性的体现,需要权限修饰符的配合.
1,Java规定的4种权限(从小到大排序),private、缺省(没有具体的修饰符就是确省)、protected、public。

2,4种权限可以用来修饰类及类的内部结构:属性、方法。构造器、内部类。

3,具体的,4种权限都可以用来修饰类的内部结构:属性、方法。构造器、内部类。
修饰类的话,只能使用:缺省(default)、public

总结封装性:Java提供了4中权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用是 的可见性的大小。
在这里插入图片描述

public class AnimalTest {
	public static void main(String[] args) {
		Animal a = new Animal();
		a.name = "大黄";
		a.age = 3;
		
		a.setLegs(6);
		System.out.println(a.getLegs());
		a.show();
	}
}

class Animal{
	int age;
	String name;
	private int leg;
	
	//属性的设置
	public void setLegs(int i) {
		if(i > 0 && i % 2 == 0) {
			leg = i;
		}else {
			leg = 0;
		}
	}
	
	//属性的获得
	public int getLegs() {
		return leg;
	}
	
	public void action() {
		System.out.println(name+"会跑");
	}
	
	public void show() {
		System.out.println("name:"+name+",age:"+age+",leg:"+leg);
	}
}

执行结果:
在这里插入图片描述
这里leg是私有的我们只能通过setLegs()这个方法的接口去调用leg属性.就相当于我们将leg属性隐藏了.
不能把getxxx 和 setxxx 合并为一个函数。

构造器(构造方法、constructor)的使用

construct:建造、构造 construction:建造.n constructor:建设者

只要造对象就一定需要构造器.

一、构造器的作用:
①创建对象

//new + 构造器
Person p = new Person();

②初始化对象的信息

二、说明:
1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
2.定义构造器的格式:权限修饰符 类名(形参列表){ }
3.一个类中 定义的多个构造器,彼此构成重载
4.一旦我们显式的定义了类的构造器之后,系统就不在提供默认的空参构造器.
5.一个类中至有一个构造器.

练习:

package com.acoffee.exer;

public class TriAngle {
	
	private double base;
	private double height;
	
	public TriAngle() {
		
	}
	
	public TriAngle(double b, double h) {
		base = b;
		height = h;
	}
	
	public void setBase(double b) {
		base = b;
	}
	
	public double getBase() {
		return base;		
	}
	
	public void setHeight(double h) {
		height = h;
	}
	
	public double getHeight() {
		return height;
	}
}
package com.acoffee.exer;

public class TriAngleTest {
	public static void main(String[] args) {
		TriAngle t1 = new TriAngle(5.5,5.3);//方式一
		System.out.println("base: "+t1.getBase()+"\theight: "+t1.getHeight());
		
		TriAngle t2 = new TriAngle();//方式二
		t2.setBase(2.1);
		t2.setHeight(3.1);
		System.out.println("base: "+t2.getBase()+"\theight: "+t2.getHeight());
	}
}

总结:属性赋值的先后顺序

在这里插入图片描述
前三个都只执行一次,都是在对象创建之前执行的.

拓展知识:JavaBean

在这里插入图片描述

拓展知识:UML类图

在这里插入图片描述

关键字:this的使用

1.this可以用来修饰:属性、方法、构造器.

2.this修饰属性和方法:
this理解为:当前对象 或当前正在创建的对象
2.1.在类的方法中,我们可以使用“ this.属性 ”或“ this.方法 ”方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略“this.”。特殊情况下,如果方法的形参和类的属性同名时,我们必须显示的使用 “ this.变量 ” 的方式,表明次变量是属性,而非形参。
在这里插入图片描述

2.2.在类的方法中,我们可以使用“ this.属性 ”或“ this.方法 ”发方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略“this.”。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显示的使用 “ this.变量 ” 的方式,表面次变量是属性,而非形参。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.this调用构造器
① 我们在类的构造器中,可以显式的使用“this(形参列表)”方式,调用本类中指定的其它构造器
② 构造器中不能通过“this(形参列表)”方式调用自己
③ 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 “this(形参列表)”,如果有n个就闭环了
④ "this(形参列表)“必须声明在类的构造器的首行!
⑤ 在类的一个构造器中,最多只能声明一个"this(形参列表)”
在这里插入图片描述
在这里插入图片描述

package关键字的使用

1.为了更好的实现项目中类的管理,提供包的概念.
2.使用package声明类或接口所属的包,声明在源文件的首行.
3.包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”.
4.每“·”一次,就代表一层文件目录.
在这里插入图片描述
5.同一个包下,不能命名同名的接口、类。不同的包下,可以命名同名的接口、类。

MVC的设计模式

在这里插入图片描述

import 关键字的使用

import:导入
1.

  1. 在源文件中使用import显式的导入指定包下的类或接口
  2. 声明在包的声明和类的声明之间。
  3. 如果需要导入多个类或接口,那么就并列显式多个import语句即可
  4. 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
  5. 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
  6. 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的 是哪个类。
  7. 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
  8. import static组合的使用:调用指定类或接口下的静态的属性或方法

练习题:

在这里插入图片描述

package com.acoffee.exer4;

public class Account {
	
	private double balance;

	public Account(double init_balance) {
		this.balance = init_balance;
	}
	
	public double getBalance() {
		 return balance;
	}
	
	public void deposit(double amt) {
		if(amt > 0) {
			balance += amt;
			System.out.println("存钱成功");
		}
	}
	
	public void withdraw(double amt) {
		if (balance > amt) {
			balance -= amt;
			System.out.println("取钱成功");
		}else {
			System.out.println("余额不足");
		}
	}
}

在这里插入图片描述

package com.acoffee.exer4;

public class Customer {
	private String firstName;
	private String lastName;
	private Account account;
	
	public Customer(String f,String l) {
		this.firstName = f;
		this.lastName = l;
	}

	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}

	public String getFirstName() {
		return firstName;
	}

	public String getLastName() {
		return lastName;
	}
	
}

在这里插入图片描述
① addCustomer 方法必须依照参数(姓,名)构造一个新的 Customer 对象,然后把它放到 customer 数组中。还必须把 numberOfCustomer 属性的值加 1。
②getNumOfCustomers 方法返回 numberofCustomers 属性值。
③getCustomer 方法返回与给出的 index 参数相关的客户。

package com.acoffee.exer4;

public class Bank {
	private Customer[] customers;//存放多个客户的数组
	private int numberOfCustomer;//记录客户的个数
	
	public Bank() {
		customers = new Customer[10];
	}
	//添加客户
	public void addCustomer(String f, String l) {
		Customer cust =new Customer(f,l);
		customers[numberOfCustomer] = cust;
		numberOfCustomer++;
	}	
	//获取客户的个数	
	public int getNumberOfCustomers() {
		return numberOfCustomer;
	}
	//获取指定位置上的客户
	public Customer getCustomer(int index) {
		//return customers[index]; 可能报异常
		if(index >= 0 && index < numberOfCustomer) {
			return customers[index];
		}
		return null;
	}
}

  1. 创建 BankTest 类,进行测试。
package com.acoffee.exer4;

public class BankTest {
	
	public static void main(String[] args) {
		
	Bank bank = new Bank();
	
	bank.addCustomer("Jane", "Smith");
	
	bank.getCustomer(0).setAccount(new Account(2000));
	
	bank.getCustomer(0).getAccount().withdraw(500);
	
	double balance = bank.getCustomer(0).getAccount().getBalance();
	System.out.println("客户:" + bank.getCustomer(0).getFirstName()+"的账户余额为:"+balance);
	}

每日一练:

1. 构造器的作用是什么?使用中有哪些注意点(>=3条)
①创建对象 ②初始化对象结构

2. 关于类的属性的赋值,有几种赋值的方式。谈谈赋值的先后顺序
默认初始化-显式初始化-构造器中初始化-对象.方法 或 对象.属性 给属性赋值

3. this关键字可以用来调用哪些结构,简单说明一下其使用。
this:属性、方法、构造器
this:理解为当前对象,当前正在创建的对象

4. Java中目前学习涉及到的四种权限修饰符都有什么?并说明各自的权限范围
private int age;
private void eat(){}

5. 创建Circle类,提供私有的radius属性,提供相应的get和set方法,提供求圆面积的方法。

private double radius;
public void setRadius(double radius){
	this.radius = radius;
}
public double getRadius(){
	return radius;
}
public double findArea(){
	return 3.14 * getRadius() * radius;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值