一、问题的引入: 当我们创建建一个类的对象以后,我们可以通过“对象 . 属性”进行赋值。这里,赋值操作要收到属性的数据类型和存储范围的制约。除此之外,没有其他的制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,那么这个限制条件就不能在属性声明的时候体现,我们只能通过方法进行限制条件的添加。比如(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 合并为一个函数。
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()); } }前三个都只执行一次,都是在对象创建之前执行的.
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(形参列表)”
1.为了更好的实现项目中类的管理,提供包的概念. 2.使用package声明类或接口所属的包,声明在源文件的首行. 3.包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”. 4.每“·”一次,就代表一层文件目录. 5.同一个包下,不能命名同名的接口、类。不同的包下,可以命名同名的接口、类。
import:导入
在源文件中使用import显式的导入指定包下的类或接口声明在包的声明和类的声明之间。如果需要导入多个类或接口,那么就并列显式多个import语句即可举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的 是哪个类。如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。import static组合的使用:调用指定类或接口下的静态的属性或方法① 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; } } 创建 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; }