精华内容
下载资源
问答
  • java中import作用详解

    万次阅读 多人点赞 2017-07-07 17:47:19
    java中import详解import与package机制相关,这里先package入手,再讲述import以及static import的作用。

    import与package机制相关,这里先从package入手,再讲述import以及static import的作用。


    package

    C/C++ 的 #include会把所包含的内容在编译时添加到程序文件中,而java的import则不同。

    这里我们先了解一下Java 的 package 到底有何用处。

    package名称就像是我们的姓,而class名称就像是我们的名字 。package和package的附属关系用"."来连接,这就像是复姓。比如说 java.lang.String就是复姓 java.lang,名字為 String 的类别;java.io.InputStream 则是复姓 java.io,名字為 InputStream的类别。

    Java 会使用 package 这种机制的原因也非常明显,就像我们取姓名一样 ,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的 Java 类数量,恐怕比日本人还多,如果类别不使用package名称,那在用到相同名称的不同类时, 就会产生极大的困扰。所以package这种方式让极大降低了类之间的命名冲突。

    Java 的package名称我们可以自己取,不像人的姓没有太大的选择 ( 所以出现很多同名同姓的情况 ),如果依照 Sun 的规范来取套件名称,那理论上不同人所取的套件名称不会相同 ( 需要的话请参阅 “命名惯例” 的相关文章 ),也就不会发生名称冲突的情况。

    可是现在问题来了,因為很多package的名称非常的长,在编程时,要使用一个类要将多个包名.类名完全写出,会让代码变得冗长,减低了简洁度。例如

    java.io.InputStream is = java.lang.System.in;
    java.io.InputStreamReader isr= new java.io.InputStreamReader(is);
    java.io.BufferedReader br = new java.io.BufferedReader(isr);
    

    显得非常麻烦,于是Sun公司就引入了import。


    import

    import就是在java文件开头的地方,先说明会用到那些类别。
    接着我们就能在代码中只用类名指定某个类,也就是只称呼名字,不称呼他的姓。

    首先,在程序开头写:

    import java.lang.System;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;
    

    于是我们就可以在程序中这样写到:

    InputStream = System.in;
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    

    一个java文件就像一个大房间,我们在门口写着在房间里面的class的姓和名字,所以在房间里面提到某个class就直接用他的名字就可以。例如:

    System 就是指 java.lang.System,而 InputStream 就是指 java.io.InputStream。

    但是如果一个java文件里面有多个同个“姓”,即包名相同的类(例如上面的InputStream,InputStreamReader,BufferedReader都是java.io中的类),我们一一写出显得比较繁杂,所以Sun就让我们可以使用

    import java.lang.*;
    import java.io.*;
    

    表示文件里面说到的类不是java.lang包的就是java.io包的。编译器会帮我们选择与类名对应的包。

    那我们可不可以再懒一点直接写成下面声明呢?

    import java.*;
    

    历史告诉我们,这样是不行的。因為那些类别是姓 java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 先生吧。这样写的话只会将java包下的类声明,而不不会声明子包的任何类。

    这里注意,java.lang包里面的类实在是太常太常太常用到了,几乎没有类不用它的, 所以不管你有没有写 import java.lang,编译器都会自动帮你补上,也就是说编译器只要看到没有姓的类别,它就会自动去lang包里面查找。所以我们就不用特别去 import java.lang了。

    一开始说 import 跟 #include 不同,是因为import 的功能到此為止,它不像#include 一样,会将其他java文件的内容载入进来。import 只是让编译器编译这个java文件时把没有姓的类别加上姓,并不会把别的文件程序写进来。你开心的话可以不使用import,只要在用到类别的时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),这样跟使用import功能完全一样。


    import的两种导入声明

    • 单类型导入(single-type-import)
      (例:import java.util.ArrayList; )
    • 按需类型导入(type-import-on-demand)
      (例:import java.util.*;)

    有如下属性:

    1. java以这样两种方式导入包中的任何一个public的类和接口(只有public类和接口才能被导入)

    2. 上面说到导入声明仅导入声明目录下面的类而不导入子包,这也是为什么称它们为类型导入声明的原因。

    3. 导入的类或接口的简名(simple name)具有编译单元作用域。这表示该类型简名可以在导入语句所在的编译单元的任何地方使用.这并不意味着你可以使用该类型所有成员的简名,而只能使用类型自身的简名。
      例如: java.lang包中的public类都是自动导入的,包括Math和System类.但是,你不能使用它们的成员的简名PI()和gc(),而必须使用Math.PI()和System.gc().你不需要键入的是java.lang.Math.PI()和java.lang.System.gc()。

    4. 程序员有时会导入当前包或java.lang包,这是不需要的,因为当前包的成员本身就在作用域内,而java.lang包是自动导入的。java编译器会忽略这些冗余导入声明(redundant import declarations)。即使像这样
      import java.util.ArrayList;
      import java.util.*;
      多次导入,也可编译通过。编译器会将冗余导入声明忽略.


    static import静态导入

    在Java程序中,是不允许定义独立的函数和常量的。即什么属性或者方法的使用必须依附于什么东西,例如使用类或接口作为挂靠单位才行(在类里可以挂靠各种成员,而接口里则只能挂靠常量)。

    如果想要直接在程序里面不写出其他类或接口的成员的挂靠单元,有一种变通的做法 :
    将所有的常量都定义到一个接口里面,然后让需要这些常量的类实现这个接口(这样的接口有一个专门的名称,叫(“Constant Interface”)。这个方法可以工作。但是,因为这样一来,就可以从“一个类实现了哪个接口”推断出“这个类需要使用哪些常量”,有“会暴露实现细节”的问题。

    于是J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员。static import和import其中一个不一致的地方就是static import导入的是静态成员,而import导入的是类或接口类型

    如下是一个有静态变量和静态方法的类

    package com.assignment.test;
    
    public class staticFieldsClass {
    	static int staticNoPublicField = 0; 
    	public static int staticField = 1;
        public static void staticFunction(){}
    }
    

    平时我们使用这些静态成员是用类名.静态成员的形式使用,即staticFieldsClass.staticField或者staticFieldsClass.staticFunction()。

    现在用static import的方式:

    //**精准导入**
    //直接导入具体的静态变量、常量、方法方法,注意导入方法直接写方法名不需要括号。
    import static com.assignment.test.StaticFieldsClass.staticField;
    import static com.assignment.test.StaticFieldsClass.staticFunction;
    
    //或者使用如下形式:
    //**按需导入**不必逐一指出静态成员名称的导入方式
    //import static com.assignment.test.StaticFieldsClass.*;
    
    public class StaticTest {
        public static void main(String[] args) {
    	    //这里直接写静态成员而不需要通过类名调用
            System.out.println(staticField);
            staticFunction();
        }
    }
    
    

    这里有几个问题需要弄清楚:

    1. Static Import无权改变无法使用本来就不能使用的静态成员的约束,上面例子的StaticTest和staticFieldsClass不是在同一个包下,所以StaticTest只能访问到staticFieldsClass中public的变量。使用了Static Import也同样如此。

    2. 导入的静态成员和本地的静态成员名字相同起了冲突,这种情况下的处理规则,是“本地优先。

    3. 不同的类(接口)可以包括名称相同的静态成员。例如在进行Static Import的时候,出现了“两个导入语句导入同名的静态成员”的情况。在这种时候,J2SE 1.5会这样来加以处理:

    4. 如果两个语句都是精确导入的形式,或者都是按需导入的形式,那么会造成编译错误。

    5. 如果一个语句采用精确导入的形式,一个采用按需导入的形式,那么采用精确导入的形式的一个有效。

    大家都这么聪明上面的几个特性我就不写例子了。

    static import这么叼那它有什么负面影响吗?

    答案是肯定的,去掉静态成员前面的类型名,固然有助于在频繁调用时显得简洁,但是同时也失去了关于“这个东西在哪里定义”的提示信息,理解或维护代码就呵呵了。
    但是如果导入的来源很著名(比如java.lang.Math),这个问题就不那么严重了。


    按需导入机制

    使用按需导入声明是否会降低Java代码的执行效率?

    绝对不会!

    一、import的按需导入

    import java.util.*;
    
    public class NeedImportTest {
        public static void main(String[] args) {
            ArrayList tList = new ArrayList();
        }
    }
    

    编译之后的class文件 :

    //import java.util.*被替换成import java.util.ArrayList
    //即按需导入编译过程会替换成单类型导入。
    import java.util.ArrayList;
    
    public class NeedImportTest {
        public static void main(String[] args) {
            new ArrayList();
        }
    }
    
    

    二、static import的按需导入

    import static com.assignment.test.StaticFieldsClass.*;
    public class StaticNeedImportTest {
        public static void main(String[] args) {
            System.out.println(staticField);
            staticFunction();
        }
    }
    

    上面StaticNeedImportTest 类编译之后 :

    //可以看出 : 
    //1、static import的精准导入以及按需导入编译之后都会变成import的单类型导入
    import com.assignment.test.StaticFieldsClass;
    
    public class StaticNeedImportTest {
        public static void main(String[] args) {
        //2、编译之后“打回原形”,使用原来的方法调用静态成员
            System.out.println(StaticFieldsClass.staticField);
            StaticFieldsClass.staticFunction();
        }
    }
    

    附加

    这是否意味着你总是可以使用按需导入声明?
    是,也不是!

    在类似Demo的非正式开发中使用按需导入声明显得很有用。

    然而,有这四个理由让你可以放弃这种声明:

    1. 编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计。
    2. 命名冲突:解决避免命名冲突问题的答案就是使用全名。而按需导入恰恰就是使用导入声明初衷的否定。
    3. 说明问题:毕竟高级语言的代码是给人看的,按需导入看不出使用到的具体类型。
    4. 无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明。如果有命名冲突就会产生问题。

    Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到:
    在java.util.Properties类中的导入声明:

    import java.io.IOException;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.Reader;
    import java.io.Writer;
    import java.io.OutputStreamWriter;
    import java.io.BufferedWriter;
    import java.security.AccessController;
    import java.security.PrivilegedAction;
    

    可以看到他们用单类型导入详细的列出了需要的java.io包中的具体类型。


    展开全文
  • 在里面导入相应的jar包就OK了

    在里面导入相应的jar包就OK了

    展开全文
  • Pycharm中无法import文件夹内的python文件的解决办法 在Pycharm的项目新建了一个文件夹并在其中放了几个.py文件,但同一个文件夹下的.py文件import其它文件会报错: 解决办法: 在左侧的项目目录,找到文件夹...

    Pycharm中无法import文件夹内的python文件的解决办法

    在Pycharm的项目中新建了一个文件夹并在其中放了几个.py文件,但同一个文件夹下的.py文件import其它文件会报错:

    在这里插入图片描述

    在这里插入图片描述

    总共有两种解决办法:


    方法一

    在左侧的项目目录中,找到文件夹,鼠标右键:

    在这里插入图片描述

    如此即可正常import了:
    在这里插入图片描述


    方法二

    在文件夹下创建_init_.py文件,在其中 from 文件夹名 import *:

    在这里插入图片描述

    如此亦可正常import。

    展开全文
  • python模块包无法导入import问题

    千次阅读 2019-06-24 19:41:02
    当没有设置新的根目录时:project structure是这样的,没有设置此时,如下图 1、test_module.py 文件中import common时出错(红色波浪线) ,而import source文件有3 这个提示,说明可以导入进来...

    第一次用Python做项目,两个package包放在同一个source文件夹下面,import却无法导入,折腾了好久,原来是python默认的根目录的问题
    当没有设置新的根目录时:project structure是这样的,没有设置在这里插入图片描述此时,如下图 1、test_module.py 文件中import common时出错(红色波浪线) ,而import source文件有3 这个提示,说明可以导入进来,就是因为根目录默认是sources
    在这里插入图片描述在setting——project——project structure里面,单击mark as后面的①sources 右键②把sources添加到源文件中,可以看到右边③的效果
    在这里插入图片描述此时可以import common了
    在这里插入图片描述

    展开全文
  • java中import默认包中的

    千次阅读 2019-07-13 16:22:59
    假如有一个,直接不加package,也就是属于默认包: /** * Created by bo on 2019/7/13. */ public class Test { public int add(int x, int y) { return x + y; } } 另外一个,处于com包(或者任何非...
  • Spring配置文件中import

    千次阅读 2017-04-24 10:04:23
    在实际的项目开发,我们往往会分为很多不同的包,如果遇见为...在Spring,可以把配置文件分散到各个模块,然后在总的配置文件中通过import元素引入这些配置文件: 1.默认情况下,使用相对路径来辅助查找配置文件
  • PyCharm中import无法识别自己写的模块

    万次阅读 多人点赞 2018-04-16 14:39:18
    1. 问题描述:同目录下,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的模块,PyCharm提示No Module.2. 解决步骤:(1). 打开File--> Setting—> 打开 Console下的Python Console,...
  • IDEA引入maven依赖,无法import相关

    千次阅读 2020-09-23 14:13:50
    如题,主要原因是由于.iml文件里,没有引入相关的依赖 解决方案:在项目根目录下,打开.iml文件,把不能引入的maven添加进去即可,举例: 错误情况: ...把.iml文件删除,maven reimport来重新生
  • 我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个文件夹,这种问题可以用下面的方法解决:   1)打开File--》Setting...
  • 楼主初学java,在学习import关键字导入自己写的类文件时遇到如下问题: 在ShortProgram文件夹ShortProgram.java文件写下如下代码: import a.b.c.Rectangle; public class ShortPrograme{ public static void main ...
  • 比喻:明明就在一个包里面的,引用的时候都出现了红色错误,无法导入。 或者其他的不可思议的错误。 可以试试“清除缓存重启”: 第一步:菜单选择file->invalidate caches / restart 第二步:在弹出框...
  • spyder中无法import tensorflow问题

    万次阅读 2018-05-12 11:46:16
    需要解决的问题:spyder里import tensorflow报错显示没有tensorflow模块解决 在anaconda的虚拟环境下(命令窗口) import tensorflow没有问题,anaconda自带spyder这个IDE,但是在我们已经安装了TensorFlow的情况下...
  • SVN客户端无法Import文件

    千次阅读 2017-05-27 10:42:34
    如下图: 当点击确定后,一直显示在导入的状态,如下图: 我的一直是这样,点击取消后,会提示“Unable to connect to a repository at URL”。...在客户端的hosts文件中,添加服务器节点I
  • 如图所示,在同一目录下明明存在相应的文件,但是导入时却出现红线,把鼠标放在红线的位置,提示No module named xxx,提示说不存在相应的模块,但是同一目录的这个模块确实是存在的。     解决办法: 将鼠标...
  • 目录 一、引入第三方插件 二、引入函数方法 2.1 单个函数引入 2.1.1 JSexport函数 2.1.2 JSexport default...vue经常需要import各种文件,比如样式、组件、方法、js文件、模块等,具体每种如何使用。 一...
  • JavaScript中import导入文件方式

    千次阅读 2020-01-03 13:26:43
    // 原本导入写法 import router from './router/index.js' //可以去掉后缀 import router from './router/index' // 最终写法 ...如果from后面只有一个文件夹的话,Node默认会去调用该文件下的in...
  • Java中import另一个工程自己写的

    千次阅读 2015-04-17 11:34:57
    Java中import另一个工程自己写的Java中import另一个工程自己写的方法:产生jar包: 默认操作都在Eclipse下 右键单击自己写的的工程,选择Export->Java->Jar file, next选择路径保存jar包 导入jar包: 选择...
  • idea maven 无法更新jar文件 reimport失效

    千次阅读 2018-06-25 17:34:29
    场景:1.Spring boot 切换版本,相应的Jar文件不自动更新2.点击reimport失效,点击刷新图标失效解决方式:Work offline :离线下载,因此每次切换版本的时候,都更新不了Jar文件...
  • 假如有一个,直接不加package,也就是属于默认包: public class ClassInDefaultPackage { public void doSomething(){ System.out.println("I am in default package."); }} 另外一个,处于com包(或者任何非...
  • Spring| 配置文件中 import 标签的作用

    千次阅读 2019-06-11 19:18:16
    多个 Spring 配置文件通过 import 方式整合的话: 1、配置文件会先合并,后解析,也就是说,无论是命名空间还是配置的内容,都会合并处理。 2、因为多个 Spring 配置文件最终会合并到一起(形成一个 ...
  • ![图片说明](https://img-ask.csdn.net/upload/201605/15/1463287189_13270.jpg)clean project 之后还是红色的![图片说明]... 重新新建了一个其他项目,bundle还是红的 !...
  • from testImport.test2 import Test1 def test_func(): print(Test1.TEST_DATA) test2.py文件内容如下 from testImport.test1 import test_func class Test1: TEST_DATA ...
  • JSP页面不能解析Import类的解决办法

    万次阅读 2013-11-14 17:50:19
    引言:jsp使用引用jar包中的Role时,老是提示不能解析,但是WEB-INF\lib下确实是有这个所在jar包的,我各种没有头绪,直到google到了下面这篇文章,赶紧分享下~~ n_n 本文出处:...
  • File -> Invalidate Cashes / Restart 点击打开链接
  • IDEA 清除类中无用的import

    千次阅读 2018-09-07 11:36:06
    手动快捷键 Ctrl + Alt + O 配置自动清理   打开settings:   然后Class自动保存时就会自动清除无用的import包。  
  • 【问题】 在使用alibaba的fastjson时, 已经在Maven配置好pom,maven导入成功,本次仓库也已经下载,...2.把pom文件中的fastjson配置删除,reimport一下。 3.然后重新把fastjson的配置在pom加上,reimport一下。 4.
  • 项目结构 在js文件中创建对外开放的方法 在index.vue引入validate.js并且使用
  • pythonimport、from import以及import as的区别

    万次阅读 多人点赞 2019-07-02 22:18:48
    首先介绍一下import和include的区别或者说import相对include的好处: import导入的内容只会被包含一次,在引入之前会检测是否已经存在该模块,不存在才会被引入,而include是不会做判断的。使用import在递归包含的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,387,973
精华内容 955,189
关键字:

无法从文件中import类