Java面向对象——包和导包
5.1java 包(package)
5.1.1java包的定义
- 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间
5.1.2Java包格式
- java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等,通常把地域名地址反过来,使用小写字母来命名,文件夹之间用.隔开,
- 包语句格式:
package pkg1.pkg2.pkg3....
例如:创建一个包编写一个Animals.java文件
package net.java.util;
public clasS Animals{
public static void main(String[] args){
System.out.println("我是第一个包");
}
}
- 保存路径:某盘区/net文件夹/java文件夹/util文件夹/Animals.java文件
5.1.3Java创建包规则
先让我们想一下在win10的操作系统怎么样创建文件夹的?为什么不能创建两个相同名字的文件夹?
- 在windows操作系统下的某个文件夹下是无法创建同名的文件夹或者是文件的。同名的情况下是无法精确区分同名文件的。在windows系统下A文件下创建一个a.txt;在B文件下创建一个a.txt。这是允许的。为什么呢?在系统下区分文件的方式是通过目录+文件名的方式。
- 对于A下的a.txt而言->c:\A\a.txt
- 对于B下的a.txt而言->c:\B\a.txt
Java中创建包注意事项:
- 通过package这个关键字来指定当前类所处的包
- package包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每一个类型都应用它
- 编写代码是给类起名要注意不要和JDK内置的类同名了。
- 通过全限定名去唯一标示一个类,java中的最小的单位就是类。
- java中的对象在通过输出语句直接输出是打印的内容是全限定名(包名.类名)。
代码演示:
package com.pxcoder.myproject4;
public class Test01{
public static void main(String[] args){
System.out.println(new Test01());
}
}
执行结果:
com.pxcoder.myproject4.Test01@15db9742
5.1.4导包
大家先想一下,怎么样在一类中如何使用另一个类中的内容?这个时候就需要导包了
i.正常导包
代码演示:`
package com.mage.oop05.im;
//导入jdk中的包
import java.util.Scanner;
//导入另一个包
import com.mage.oop05.pg.Cat;
//Cat和Test不在同包下
public class Test{
public static void main(String[] args){
Cat c=new Cat();
Scanner input=new Scanner(System.in);
}
}
导包的条件:
- 当两个类在同包下时,可以不需要导包。
- 不同包下的类要想使用必须要导包。
- 在package下面,类声明的上面通过
import关键词+导入的类的全限定名。
- 在java中java.lang包下的类是不需要导包的,可以直接使用。
- 编写代码时如果出现需要导包的时候,可以使用ctrl+1来完成快速导包。
- import java.util.*;导入java.util下的所有内容。
导包的目的就是为了能够使用其它包下的类。
ii.静态导包(jdk1.7之后的静态导入)
代码演示:
import static java.lang.Math.PI;
public class Test{
public static void main(String[] args){
System.out.println(random());
System.out.println(PI);
}
}
- 通过静态导入可以导入当前类的静态内容。使用时,不需要用类名.方法();
iii.区分同名类
代码演示:
import java.util.Date;
public class Test{
public static void main(String[] args){
Date d1=new Date();
java.sql.Dated2=newjava.sql.Date(1231L);
System.out.println(d1+"=="+d2);
}
}
- import语句不能导入同名的类。
- 为了区分同名类,当出现同名类时,一个类通过import导入,另外一个通过全限定名去使用。
5.2封装修饰符
代码演示:
package com.mage.china;
public class F{
//Public/protected/default/private
public String name;
public static void main(String[] args){
//本类中的属性
F f=new F();
System.out.println(f.name);
}
}
package com.mage.china;
public class S extends F{
public static void main(String[] args){
//通过子类访问父类中public修饰的属性
S s=new S();
System.out.println(s.name);
}
}
package com.mage.china;
public class Test{
public static void main(String[] args){
//测试同包下无关的类是否可以访问public修饰的属性
F f=new F();
System.out.println(f.name);
}
}
package com.mage.en;
importcom.mage.china.F;
public class S extends F{
public static void main(String[] args){
//创建S对象访问不同包中父类中的public修饰的属性
S s=new S();
System.out.println(s.name);
}
}
package com.mage.en;
import com.mage.china.F;
public class Test{
public static void main(String[] args){
//创建f对象访问不同包不是父类中的public修饰的属性
F f=new F();
System.out.println(f.name);
}
}
修饰符/可见性 | 本类 | 同包子类 | 同包异类 | 异包子类 | 异包异类i |
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | |
default(默认的) | √ | √ | √ | ||
private | √ |
- 封装性在一定程度上其实打破了继承性
- 不通过修饰符的可见性不同,在一定程度上保证了类的安全性。