导入其他包,轻松实现跨包调用 | 带你学《Java面向对象编程》之六十八-阿里云开发者社区

开发者社区> 温柔的养猫人> 正文

导入其他包,轻松实现跨包调用 | 带你学《Java面向对象编程》之六十八

简介: 本节为读者介绍了不同的包之间如何调用其内的类-使用import导入其他包内容。
+关注继续查看

上一篇:一文带你迅速搞懂包是什么 | 带你学《Java面向对象编程》之六十七
【本节目标】
通过阅读本节内容,你将了解到如何使用import导入其他包实现跨包调用类、如何处理多个包中存在同名类的情况、静态导入纯静态类可以实现方法的直接调用等内容。

包的导入

利用包的定义实际上就可以将不同功能的类保存在不同的包之中,但是这些类彼此之间也一定会存在有互相调用的关系,那么在这种情况下就需要使用import语句来导入其它包中的程序类。
范例:定义一个程序类“cn.mldn.util.Message”,这个类负责进行一个消息数据的获取

package cn.mldn.util ;
public class Message {
    public String getContent() {
        return "www.mldn.cn" ;
    }
}

范例:定义一个测试类使用Message类“cn.mldn.test.TestMessage”。

package cn.mldn.test ;
import cn.mldn.util.Message ;      //导入其它包的类
public class TestMessage {
    public static void main(String  args[]) {
       Message msg = new Message() ;    //实例化类对象
         System.out.println(msg.getContent()) ;     //www.mldn.cn
    }
}

此时按照使用顺序来讲肯定是要先编译Message.java,而后再编译TestMessage.java,但是请思考一个问题:如果有一个程序代码,里面有100个类,彼此之间互相引用严格,此时怎么区分呢?那么这个时候最好的做法不是区分顺序,而是直接交给Java自己去完成:javac -d . *.java;
特别需要注意的是:关于public class 与class定义的区别?

  • public class:类名称必须与文件名称保持一致,一个*.java文件里面只允许有一个public class,同时如果一个类需要被其它的包所使用,那么这个类一定要定义为public class;
  • class:类名称可以与文件名称不一致,并且在一个.java文件里面可以提供有多个class定义,编译后将形成不同的.class文件,但是这些类只能被本包所访问,外包无法访问。
  • 在实际的开发之中往往在一个*.java源代码文件里面只会提供有一个程序,而这个程序类一般都使用public class定义;

程序类中定义的包名称必须采用小写字母的形式定义,例如:cn.mldn.util;
但是这个时候会有一个新的问题产生,有些时候可能会使用某一个包中的很多类,于是这样分开进行类的导入会比较麻烦,为了解决这样的问题,也可以使用通配符“*”来进行处理。

package cn.mldn.test ;
import cn.mldn.util.* ;     
public class TestMessage {
      public static void main(String  args[]) {
            Message msg = new Message() ;    //实例化类对象
            System.out.println(msg.getContent()) ;     //www.mldn.cn
      }
}

即便此时使用了“包.”的导入形式,那么也不表示要进行全部的加载,它会根据自己的需要加载所需要的程序类,而不需要的程序类是不会被加载的,所以是使用“”还是使用具体的类其最终性能是完全相同的。

但是如果在开发中采用的是“包.*”的形式进行包的导入时,那么会有一点比较麻烦:有可能两个不同的包中存在有相同的类名称。例如,现在假设TestMessage类由于某种需要要导入两个包:cn.mldn.util、org.demo,但是这两个包里面都有Message类。
cn.mldn.util.Message:

package cn.mldn.util ;
public class Message {
    public String getContent() {
        return "www.mldn.cn" ;
      }
}

org.demo.Message:

package org.demo;
public  class Message {
      public  String getInfo() {
            return "人民万岁!";
      }
}

由于某种需要在TestMessage类里面导入了两个包:

