Java进阶 - 打包

Java进阶 ---- 封装

      封装,是面向对象三大特征之一。它指的是将对象的状态信息隐藏在对象内部,不允许其他累直接访问,带有隐私权的概念。假如其他类要访问一个类的私有属性,只能通过它对外开放的方法是才合法的,否则都是违法,不允许放行的。

      因为封装,于是出现了访问控制符的出现,他们分别是private默认无修饰符(default)、protectedpublic 四种,下面分别介绍下它们:

        private: 译意是“私有的”。被private修饰的属性或者方法是几乎被类完全占有,它只能在定义它的类里使用,如果外界需要访问,那么可以通过类对外开放的方法。

      default:没有使用任何访问控制符,就称它是默认访问控制(和friendly是不同时期的同一产物)。它的最高限制在同个包里,即被default修饰的属性只能被同个包里的其它类访问,当然可以在定义它的类里被访问。

       protected:译意是“被保护的”。它又高一级 -- 子类访问权限,即继承这个类的子类不管跟父类有没有在同个包,都可以访问被protected修饰的成员。同理,同个包中,同个类中也可以被访问咯。

         public:   译意是“公共的”。 这是最宽松的访问控制级别。只要一个类在其它类能生产实例,那么该实例就可以毫无阻碍的访问任何被public修饰的成员。

 

       小结如下表

Java进阶 -  打包

 

       代码如下

package encapsulation;

/**************************************************
 *                                                
 * @author:      瘋叻ハ.兩                                                                 
 * @create-time: 2011-5-29 下午09:37:32             
 * @revision:    1.0                                
 * @purpose:     模拟同个包内的访问情况                    
 *                                                
 ***************************************************/
class T{
	private String name;
	public int age;
	private T(){
		
	}
	
	T(String name){
		this.getName(name);
	}
	private void getName(String name){
		// 用传入的参数赋值给私有属性name
		this.name = name;
		// 在同个类里访问私有属性;前面并没有提到this的使用说明,这里小注下,它可以简单理解成类的实例的替身
		System.out.println("名称是:"+this.name);
	}
	
	// default修饰的方法
	void say(){
		System.out.println("My Name is "+this.name);
	}
	
}

public class TestVisit {
	public static void main(String[] arg){
		// new T(); 无参构造是私有的,只能在本类中调用,比如T类在构造方法调用自己的私有方法
		
		// 有参构造不是私有的,可以同包类之间调用
		T t = new T("pirates");
		// 根据上行的,t不能调用私有的getName方法及name属性
		//t.getName();
		
		// 但是可以使用默认的方法
		t.say();		
	}
}

      运行结果

            名称是:pirates
            My Name is pirates

 

       结果分析:如果还不清楚结果的原因,可以自行阅读“Java起航 ---- 方法”一文中关于方法传递引用变量的思想,在此就不解释了

 

 

 

      既已提到封装的概念,顺便分享下我找到解释为什么Java的代码会有 public static void main(String[] args){ }

 

      jvm在试图运行一个类之前,先检查该类是否包含一个特殊方法。

 1、这个方法必须是公有的,以便在任何位置都能访问得到。

 2、这个方法必须是static的,因为这个方法不能依赖任何该类的实例即可运行,而非static的方法,在运行之前要先创建该类的实例对象。

 3、这个方法没有返回值。和C/C++程序不一样,java的程序默认都以常态结束,所以main不需要返回值。如果要以非常态结束程序,可以用System.exit(1)。

 4、这个方法必须可以接受数目不定的String类型的参数,最早并没有JavaIDE工具,方便运行者可能要附加运行参数。

如java HelloWorld jack 100,这里的jack和100就是运行参数。


为什么是String呢?因为String具有普遍性。任何字面形式都可以解释成String,而其他类型则不然(如jack就不能解释成整数或浮点数),所以用String来存储参数最合适。
而因为参数数目不限一个,所以用了数组,即String[]。在Java 1.5以后,还可以写成String...,表示数目不定。
至于参数的变量名可以任意,只要保证在方法内部按该变量名来获得参数就行了,从变量的作用角度来说,叫arguments或args当然是最合适的。

至于这个方法的名字为什么一定是main,有历史原因,因为最早的C以main函数作为程序入口,java沿用了这个历史传统。

 

        在此谢谢作者...Dan1980