首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java内部类以及为什么要用public static void修饰main()函数,String args[]是什么?(浅显的一些探索)

} } 上面代码测试了一些常规的方法。下面简单说明几点 1:首先静态成员内部类里面是不可以定义静态的属性的,否则编译不会通过。...block Inner inner = outerandInner.new Inner(); 4:静态成员内部类可以访问到外部类的属性 然后可以通过inner调用静态成员内部类属性...5:静态成员内部类可以访问到外部私有化属性。 ---- 6:外部类也是不能直接访问静态局部成员内部类成员的,这个特点同属于对内部类访问的特点。...8:静态成员内部类可以访问到外部类的私有化成员 9:静态成员内部类可以直接访问到外部类静态成员 10:静态成员内部类不能直接访问外部类静态成员 局部内部类 局部内部类是一个在方法中定义的内部类...为什么main方法要用static修饰 就疑惑为什么mian方法非要是静态的?

23220

Java之static作用的全方位总结

但是要注意的是,虽然在静态方法中不能访问静态成员方法静态成员变量,但是在静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子: ?   ...而对于静态成员方法,它访问静态成员方法/变量显然是毫无限制的。   因此,如果说想在不创建对象的情况下调用某个方法,就可以这个方法设置为static。...但是在嵌套类里可以包含所有这些东西。也就是说,在静态部类中不可以声明静态成员,只有某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。    ...该静态导入语句使用通配符来表达“想在此类中的所有静态成员上进行静态导入”。 3、现在我们终于看到静态导入特性的好处!我们不必在System.out.println中键入System。太好了!...虽然对于静态方法来说没有this,那么在静态方法中能够通过this访问静态成员变量?先看下面的一个例子,这段代码输出的结果是什么?

1.6K21
您找到你想要的搜索结果了吗?
是的
没有找到

领导说再这么写就GC掉

这个写法大家应该没啥异议,日常的开发中有时也会写内部类,我们稍微深入的想一下:为什么 Inner 类可以直接用父类的东西呢? 因为静态部类持有外部类的引用。...:为静态部类持有外部类的引用。...延伸一下 再看看我前面说的那个结论: 静态部类持有外部类的引用。 强调了一个“静态”,如果是静态部类呢?...这个就是告诉:当我们在使用部类的时候,尽量要使用静态部类,免得莫名其妙的持有一个外部类的引用,又不用上。 其实用不上也不是什么大问题。 真正可怕的是:内存泄露。...比如网上的这个测试案例: Inner 类不是静态部类,所以它持有外部类的引用。但是,在 Inner 类里面根本就不需要使用到外部类的变量或者方法,比如这里的 data。

14810

从字节码深刻理解内部类

(如果 entry 使用部类,每个 entry 中将会包含一个指向该 Map 的引用,这样就浪费了空间和时间) 思考 内部类是如何获取到外部类的属性? 静态部类没有调用外部类属性时 ?...静态部类好处 延迟加载,当真正调用静态部类时才会去加载。 可以访问外部类的私有变量。 可以作为辅助类,但其实可以把它当成一个普通的类来看。...现在我们考虑一下图中的那个 ? 为什么要去调用一个 Object 的 getClass 方法呢?...静态部类常见用法 定义一个视图。 例如,Map 接口的实现往往使用静态部类来实现它们的集合视图。Set 和 List 这种集合接口的实现往往也使用静态部类来实现他们的迭代器。...静态部类的每个实例都隐含着与外部类的一个外部实例相关联。在静态部类的实例方法内,可以调用外部实例上的方法,或者利用修饰过的 this 构造获得外部实例的引用。

88420

Android常见问题及开发经验总结(四)

1)单例模式   2)观察者模式 这两个是用的最多的。 其它的还有 Builder模式  外观模式 模板方法 策略模式 代理模式 迭代器模式 责任链模式 命令模式 桥接模式 原型模式。...,为什么建议使用static关键字 这个是静态部类静态部类的主要区别之一。...静态部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。...当你部类定义为static时,你就调用不了外部类的实例方法了,因为这时候静态部类是不持有外部类的引用的。声明ViewHolder静态部类可以ViewHolder和外部类解引用。...如果是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 所以 ViewHolder内部类 定义为静态的,是一种好习惯。 Android进程间通信有哪几种方式?

