【安卓学习笔记】JAVA基础lesson11-包和访问权限

关键字package及其使用方法


package关键字可以将一个类放在一个包里面。使用的方法是package+包名
如 
package urien;

class Lesson11A{
	void Lesson11A(){
		System.out.println("this is Lesson11A");
	}
	public static void main(String args []){
		System.out.println("this is the main func");
	}
}

在编译上与之前的方法有点区别。
没有包的情况下:javac xxx.java
有包的情况下: javac -d (路径) xxx.java
一个个词的来解释:
javac:java文件编译的命令
-d:根据包名来生成文件夹名
(路径):这个参数代表的在哪个目录下生成名字为包名的文件夹,只要是计算机里合法的路径都是可以的,还有就是用英文输入法的'.',这个代表在当前目录
xxx.java :这个不用多说,当然是只编译哪个java文件了

如果在命令后面加上了这个参数,在编译完成之后时候,所生成的类就会放在一个包名的文件夹里面;
如上述代码,生成的类会放在urien文件夹下,这个文件夹是编译器自动生成的。
编译后如下图所示:

类一旦打包之后,类名就会发生改变,类名改变为: “包名”+“.”+“类名”
以上述代码生成的类为例:所生成的类为urien.Lesson11A.class,所以如果要直接调用的
需要时使用命令:
java urien.Lesson11A
执行结果如下
D:\Android\src>java urien.Lesson11A
this is the main func

D:\Android\src>

在这里需要注意的是,这里包名变化并不是简单的类的路径变了,可以通过以下方式测试出来:

如上图,先把路径定位到包名的文件家里面,在这个文件夹的确能看到Lesson11A的类文件,但是直接用java执行是通不过的,这就验证了上述的说法;

包名的命名规范:
1.包名的字母一般都是小写
2.报名一般情况下是域名倒写(如域名是:ABC.com,则报名就是com.ABC)

3.包名如果含有".",那么就会生成子目录。

如包名com.ABC,则生成的类文件存储在com文件夹里面的ABC文件夹里。有多少个“.”,就有多少级目录,以此类推。

/*********************************************华丽分割线**********************************************/
访问权限主要分有:
1.公共权限 public
2.私有权限 private
3.默认权限(包级别) default
4.受保护权限 protected

public :可以修饰类,成员变量和成员函数

public在修饰类的时候需要注意:
语法规定public所修饰的类的类名需要跟类所在的java文件名保持一致,如果没有则在编译的时候就会报错;
public所修饰的类的好处是在于:不在一个包的另一个类如果可以直接通过报名调用公共类;
如:
package urienA;

public class Lesson11A{
	public String str;
	public int num;
	
	public void func(){
		System.out.println("this is Lesson11A");
	}
}


package urienB;

class Lesson11B{
	urienA.Lesson11A A = new urienA.Lesson11A();
}


同样的,对于成员变量和成员函数也是一样的,如果有两个类,一个类想访问另一个类的成员变量和成员年函数,不在一个包,是没有权限访问的。

换一种说法:在不不同的包中,一个类想要访问另一个类的话,要求被访问的类有public权限,要想访问成员变量和成员函数时,也需要成员变来那个和成员函数有public权限。

private权限:
使用方法同public一样 在变量和函数前加private关键字修饰非特殊情况下只能修饰成员变量和成员函数;被private关键字修饰过的成员变量和成员函数,只能在当前的类中使用,在类的外部不论包是否相同都无法使用。

default权限:
使用default权限修饰,无需加任何关键字修饰,在相同的包当中可以任意访问,不在一个包内无法访问;

protected权限:
拥有和default一样公能,但是protected只能修饰变量和函数。同时如果在父类里面用protected修饰的变量和函数,是允许继承的子类跨包使用的。

这里再特记一下:
如果有以下类:
public class Lesson11A{
	public String str;
	protected int num;
	
	public void func(){
		System.out.println("this is Lesson11A");
	}
	
}
这里有
public String str;
protected int num;
两个成员变量。其中str是public类型,num是protected类型,这两个在权限上的区别是public是公共的,其他的类只要访问了这个类,这个变量就可以使用;protected修饰的成员变量和函数只有继承的子类才能访问;
/*********************************************华丽分割线**********************************************/
包的导入

如:
package urienA;

public class Lesson11A{
	public String str;
	public int num;
	
	public void func(){
		System.out.println("this is Lesson11A");
	}
	
}

package urienB;

class Lesson11B{
	urienA.Lesson11A A = new urienA.Lesson11A();
}

在包urienA和urienB中的两个类Lesson11A和Lesson11B,在Lesson11A是公共类的前提下,如果类Lesson11B想要访问类Lesson11A除了使用

urienA.Lesson11A A = new urienA.Lesson11A();//包名加类名的方法

还可以使用包的导入方法:

package urienB;
import urienA.Lesson11A
class Lesson11B{
	Lesson11A A = new Lesson11A();
}

这里的import urienA.Lesson11A就是奖包urienA中的Lesson11A导入的意思;

当然也可以使用多条import1️以导入不同的类,再有就是一个更简单的方法,用  import urienA.* 可以把包urienA里面的类都导入进来;导入进来后就可以不用写包名,直接写类名就可以了

访问权限与继承
在类的继承关系中也同样遵从以上规则;
子类和父类如果不在同一个包当中,首先父类必须公共的才能跨包被继承,同时,父类里面拥有的成员变量和成员函数如果需要被子类继承,也是需要被修成成public公共才能使用的;

如果父类的变量和函数定义成了private(私有)的,子类也是无法使用的。

总结:

在编写代码的时候最好是把成员变量和成员函数的权限定义到最小,这样才能体现出来面向对象的封装性;

By Urien 2017年8月31日 21:27:13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值