Java的面向对象编程:封装 - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > Java的面向对象编程:封装

Java的面向对象编程:封装

 

1)封装

封装的简单介绍:

和c#以及其他的面向对象编程的语言相似,面向对象编程的三大特性:封装、继承、多态。在Java中,封装的使用和其他的语言大同小异;封装目的是将属性设置为私有的(private),在Java中,可以通过使用setter方法和getter方法进行封装

使用MyEclipse的过程中,可以不用手工打造“封装”,提供了快速封装的办法:选中或者可以不选中要封装的属性(鼠标光标必须选择在当前类的大括号内),然后按键盘的Shift + Alt + s,会呼出一个菜单,选择“Generate Getters and Setters”,可以进行选择性的封装属性的操作。

:Java中的封装使用:

编写一个类名为“getterAndSetter”的类:

属性:1-姓名;2-年龄;方法:我叫什么,我的年龄多大。

要求:年龄不得小于18,否则print一条错误,且将年龄的默认值设置为18。

demo:

 

package courseOOP1;

public class getterAndSetter
{
	//属性
	private int age;
	private String name;
	//setters方法与getters方法实现封装。
	public void setAge(int age) {
		if (age < 18)
		{
			this.age = 18;
			System.out.println("年龄有问题!");
		}
		else
		{
			this.age = age;
		}
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	//写一个返回String 类型的方法。
	public String myInfo()
	{
		return ("我的名字"+name+','+"我的年龄"+age);
	}
	//在类中写一个静态的main方法,用来测试类。
	public static void main(String []args)
	{
		//实例化对象"gs"
		getterAndSetter gs = new getterAndSetter();
		//gs.age = 25;①
		//gs.name = "小Q";①
		//给对象赋各种值(可以用上方被注释①的赋值的方式)。
		gs.setAge(16);
		gs.setName("大Q");
		System.out.println(gs.myInfo());
	}
}

这样就实现了对属性的访问限制;好比你有一个房子,有了墙围起来,但是却没有锁头和钥匙,getter方法和setter方法就很好地解决了这一尴尬问题,使得该进来的数据可以进来进行修改,不该进来的数据访问则被拒绝且给予默认值。

2)构造方法:

:构造方法的介绍:

构造方法,也叫做“构造函数”,在这里,我将统一称为构造方法。

如果需要实例化对象,则必须使用构造方法,默认类中如果没有构造方法,则会调用默认的构造方法。在实例化对象的赋值等号右侧,其实就是在调用构造函数的过程。

等一下我会在扼要的说明一下。

:构造方法的特点:

说的更简洁些,构造方法是用来给对象实例初始值;如果你接触过其他的面向对象的语言,相信这个非常不难理解,哈哈。

构造方法的特征:

㈠:方法名必须与类名相同。
㈡:没有返回类型。

带参的构造函数的使用,解决了新实例化对象初始化值的问题。

写一个简单的构造函数(无参+有参):

demo1:

先写一个tearcherConstructor类:

 

public class tearcherConstructor
{
	//先写一个无参构造方法
	public tearcherConstructor()
	{
		setName("火星人");
	}
	public tearcherConstructor(String name , int age ,
			String hobby , String position) {
		// TODO Auto-generated constructor stub
		setName(name);//给默认方法中的name初始值。
		setAge(age);
		setHobby(hobby);
		setPosition(position);
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public String getHobby() {
		return hobby;
	}
	public void setPosition(String position) {
		this.position = position;
	}
	public String getPosition() {
		return position;
	}
	private String name;
	private int age;
	private String hobby;
	private String position;
	public String introInfo()
	{
		return ("我的名字" + name + ",年龄" + age + ",爱好"
				+ hobby + ",职业" + position);
	}

}

再写一个testConsole类,类中写一个静态的方法,用来测试写的类:

 

public class testConsole {
	public static void main(String []args)
	{
		tearcherConstructor tc = new tearcherConstructor();
		//tc.setName("Angel");//不给name赋值,在这里对象会调用无参构造方法。
		tc.setAge(16);
		tc.setHobby("News && report");
		tc.setPosition("media");
		//tc.introInfo();
		System.out.println(tc.introInfo());
		//使用有参的方法,显式调用。
		tearcherConstructor tc2 = new tearcherConstructor("Angel"
				, 23 , "code" , "design");
		System.out.println(tc2.introInfo());

	}

}

ok,这样,就实现了自动调用相同方法名的不同构造方法,其实这个也实现了方法的重载+1。

补充下我刚要说明的:

在创建对象实例赋值的等号右侧,如果无参数,会使用默认的构造函数;

构造方法调用:new ();
实例调用方法:通过.操作符来访问。 

3)方法的重载:

方法重载的优势就是在相同的方法名,针对传入的不同参数个数,或者相同的参数个数但类型不同,类似于方法的重用。

举一个日常中的例子来说明:

针对“自行车”,“电动车”,“摩托车”,都向他们使用相同的方法“骑车”;这三个方法都有各自的不同的参数——“自行车”,“电动车”,“摩托车”;具体的实现了三个不同的方法。

在这里说明下:由“方法名(参数列表)”构成的可以看成“方法签名”。

关于方法的重载,如果你细心的话,在Java中的系统print()方法就能实现方法重载(不多介绍)。

4)构造方法的重载:

demo2:

 

public class withConstruct
{
	public withConstruct(String name , int age ,
			String hobby ,String living )
	{
		setName(name);
		setAge(age);
		setHobby(hobby);
		setLiving(living);
	}
	//重载构造方法(构造函数)2
	public withConstruct(String name , int age)
	{
		setName(name);
		setAge(age);
	}
	public String message()
	{
		return ("你好,我的名字叫"+name+
				",年龄"+age+",爱好"+hobby+",居住地"+living);
	}
	private String name;
	private int age;
	private String hobby = "没有";
	private String living = "水星";
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public String getHobby() {
		return hobby;
	}
	public void setLiving(String living) {
		this.living = living;
	}
	public String getLiving() {
		return living;
	}
	//在这里直接写main()方法,用来测试类。
	public static void main(String []args)
	{
		withConstruct wc = new withConstruct("Angel" , 19
				,"34455" , "870805" );
		System.out.println(wc.message());
		withConstruct wc2 = new withConstruct("david" , 23);
		System.out.println(wc2.message());
	}
}

在这里,这两个构造函数的参数列表不同,形成了构造函数的重载+2;

重载分为两种:

①:参数个数相同,但对应的类型不同。

②:参数的个数不同。

③:参数有不同种类型。

 

或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2010/12/14/java-encapsulation-construct-method-and-overload.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (5) Trackbacks (0)
发表评论 Trackback
 
5 Comments Contributed by Visitors
  1.     Mucid 2010年12月14日13:51 1#

    哇,就到Java啦! ok

  2.     Angel 2010年12月14日14:10 2#

    @Mucid
    额。。必须java,嘿嘿;
    打算要把宽带续费了,3G的流量用超了,,唉…1M就需要3毛钱,,还不如搞个宽带划算。。

  3.     诺基亚n73手机主题 2010年12月15日12:58 3#

    封装是java的基本特点之一啊。。。呵呵。。

  4.     zhiwei 2010年12月19日01:31 4#

    java总体上还不错,但是最近oracle搞的java心神不宁,俺也不想再玩java了。

  5.     Angel 2010年12月19日07:14 5#

    @zhiwei
    额。。好久我都没关注新闻了。。
    嘿嘿,我打算以后想从事Java方向,,还得自学很多东西。。 ok

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...