40630

这里有线程池、局部变量、内部类静态嵌套类和一个莫得名堂的引用,哦,还有一个坑!

这个写法大家应该没啥异议,日常的开发中有时也会写内部类,我们稍微深入的想一下:为什么 Inner 类可以直接用父类的东西呢? 因为静态部类持有外部类的引用。...这就是为什么我们说:为静态部类持有外部类的引用。...延伸一下 再看看我前面说的那个结论: 静态部类持有外部类的引用。 强调了一个“静态”,如果是静态部类呢?...这个就是告诉:当我们在使用部类的时候,尽量要使用静态部类,免得莫名其妙的持有一个外部类的引用,又不用上。 其实用不上也不是什么大问题。 真正可怕的是:内存泄露。...比如网上的这个测试案例: Inner 类不是静态部类,所以它持有外部类的引用。但是,在 Inner 类里面根本就不需要使用到外部类的变量或者方法,比如这里的 data。

48910

夯实Java基础系列18:深入理解Java内部类及其实现原理

2 由于Java规定静态部类不能用使用外在类的静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态部类的时候,不需要外部类对象的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态部类有一个很大的优点:可以自由使用部类的所有变量和方法...3 对于静态部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...也就是说,内部类可以被重载

1.2K10

夯实Java基础系列18:深入理解Java内部类及其实现原理

2 由于Java规定静态部类不能用使用外在类的静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态部类的时候,不需要外部类对象的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态部类有一个很大的优点:可以自由使用部类的所有变量和方法...3 对于静态部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...也就是说,内部类可以被重载

41010

Java基础8:深入理解内部类

2 由于Java规定静态部类不能用使用外在类的静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态部类的时候,不需要外部类对象的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态部类有一个很大的优点:可以自由使用部类的所有变量和方法...3 对于静态部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...也就是说,内部类可以被重载

1.5K00

Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战

静态部类静态实例 (“类”是这个类的类型,实例是new 出来的实例) 静态部类会维持一个到外部类实例的引用, 如果静态部类的实例是静态的, 就会间接长期维持着外部类的引用,阻止被回收掉...解决办法: 使用静态部类静态部类实例,不会维持一个到外部类实例的引用!...2.多线程相关的匿名内部类静态部类 匿名内部类同样会持有外部类的引用, 如果在线程中执行耗时操作 就有可能发生内存泄漏,导致外部类无法被回收,直到耗时任务结束, 解决办法: 在页面退出时结束线程中的任务...Handler临时性内存泄露 Handler导致的内存泄漏也可以被归纳为静态部类实例(这里特指Handler实例)导致的; Handler通过发送Message与主线程交互, Message...图片回收:使用完bitmap,及时使用Bitmap.recycle()回收。 问题:Android不是自身具备垃圾回收机制?此处为何要手动回收。

1.3K10

Handler机制与原理

静态部类是会隐式持有外部类的引用,所以当其他线程持有了该Handler,线程没有被销毁,则意味着Activity会一直被Handler持有引用而无法导致回收 * MessageQueue中如果存在未处理完的...Message,Message的target也是对Activity等的持有引用,也会造成内存泄漏 解决的办法 * 使用静态部类 + 弱引用的方式 * 静态部类不会持有外部类的的引用,...当需要引用外部类相关操作时,可以通过弱引用还获取到外部类相关操作,弱引用是不会造成对象该回收回收不掉的问题,不清楚的可以查阅JAVA的几种引用方式的详细说明 * 在外部类对象被销毁时,MessageQueue...new一个Message,而是通过Message的静态方法obtain()来得到的呢?...可以有多个Handler 可以在子线程直接创建一个Handler?会出现什么问题,那该怎么做? 不能在子线程直接new一个Handler。

