一.面向对象特征之一:封装性
-
为什么需要封装?封装的作用和含义?
我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内
部的结构吗?有必要碰电动机吗? -
我们程序设计追求“高内聚,低耦合”
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。
-
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提
高系统的可扩展性、可维护性。
通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
/*
* 面向对象的特征一:封装与隐藏
*
* 一.问题的引入
* 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值.
* 这里赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约条件.
* 但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件.这个条件就不能再属性声明时体现,
* 我们只能通过方法进行限制条件的添加.(比如:setAge())
* 同时,我们需要避免用户在使用"对象.属性"的方式对属性进行赋值.则需要将属性声明为私有的(private)
* -->此时,针对于属性就体现了封装性.
*
*
* 二.封装性的体现:
* 我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
*
* 拓展:封装性的体现: ①如上 ②不对外暴露的私有方法 ③单例模式 ... ...
*/
public class AnimalTest {
//测试类
public static void main(String[] args) {
Animal a=new Animal();
a.name="毛毛";
//a.age=3;//age被设置为private(私有的)
a.character="温顺";
a.show();
//a.age=-5;//不能让年龄为负数
//a.show();
a.setAge(-1);
a.show();
a.setAge(3);
a.show();
}
}
//动物类
class Animal{
String name;//名字
private int age;//年龄
String character;//性格
//设置年龄不能为负数
//对属性的设置
public void setAge(int setage) {
if (setage>=1) {
age=setage;
}else {
age=1;
}
}
//对属性的获取
public int getAge() {
return age;
}
public void eat() {
System.out.println("动物在吃");
}
public void show() {
System.out.println("这个小动物名字为:"+name+",年龄为:"+age+"岁,性格为:"+character);
}
}
/*
* 三.封装性的体现,需要权限修饰符来配合
* 1.Java规定的4种权限(从小到大排列):private、缺省、protected、public
* 2.4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
* 3.具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
* 修饰类的话,只能使用:缺省、public
*/
四种访问权限修饰符:
Java权限修饰符public、protected、(缺省)、private置于类的成员定义前, 用来限定对象对该类成员的访问权限。
对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
总结封装性:
Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小
二.封装性练习和体会
/*
* 1.创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在 PersonTest 类 中实例化 Person 类的对象 b , 调 用 setAge() 和
getAge()方法,体会Java的封装性。
*/
public class Person {
private int age;
public void setAge(int a) {
if (a<0 || a>130) {
//throw new RuntimeException("传入的数据非法");
System.out.println("传入的数据非法");
}else {
age=a;
}
}
public int getAge() {
return age;
}
}
public class PersonTest {
public static void main(String[] args) {
Person p1=new Person();
p1.setAge(30);
System.out.println(p1.getAge());
}
}
三.构造器的理解和使用的细节说明
/*
* 类的结构之三:构造器(或构造方法、constructor)的使用
* construct:建设、建造 construction:CCB constructor:建造者
*
* 一、构造器的作用:
* 1.创建对象
* 2.初始化对象的信息
*
* 二、说明:
* 1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
* 2.定义构造器的格式,权限修饰符 类名(形参列表){}
* 3.一个类中定义的多个构造器,使彼此构成重载
* 4.一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
* 5.一个类中,至少会有一个构造器
*
* 三、根据参数不同,构造器可以分为如下两类:
* 1.隐式无参构造器(系统默认提供)
* 2.显式定义一个或多个构造器(无参、有参)
*
* 四、注意:
* 1.Java语言中,每个类都至少有一个构造器
* 2.默认构造器的修饰符与所属类的修饰符一致
* 3.一旦显式定义了构造器,则系统不再提供默认构造器
* 4.一个类可以创建多个重载的构造器
* 5.父类的构造器不可被子类继承
*/
public class Person {
//属性
String name;
int age;
//构造器
public Person() {
System.out.println("Person()... ...");
}
public Person(String n) {
name = n;
}
public Person(String n,int a) {
name = n;
age = a;
}
//方法
public void eat() {
System.out.println("人吃饭");
}
public void study() {
System.out.println("人学习");
}
}
public class PersonTest {
public static void main(String[] args) {
//创建类的对象:new + 构造器
Person p = new Person();
p.eat();
Person p1= new Person("Tom");
System.out.println(p1.name);
}
}
四.构造器的练习
/*
* 编写两个类,TriAngle和TriAngleTest,
* 其中TriAngle类中声明私有的底边长base和高height,
* 同时声明公共方法访问私有变量。
* 此外,提供类必要的构造器。
* 另一个类中使用这些公共方法,计算三角形的面积。
*/
public class TriAngle {
private double base;//底边长
private double height;//高
public void setBase(double b) {
base = b;
}
public double getBase() {
return base;
}
public void setHeight(double h) {
height = h;
}
public double getHeight() {
return height;
}
//构造器
public TriAngle() {
}
public TriAngle(double b,double h) {
base = b;
height = h;
}
}
public class TriAngleTest {
public static void main(String[] args) {
TriAngle t1=new TriAngle();
t1.setBase(2.0);
t1.setHeight(3.2);
System.out.println("底边长为:"+t1.getBase() + ",高为:"+t1.getHeight());
TriAngle t2 = new TriAngle(2.5,4.0);//构造器
System.out.println("底边长为:"+t2.getBase() + ",高为:"+t2.getHeight());
System.out.println("面积为" + (t2.getBase() * t2.getHeight()) / 2);//5.0
}
}
五.属性赋值过程
/*
* 总结:属性赋值的先后顺序
*
* ① 默认初始化
* ② 显式初始化
* ③ 构造器中初始化
* ④ 通过“对象.属性“或“对象.方法”的方式赋值
*
* 赋值的先后顺序:① - ② - ③ - ④
*/
六.JavaBean(拓展知识)
1.JavaBean是一种Java语言写成的可重用组件
2.所谓javaBean,是指符合如下标准的Java类:
> 类是公共的
> 有一个无参的公共的构造器
> 有属性,且有对应的get、set方法
3.用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以
用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP
页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用
户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关
心任何改变。
public class UserTest {
private String name; // 属性一般定义为private
private int age;
public UserTest() {
}
public int getAge() {
return age;
}
public void setAge(int a) {
age = a;
}
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
}
七.UML类图(拓展知识)
1. + 表示 public 类型, - 表示 private 类型,#表示protected类型
2. 方法的写法:
方法的类型(+、-) 方法名(参数名: 参数类型):返回值类型