Java面向对象(4)(封装性、构造器的细节说明、属性赋值过程、JavaBean、UML类图)

一.面向对象特征之一:封装性

  • 为什么需要封装?封装的作用和含义?
    我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内
    部的结构吗?有必要碰电动机吗?

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

  • 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提
    高系统的可扩展性、可维护性。
    通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。


/*
 * 面向对象的特征一:封装与隐藏
 * 
 * 一.问题的引入
 * 当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值.
 * 这里赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约条件.
 * 但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件.这个条件就不能再属性声明时体现,
 * 我们只能通过方法进行限制条件的添加.(比如: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. 方法的写法:
方法的类型(+、-) 方法名(参数名: 参数类型):返回值类型


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值