40410

竟让Spring Boot搞出那么多静态部类

我们知道static关键字它不仅可使用方法上,那么本文继续挖掘static在Spring环境下的用处。...,本文聚焦在静态部类上。...---- 认识静态/普通内部类 由于一些小伙伴对普通内部类 vs 静态部类傻傻分不清,为了方便后续讲解,本处把关键要素做简要对比说明: 静态部类可以声明静态or实例成员(属性和方法);而普通内部类则不可以声明静态成员...or静态) --> 理解这是普通内部类能 “存活” 下来的最大理由了吧?...总之,普通内部类和外部类的关系属于强绑定,而静态部类几乎不会受到外部类的限制,可以游离单独使用。既然如此,那为何还需要static静态部类呢,直接单独写个Class类岂不就好了吗?

59630

详解 Java 内部类

但是于此同时,静态部类中也无法访问外部类静态成员,因为外部类静态成员是属于每一个外部类对象的,而本身静态部类就是独立外部类对象存在的,所以静态部类不能访问外部类静态成员,而外部类依然可以访问静态部类对象的所有访问权限的成员...由此,我们现在大概能猜到内部类对象是怎么取到外部类的 private 权限的字段了:就是通过这个外部类提供的静态方法。...最后,我们在 25 行字节码指令发现:内部类的构造方法通过 invokestatic 指令执行外部类的 access$100 静态方法(在 InnerClassTest 的字节码中已经介绍了)得到外部类对象的...但是可能存在这种情况:静态部类对象在某个时刻已经不在被使用,或者说这个内部类对象可以在不影响程序正确运行的情况下被回收,而因为我们对这个内部类使用不当而使得其无法被 JVM 回收,同时会导致其外部类对象无法被回收...当然这并不是建议你不使用 static 关键字,只是在使用这个关键字之前可以考虑一下这个对象使用 static 关键字修饰对程序的执行确实更有利

60330

【Java基本功】一文读懂Java内部类的用法和原理

2 由于Java规定静态部类不能用使用外在类的静态属性和方法,所以只是为了方便管理类结构而定义。于是我们在创建静态部类的时候,不需要外部类对象的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态部类有一个很大的优点:可以自由使用部类的所有变量和方法...3 对于静态部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...直到这里还没有解释为什么是final 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...也就是说,内部类可以被重载

1K30

Java面向对象高频面试题

抽象类和接口的区别 接口和抽象类都不能实例化 抽象类相比于普通类多的限制是可以添加抽象方法 接口中只能声明常量和抽象方法且访问修饰符必须都为public,在JDK8之后可以定义default方法和static...静态部类和内部类的区别   静态部类是被声明为static的内部类,它可以不依赖外部类的实例被实例化,而通常我们的内部类是需要通过外部类的实例才能实例化。...静态变量是对象间共享的 实例变量:数据具体的某个对象,必须要先创建对象,然后通过该对象来访问实例变量, 18.静态方法中是否可以访问普通方法   肯定不可以静态方法是在类加载阶段就创建的,而普通方法是属性对象的...void speak(){ // 普通方法可以调用静态方法 show(); } } 19.如何实现克隆 原型模式 说明 浅克隆 只是拷贝本对象,其对象内部的数组...,然后调用父类构造器,再初始化静态成员,最后调用自身构造器。

30430

详解 Java 内部类

但是于此同时,静态部类中也无法访问外部类静态成员,因为外部类静态成员是属于每一个外部类对象的,而本身静态部类就是独立外部类对象存在的,所以静态部类不能访问外部类静态成员,而外部类依然可以访问静态部类对象的所有访问权限的成员...由此,我们现在大概能猜到内部类对象是怎么取到外部类的 private 权限的字段了:就是通过这个外部类提供的静态方法。...最后,我们在 25 行字节码指令发现:内部类的构造方法通过 invokestatic 指令执行外部类的 access$100 静态方法(在 InnerClassTest 的字节码中已经介绍了)得到外部类对象的...但是可能存在这种情况:静态部类对象在某个时刻已经不在被使用,或者说这个内部类对象可以在不影响程序正确运行的情况下被回收,而因为我们对这个内部类使用不当而使得其无法被 JVM 回收,同时会导致其外部类对象无法被回收...当然这并不是建议你不使用 static 关键字,只是在使用这个关键字之前可以考虑一下这个对象使用 static 关键字修饰对程序的执行确实更有利

51030

竟让Spring Boot搞出那么多静态部类

我们知道static关键字它不仅可使用方法上,那么本文继续挖掘static在Spring环境下的用处。...,本文聚焦在静态部类上。...--- 认识静态/普通内部类 由于一些小伙伴对普通内部类 vs 静态部类傻傻分不清,为了方便后续讲解,本处把关键要素做简要对比说明: 静态部类可以声明静态or实例成员(属性和方法);而普通内部类则不可以声明静态成员...or静态) --> 理解这是普通内部类能 “存活” 下来的最大理由了吧 总之,普通内部类和外部类的关系属于强绑定,而静态部类几乎不会受到外部类的限制,可以游离单独使用。...是独立类(top-level类 or 静态部类属于独立类) 并且 isConcrete()是具体的(接口抽象类) isAbstract()是抽象类 并且 类内存在标注有@Lookup注解的方法 基于以上例子

