-
2017-07-16 17:49:04
很多人在问 static 和extern的区别 或者他们的用途,通过看这篇博客以及我写的
全局变量的类型的那篇博客相信大家都会深深的理解他俩的用途和区别。
1.内部函数
如果一个函数只能被本文件中的其他函数所调用,称它为内部函数。内部函数又称为静态函数。在定义内部函数时,在函数名和函数类型前加 static .如下:
static 类型标识符 函数名 ()
{
函数体。
}
使用内部函数,可以使函数的作用域只局限于所在文件,在不同的文件中又同名的内部函数,互不干扰。通常把只能由同一文件使用的函数和外部变量放在一个文件夹中,在它们前面加上static使其局部化,其他文件不能调用。2.外部函数
除内部函数外,其余的函数都可以被其他文件中的函数所调用,同时在调用的函数的文件上应加上 extern 关键字说明。定义如下:
extern 类型标识符 函数名 ()
{
函数体。
}
c语言规定,如果在定义函数时省略 extern ,则默认为外部函数。更多相关内容 -
java内部类 和外部类的区别
2021-03-07 00:47:13下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的...下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。
(1)创建实例
OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类
AAA.StaticInner in = new AAA.StaticInner();//注意是外部类本身,静态内部类
(2)内部类中的this
内 部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理 解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。
(3)外部类访问内部类
内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:
System.out.println("Print in inner Outer.index=" + pouter.this.index);
System.out.println("Print in inner Inner.index=" + this.index);
(4)内部类向上转型
内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。
(5)方法内的类
方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。
(6)静态内部类
定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。
通常称为嵌套类,当内部类是static时,意味着:
[1]要创建嵌套类的对象,并不需要其外围类的对象;
[2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);
嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。
另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。
(7)内部类标识符
每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。
(8)为何要用内部类?
1. 内部类一般只为其外部类使用;
2. 内部类提供了某种进入外部类的窗户;
3. 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。
加深印象,参考一下:
packagecom.test.xml;
publicclassOutClassTest{
staticinta;
intb;
publicstaticvoidtest(){
System.out.println("outer class static function");
}
publicstaticvoidmain(String[]args){
OutClassTestoc =newOutClassTest();
// new一个外部类
OutClassTestoc1 =newOutClassTest();
// 通过外部类的对象new一个非静态的内部类
OutClassTest.InnerClassno_static_inner =oc1.newInnerClass();
// 调用非静态内部类的方法
System.out.println(no_static_inner.getKey());
// 调用静态内部类的静态变量
System.out.println(OutClassTest.InnerStaticClass.static_value);
// 不依赖于外部类实例,直接实例化内部静态类
OutClassTest.InnerStaticClassinner =newOutClassTest.InnerStaticClass();
// 调用静态内部类的非静态方法
System.out.println(inner.getValue());
// 调用内部静态类的静态方法
System.out.println(OutClassTest.InnerStaticClass.getMessage());
}
privateclassInnerClass{
// 只有在静态内部类中才能够声明或定义静态成员
// private static String tt = "0";
privateintflag =0;
publicInnerClass(){
// 三.非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量
System.out.println("InnerClass create a:"+a);
System.out.println("InnerClass create b:"+b);
System.out.println("InnerClass create flag:"+flag);
//
System.out.println("InnerClass call outer static function");
-
Python不是内部或外部命令的(完美解决)
2021-01-16 20:03:14最近鼓捣鼓捣Python,写个小程序爬爬网站,发现有人在写用爬虫搞CSDN的自动签到(然并卵(luan)),然后发现在执行安装selenium的命令的时候提示“Python不是内部或外部命令” 其实,之前写过一篇类似的文章也是...前言
最近鼓捣鼓捣Python,写个小程序爬爬网站,发现有人在写用爬虫搞CSDN的自动签到(然并卵(luan)),然后发现在执行安装selenium的命令的时候提示“Python不是内部或外部命令”
其实,之前写过一篇类似的文章也是什么什么不是内部或外部命令,换汤不换药,原理就是将软件的exe文件的路径加载到path环境变量下(也可以做其他事情哦!点击查看更多骚操作点击查看)问题
Python不是内部或外部命令
解决方案
右击我的电脑—>选择属性—>左侧边栏选择高级系统设置—>环境变量—>选择Path点击编辑—>添加python.exe的所在上级路径+Scripts文件夹的路径(win10系统不需要添加分号,其他需要的注意是英文分号)
注意
Python的安装路径:C:\Users\Adam\AppData\Local\Programs\Python\Python36
Scripts文件夹的路径:C:\Users\Adam\AppData\Local\Programs\Python\Python36\Scripts
以上为我的本地路径,请对应修改
另重新启动一个dos窗口,否则不生效
(win8环境变量之间要用英文分号隔开,否则也不生效) -
细说Android的内部存储和外部存储
2019-02-19 21:32:06无论哪种存储,都会涉及到手机的存储空间,而其中比较绕人的就是Android手机的内部存储和外部存储了,这两天花了点时间总结了一番,这里写成博客权当记录。 内部存储 概念:注意内部存储不是内存,它是手机中的一...数据存储,是我们在Android开发中经常遇到的场景,数据的存储方式也有多种方式,例如文件存储、数据库存储、网路存储等等。无论哪种存储,都会涉及到手机的存储空间,而其中比较绕人的就是Android手机的内部存储和外部存储了,这两天花了点时间总结了一番,这里写成博客权当记录。
内部存储
概念:注意内部存储不是内存,它是手机中的一块存储区域,是系统本身和系统应用程序主要的数据存储所在地。手机的内部存储通常不会很大,一旦手机的内部存储容量被用完,可能会出现手机无法使用的情形。对于开发者来说,不宜存储视频等大文件,适和存储一些小文件。比如我们常常用的SharedPreferences和SQLite数据库都是存储在内部存储中的,不会占用太大的空间。其主要的api如下:
//获取手机内部存储空间的绝对路径。 Environment.getDataDirectory().getAbsolutePath(); //获取当前应用包名文件夹下的files文件夹 getFilesDir().getAbsolutePath(); //获取当前应用包名文件夹下cache文件夹 getCacheDir().getAbsolutePath(); //在内部存储空间内创建(或打开现有的)目录。 getDir(String name, MODE_PRIVATE);
这么看太苍白,截一张我手机的图解释下:
通常我们手机安装了一个app,都会在data/data目录下新增一个我们应用包名的文件夹,而数据库,SharedPreferences文件都是存放在这个文件夹中,getFilesDir是用来获取这个文件夹下的files文件夹路径(如果存在的话),getCacheDir则是获取cache文件夹路径的。至于Environment.getDataDirectory()获取到的路径是这样的:
就是最外层的/data目录,也就是我们所说的内部存储所在的根目录。内部存储没什么好说的,对于一个app来说,无非就是data/data目录下应用包名所在的文件夹。这里不禁想起来一个问题,似乎我们买手机,手机参数从来都没告诉我们内部存储有多大,我们常说的64g,128g可能只是外部存储或者是内部存储和外部存储的总和,无论你怎么搜索,都不会有关于一部手机内部存储的信息的,那我们如何获取一部手机的内部存储大小呢?作为Android程序员,当然是有固定的api给我们用啦,看代码:
public static long getTotalInternalMemorySize() { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); //获取内部存储中每个区块的存储大小。 long blockSize = stat.getBlockSize(); //获取内部存储中所有的区块数量。 long totalBlocks = stat.getBlockCount(); //返回内部存储空间的总大小。 return totalBlocks * blockSize; }
我的手机是小米6 64g版本,看下我的手机内部存储空间有多大:
当然这个是字节数。55425040384/1000/1000/1000得到的GB大小,值为52.8个GB。有人会问了,出去系统占用的内存,这不是和手机宣传的64g差不多么?不应该是SD卡,属于外部存储么?当然,现在的手机大部分都不再支持外接SD卡了,内部存储和外部存储都是在一起的,但是概念上做了区分,内部存储和外部存储是一块存储介质上的不同区域。而以前外接SD卡则是在硬件上做了区分(Android 4.4以前),手机自带的存储卡就是内部存储,外接的SD卡就是外部存储。其实本质上没有区别,只是现在的手机都一体化了,再暴力拆解不符合现在的美学原理,也可以说是时代进化的产物吧~
外部存储
说完了内部存储,咱们再来聊一聊外部存储。外部存储,首先可以明确一点的是,如果现在的手机还能外接SD卡,那么外接的SD卡一定是外部存储。但是一部手机可能自己本身就区分了内部存储和外部存储,这个时候又外接一个SD卡,不是有两个外部存储了么?是的,理论上是可以有两个外部存储。存储方式都一样,关键是如何去区分这两个外部存储,看代码:
File[] files; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { files = getExternalFilesDirs(Environment.MEDIA_MOUNTED); for(File file:files){ Log.e("main",file); } }
getExternalFilesDirs可以获取多个外部存储空间,返回一个数组。这样就可以得到手机自身所带的外部存储和外接SD卡所定义的外部存储了。我这里没有可以插SD卡的手机,大家如果有可以插SD卡的手机,可以自行试一试。外部存储常用的api:
//获取手机外部存储的路径:/storage/emulated/0 Environment.getExternalStorageDirectory().getAbsolutePath(); //获取某种特定内容,如视频、照片、警报、铃声、音乐所在的路径,传入的参数是内容类型。 /storage/emulated/0/DCIM Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM ).getAbsolutePath(); //获取某个应用在外部存储中的files路径 /storage/emulated/0/Android/data/demo.suning.com.demo/files getExternalFilesDir("").getAbsolutePath(); //获取某个应用在外部存储中的cache路径 /storage/emulated/0/Android/data/demo.suning.com.demo/cache getExternalCacheDir().getAbsolutePath();
获取特定内容的类型有以下几种:
DIRECTORY_ALARMS //警报的铃声 DIRECTORY_DCIM //相机拍摄的图片和视频保存的位置 DIRECTORY_DOWNLOADS //下载文件保存的位置 DIRECTORY_MOVIES //电影保存的位置, 比如 通过google play下载的电影 DIRECTORY_MUSIC //音乐保存的位置 DIRECTORY_NOTIFICATIONS //通知音保存的位置 DIRECTORY_PICTURES //下载的图片保存的位置 DIRECTORY_PODCASTS //用于保存podcast(博客)的音频文件 DIRECTORY_RINGTONES //保存铃声的位置
当然还有其他的一些api,这里就不一一列举了,google爸爸起名字还是比较见名思义的,看api名称大体可以猜到是干嘛用的。
问:getExternalFilesDir和刚刚内部存储中的getFilesDir有什么区别呢和共同点呢?
区别:一个时在外部存储中,一个是在内部存储中。
相同点:路径中都带有当前app的包名,表明是当前app的专属文件。当app卸载或手动清除某个应用数据,它们也会被清除掉,其实它们的作用都是为了管理app的数据,让每一个app都有一个自己专属的文件夹,这样方便于系统管理,避免因为文件随意存储导致的存储空间混乱;另外就是为了当卸载应用时会把这些文件删除,不至于应用不在了,却还留下一堆垃圾文件。问:既然内部存储和外部存储都会有当前app的专属文件夹,那我们应该优先用哪个呢?
答:理论上是优先使用外部存储,防止手机因为内部存储耗尽导致手机无法使用。当然一些无关紧要的小文件也可以存储在内部存储中,诸如数据库,SharedPreferences,大文件优先于外部存储。当然使用之前可能需要做一下判断,是否有外部存储,如果没有,则使用内部存储,有的话才使用外部存储:
public static String getFilePath(Context context, String dir) { String directoryPath = ""; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {//判断外部存储是否可用 directoryPath = context.getExternalFilesDir(dir).getAbsolutePath(); } else {//没外部存储就使用内部存储 directoryPath = context.getFilesDir() + File.separator + dir; } File file = new File(directoryPath); if (!file.exists()) {//判断文件目录是否存在 file.mkdirs(); } return directoryPath; }
关于内部存储和外部存储的关系,我想引用另一篇博客的一张图:
参考:https://blog.csdn.net/u010937230/article/details/73303034,这里盗的图,如果作者看到了还希望作者多多包涵~
至于Android每个版本SD卡的路径都不一样的问题,这里就不去分析了,管他google怎么玩,反正我们有api,只要api不变,我们就可以玩得转。所谓它自皮来它自恶,我自一口真气足。不过有时间和有兴趣的小伙伴可以研究研究哈,毕竟钻研是一种学习精神,是一种学习态度。而我很懒不想钻研~
-
网络(3)-内部网关协议和外部网关协议
2019-11-20 21:45:24一、内外之别 Internet网被分成多个域或多个自治系统(AS)。...外部网关协议(EGP)为两个相邻的位于各自域边界上的路由器提供一种交换消息和信息的方法。 内部网关协议IGP,是在AS(自治系统)内部使用的协议,... -
对人的外部评价与内部评价
2014-06-03 11:29:30这是个很有趣的思考,举个例子:公司的销售能不能继续在公司里面做,得到奖金多少,是要看他做的有多好,能不能得到用户的认可,能不能尽可能多的签单,用外部对其的评价(销售业绩)来评判,从而销售的最优策略是... -
内部效度、外部效度的定义以及关系
2021-01-18 17:01:00内部效度与所得结果的唯一性有关,外部效度与结果的可推广性有关。 一、内部效度 定义:内部效度表示实验所提供的自变量与因变量之间因果关系明确程度的一种指标。 解释:如果研究结果有且只有一种解释,那么该... -
内部表和外部表区别
2020-08-25 13:25:07一、外部表的创建、load、删除 1.文件在本地而不是在hdfs的时候 1.1 建表时指定location (1)建表并load数据 create external table exTable28 (id int,str string) row format delimited fields terminated ... -
Hive 内部表 外部表 及 适用场景
2019-06-21 18:31:05内部表:看名字,限于内部使用。 删除内部表时,表的元数据和数据都会被删除。 外部表:看名字,可以外部共享。 删除外部表时,表的元数据会被删除,但是...而内部表仅限于少数人使用,比如存储自己的中间结果。 ... -
vue不是内部或外部命令
2020-07-20 15:55:26无论怎么查找网上的教程,还是解决不了“vue不是内部或外部的命令”诸如此类的问题。 好在功夫不负有心人,终于在多次的试验下,成功解决了这个问题。 第一种情况: vue不是内部或外部命令 :首先确定是否安装了node... -
产品的内部质量与外部质量
2013-10-28 11:46:25产品的质量可以划分为外部质量与内部质量。外部质量是用户可见、用户可以体验到的质量,比如你新买了一辆车,你可以感受到车的外观、车提速的快慢等,这是车的外部质量;再如我们买了新房子,我们可以看到房子的... -
内存碎片---内部碎片&外部碎片
2018-05-05 20:44:01内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小...外部碎片的产生:频繁的分配与回收物理页面会导... -
如何区分企业微信的内部群和外部群
2020-09-27 16:28:29企微内部群主要分成3种:全员群、部门群、内部群 1,全员群:上限10000人,群名会有【全员】标记 企业全员群,新入职的员工将自动加入此群,离职后将自动退群。加入的同事可以看到历史的群聊消息。全员群人数上限是... -
‘adb‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
2021-01-05 21:22:07在窗口中输入adb shell,提示'adb' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 这是因为没有找到adb.exe。这个是在……\sdk\platform-tools目录下的。(每个人的目录都不一样) 我们进入这个目录就... -
C语言外部函数与内部函数
2017-12-18 17:09:11C语言中,根据函数能否被其他源文件调用,分为内部函数和外部函数 外部函数,可以被其他源文件调用的函数 内部函数,只在定义的文件中有效外部函数开发大型项目,可能包含很多源文件来分别实现,最终,再整合在... -
内部总线、系统总线、外部总线区别
2020-10-08 17:00:28外部总线是微机和外部其他设备之间的总线,微机作为一种设备,通过该总线和其他设备进行信息与数据交换,用于设备一级的互连。 个人理解: 内部总线就是开发人员经常用到的各种协议,比如SPI总线协议、SCI总线协议... -
外部时钟与内部时钟区别 作用 使用条件
2018-11-15 11:49:08外部时钟与内部时钟区别 作用 使用条件 -
内存泄漏-内部类持有外部类引用
2019-11-25 00:28:451.内部类持有外部类引用 我们在处理Android内存泄漏的时候,经常会遇到一些是由于内部类持有外部类引用而引发的。严格来说是非static的内部类的非static对象或匿名内部类的非static对象持有了当前所在外部类的引用... -
“adb”不是内部或外部命令——解决方案
2019-11-05 16:49:59在AS(Android Studio简称AS)app真机测试中adb可以轻松找到安卓设备,ADB全称Android Debug Bridge,用于Android设备进行交互,也可以这样理解ADB是Android Studio连接安卓设备之间的一个桥梁或者是一个中间人帮助... -
匿名内部类持有外部类的引用会导致内存泄漏?Kotlin:没有那么简单
2021-11-02 19:58:47做Android的,或者做Java开发的同学,通常都会听到一句话,内部类持有外部类的引用,可能会导致父类内存泄漏? 知道大家很忙,那就先把结论抛出来 Java中内部类会持有外部类的引用,可能引发内存泄漏 Kotlin存在... -
C语言是外部函数与内部函数
2019-07-19 09:55:50人本身还有一些可以调配的方法,比如当你家人跟你说,家里没有盐了,你去买袋盐,去买盐就是他人调用你的方法,那么能被外人调用的方法称谓外部方法。 在C语言中不能被其他源文件调用的函数称谓内部函数,内部函数... -
flutter where不是内部或外部命令
2020-06-04 13:29:44flutter’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 冷冷清清里风风火火是我 2019-07-11 00:11:17 3100 收藏 1 展开 相信在开发配置环境变量过程中都遇到过以下问题: ‘XXX’ 不是内部或外部命令,... -
Python安装第三方库提示“既不是内部或外部命令也不是可运行的程序或批处理文件”解决办法
2020-12-22 07:00:45前言“电脑玩得好,工具人当到老”。作为一个比小白稍微高级一点的大白,每天都会收到各种计算机问题,从装系统到剪视频再到装环境,甚至帮别人敲代码......今天一个同学问我Python安装jieba库失败的问题,由于同学... -
彻底理解android中的内部存储与外部存储
2015-12-12 10:05:34我们先来考虑这样一个问题:打开手机设置,选择应用管理,...在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事?内 -
【小家java】java8新特性之---外部迭代和内部迭代(对比性能差异)
2018-08-08 19:47:37这一类方法叫做外部迭代,意为显式地进行迭代操作,即集合中的元素访问是由一个处于集合外部的东西来控制的,在这里控制着循环的东西就是迭代器。 我们自己定义一个List,叫ContactList:电话本List public class ... -
hive中内部表和外部表有什么区别?一般什么时候使用内部表什么时候使用外部表?
2020-12-09 13:52:53hive中内部表和外部表有什么区别? 在使用hive搭建数据仓库的时候,可以建立两种表格。一种是内部表(managed table),一种是外部表(external table)。 内部表建表是不加修饰词即可: create table database_... -
关于内部样式和外部样式的优先级问题
2020-03-13 18:08:11很多人都会认为内部样式优先级比外部样式高,其实是不对的,内部样式和外部样式是具有相同的优先级的,就看谁出现的位置靠后,谁优先,即最后渲染有效。 如下面的代码,文字肯定要显示成黄色,而不是绿色。因为1.... -
'java'不是内部或外部命令解决方法
2017-06-16 10:33:41我的问题症状是,cmd中输入java、java -version都能正常显示,但是输入javac时就会提示:'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。 我的环境配置是这样的: 细心的你能发现什么问题... -
‘java‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
2022-03-31 07:51:431.‘java’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 出现这种情况一般来说是没有配置环境变量或者是没有配置好 (1)找到安装java的位置 (每个人的不一样 自己看看) (2)进入控制面板==》系统与...