Java寒假学习Day9:封装和隐藏

前言:

刚复习完递归,看了斐波那契数列,我和她的所有故事,都藏着f5和f8这两个无言的数字里。

package Methods;

public class FbnqTest {
	public static void main(String[] args) {
		FbnqTest test = new FbnqTest();
		System.out.println("about her");
		System.out.print(test.getFbnqLine(5));
		System.out.println(test.getFbnqLine(8));
	}
	
	public int getFbnqLine(int n) {
		if (n == 1|| n == 2) {
			return 1;
		}else{
			return getFbnqLine(n-1)+getFbnqLine(n-2);
		}
	}
}

1.为什么要封装?

我们程序设计追求“高内聚,低耦合”

高内聚 :类的内部数据操作细节自己完成,不允许外部干涉

低耦合 :仅对外暴露少量的方法用于使用

 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可

维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

2.怎么封装

2.1封装性的理解(看下面的几种封装)

①属性的封装

package PackageTest;

public class AnimalTest {
	
	public static void main(String[] args) {
		Animal a = new Animal();
		//无任何封装
		a.name = "huahua";
		a.age = 1;
		a.legs = 4;
		a.show();
		//尝试要求legs只能赋正偶数
		a.setLegs(4);//赋值成功,输入4
		a.setLegs(1);//赋值失败,输入0
		a.legs = 3;//依旧成功,可以随便赋值
		a.show();
		//要求必须用setLegs方法给legs赋值
		//更改Animal类的属性legs
		//更改为private int legs,外部没办法调用 想要调用必须用setLegs()方法
		a.legs = 3; //显然,报错了
		a.setLegs(3);//不报错
	}
}


class Animal{
	String name;
	int age;
	private int legs;
	
	public void setLegs(int l) {
		if(l>0&&l%2==0) {
			legs = l;
		}else {
			legs = 0;
		}
	}
	
	public void show() {
		System.out.println("name ="+name +"age ="+age+"legs ="+legs);
	}
}

②不对外暴露的私有方法

③单例模式

④其他封装等

3.权限修饰符

Java 规定的四种权限:private<缺省(default)<protected<public

 

3.1权限修饰符修饰结构:

类及类的内部结构:属性,方法,构造器,内部类

对于类来说:只能用public或缺省的

权限修饰符测试:

3.1.1测试

3.1.1.1包PackageTest下的测试

Order类

package PackageTest;

public class Order {
	private int orderPrivate;
	int orderDefault;
	public int orderPublic;
	
	private void OrderPrivate() {
		orderPrivate = 1;
		orderDefault = 2;
		orderPublic = 3;
	}
	void OrderDefault() {
		orderPrivate = 1;
		orderDefault = 2;
		orderPublic = 3;
	}
	public void OrderPublic() {
		orderPrivate = 1;
		orderDefault = 2;
		orderPublic = 3;
	}
}

测试结果:public,private,缺省在同一个类中,都能使用 

OrderTest类

package PackageTest;

public class OrderTest {
	public static void main(String[] args) {
		Order o = new Order();
		
//		o.orderPrivate = 1;  
//		The field Order.orderPrivate is not visible;
//		private权限下,别的类调用就报错:不可见
		o.orderDefault = 2;
		o.orderPublic = 3;
		
//		o.OrderPrivate();
//		The method OrderPrivate() from the type Order is not visible
		o.OrderDefault();
		o.OrderPublic();
	}
	
}

 测试结果:public,缺省在同一个包下都可以使用,private不行

3.1.1.2在包Package1中再次测试

package PackageTest1;

import javaStudy.PackageTest.Order;

public class OrderTest {
	public static void main(String[] args) {
		Order o = new Order();
		
//		o.orderPrivate = 1;  
//		The field Order.orderPrivate is not visible;
//		private权限下,别的类调用就报错:不可见
//		o.orderDefault = 2;
//		The field Order.orderDefault is not visible;
//		default权限下,别的包调用就报错:不可见
		o.orderPublic = 3;
		
//		o.OrderPrivate();
//		The method OrderPrivate() from the type Order is not visible
//		o.OrderDefault();
//		The method OrderDefault() from the type Order is not visible
		o.OrderPublic();
	}
	
}

测试结果:在不同包下,仅仅public权限依旧有效,其他全部失效

 4.封装练习题

创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在PersonTest 类中实例化 Person类 的 对 象 b, 调 用 setAge()和
getAge()方法,体会Java的封装性。

Person

package PackageTest;

import javax.management.RuntimeErrorException;

public class Person {
	private int age;
	
	public void setAge(int i) {
		if(i<0||i>130) {
			throw new RuntimeException("age is out of bound");
		}else {
			age = i;
		}
	}
	
	public int getAge() {
		return age;
	}
}

 PersonTest

package PackageTest;

public class PersonTest {
	public static void main(String[] args) {
		Person p = new Person();
//		p.age = 130;编译不通过,age为private类型
		p.setAge(30);
		System.out.println(p.getAge());
		p.setAge(130);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值