1.1K80

Kotlin学习笔记(四)-面向对象

前言 本章讲解一些管对对象和基础编程的知识。如:类,接口,抽象类,数据类,扩展方法等 接口 其实这部分的设计思路和Java基本一致。...扩展方法 为现有类添加方法、属性: fun X.y):Z{..} val X.m 注意扩展属性不能初始化,类似接口属性 Java 调用扩展成员类似调用静态方法 例子: //自己定义一个扩展方法 方法的名字是...(静态部类持有外部类的引用,而静态部类无法持有外部类的引用,这是因为静态部类优先于实例对象而存在) 内部类静态部类的区别: 是否持有外部类的状态(也就是非静态部类可以调用 外部类.this...变成静态 这样就可以访问到外部类的属性的 val a = 6 fun main(args: Array) { // println...(a)//访问不到 说明kotlin中默认是使用静态static内部类的 println(this@Outter.a)//当内外部类重载相同的属性或方法时 通过this@Outter

83110

Java面向对象进阶

等价于 [A-Za-z0-9_] 内部类 成员内部类 成员内部类和成员方法、成员变量一样,是对象所有的,而不是类所有的 成员内部类可以使用访问权限控制 public class Test {...:"+name); //成员内部类可以访问到外部的成员变量 //因为成员内部类本身就是某个对象所有的,每个对象都有这样的一个类定义,这里的name是其所依附对象的...} } } 静态部类 静态部类就像静态方法静态变量一样,是属于类的 不需要依附任何对象,我们可以直接创建静态部类的对象 静态部类由于是静态的,所以相对外部来说,整个内部类中都处于静态上下文...(注意只是相当于外部来说)是无法访问到外部类静态内容的 public class Test { private final String name; public Test(String...可以在表达式的后面添加错误信息: public static void main(String[] args) { int a = 10; assert a > 10 : "是自定义的错误信息

17330

Java笔记

,会发现产生了两个 .class 文件: Outer.class,Outer$Inner.class{} 5.成员内部类中不能存在任何 static 的变量和方法,可以定义常量: (1).因为静态部类是要依赖于外部类的实例...,而静态变量和方法是不依赖于对象的,仅与类相关, 简而言之:在加载静态域时,根本没有外部类,所在在静态部类中不能定义静态域或方法,编译不通过; 静态部类的作用域是实例级别 (2).常量是在编译器就确定的...内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字,如:Outer.this.name (二).静态部类: 是 static 修饰的内部类 1.静态部类不能直接访问外部类静态成员...在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的, 也就是说在内部类对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的...2.静态方法可以使用静态变量 3.抽象方法可以有函数体

22630
领券