package cn.mldn.test ;
import cn.mldn.util.* ;       //导入其它包的类
import org.demo.* ;        //导入其它包的类
public class TestMessage {
      public static void main(String  args[]) {
            Message msg = new Message() ;    //实例化类对象
            System.out.println(msg.getContent()) ;     //www.mldn.cn
      }
}

程序编译:
javac-d . TestMessage.java

     org.demo中的类org.demo.Message和cn.mldn.util中的类cn.mld n.util.Message都匹配Test Message.java:6:错误:对Message的引用不明确

Message msg=new Message() ; //实例化类对象

org.demo中的类org.demo.Message和cn.mld n.util中的类cn.mld n.util.Message都匹配2个错误

这个时候就会发现类名称相同的时候就会出现不明确的引用处理,所以此时最简单的处理形式就是直接写上类的完整名称。

cn.mldn.util.Message msg = new cn.mldn.util.Message() ;

在日后的开发过程之中经常会见到大量的重名的类(包不重名),此时为了更好的解决问题,往往会使用类的完整名称进行操作。

包的静态导入

假如说现在有一个类,这个类中的全部方法都是static方法,那么按照原始做法肯定要导入程序所在的“包.类”,然后才可以通过类名称调用这些静态方法;
范例:定义一个MyMath数学类

package cn.mldn.util ;
public class MyMath {
   public static int add(int ... args) {
       int sum = 0 ;
       for (int temp : args) {
          sum += temp ;
       }
       return sum ;
   }
   public static int sub(int x , int y) {
             return x - y ;
   }
}

如果此时按照原始的方式进行导入处理,那么此时就需要导入包.类,而后通过类名称调用方法。
范例:原始方式使用

package cn.mldn.test ;
import cn.mldn.util.MyMath ;      
public class TestMath {
   public static void main(String  args[]) {
       System.out.println(MyMath.add(10 , 20 ,30)) ;
       System.out.println(MyMath.sub(30 ,20)) ;
   }   //执行结果:60    10
}

从JDK1.5开始,对于类中全部由静态方法提供的特殊类是可以采用静态导入处理形式的。
范例:静态导入处理

package cn.mldn.test ;
import static cn.mldn.util.MyMath.* ;      
public class TestMath {
    public static void main(String  args[]) {
       System.out.println(add(10 , 20 ,30)) ;
       System.out.println(sub(30 ,20)) ;
    }   //执行结果:60    10
}

当使用了静态导入处理之后就好比该方法是直接定义在主类中的,可以由主方法直接调用。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:“化繁为简”-神奇的Jar命令 | 带你学《Java面向对象编程》之六十九
更多Java面向对象编程文章查看此处

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
json格式的字符串转为json对象遇到特殊字符问题解决
中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 1 var json={ 2 "school": [ 3 { 4 ...
613 0
[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七:   程序包的创建与应用(聪明在于学习,天才在于积累!) ——通过知识共享树立个人品牌。
1208 0
SpringBoot-13-插曲之Node文件重命名+自动生成json对象
遇到的问题:图片太多,使用起来挺麻烦 [1]有很多图片放服务器里,怎么能更好的管理,更方便拿到图片呢? [2]想用json 以一个对象数组的形式保存这些图片:以[{img:"图片名"},{img:"图片名"}....]形式 [3]虽说想法是很好,但不可能一条一条自己写吧,好歹咱也是21世纪敲代码的人。
829 0
06.Java网络编程(java GUI实现的聊天界面)
目前测试存在两个问题 1.最初是继承Frame来实现界面显示,后来发现,界面中部分控件存在时而显示时而不显示的问题,查找资料之后,将Frame修为JFrame,并且修改setVisible的时机,界面显示的问题解决,不显示的原因,有一种说法就是注释中提到的 2.
1139 0
1172
文章
2
问答
来源圈子
更多
Java开发者成长课堂,课程资料学习,实战案例解析,Java工程师必备词汇等你来~
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载