静态内部类有许多作用,由于非静态内部类的实例创建需要有外部类对象的引用,所以非静态内部类对象的创建必须依托于外部类的实例;而静态内部类的实例创建只需依托外部类; 并且由于非静态内部类对象持有了外部类对象的引用...虚拟机栈 : Java 虚拟机栈是线程私有的数据区,Java 虚拟机栈的生命周期与线程相同,虚拟机栈也是局部变量的存储位置。...方法区 :方法区是各个线程共享的内存区域,它用于存储虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码等数据,也就是说,static 修饰的变量存储在方法区中 堆 : 堆是线程共享的数据区...# 2.5 类加载顺序 我们前面提到了类加载顺序这么一个概念,static 修饰的变量和静态代码块在使用前已经被初始化好了,类的初始化顺序依次是 加载父类的静态字段 -> 父类的静态代码块 -> 子类静态字段...如果不进行第二次判断的话,那么 t1 在进行第一次判空后,也会进行实例化过程,此时仍然会创建多个对象。 # 3.
(非static) 3.如果其他类对内部类有访问权限的话(如public),那么可以通过 外围类对象.new内部类(),这样的方式创建内部对象,注意如果没有外围类的对象,内部类是不允许创建的。...5.内部类不能被覆盖 6.内部类让java模拟了多继承,让外围类继承一个类,然后内部类继承一个类,又要有内部类对象必须有对应的外围类对象。 7.static的内部类,和普通的类基本相同。...=和==,当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同,比较内存地址 13.null可以被强制类型转换成任意类型的对象,于是通过它来执行静态方法 14.如何终止一个线程...3.如果线程处于io之中,那么可以通过关闭io来使线程结束。...18.解释一下java内存模型 1.每个线程有自己的共享变量副本(实例域、静态域、数组元素) 2.Java线程之间的通讯由java内存模型控制(JMM),JMM决定了一个线程对共享变量的写入在什么时候对另一个线程可见
(HashMap,HashSet等比较是否为同一个) 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。...内部类的作用 内部类可直接访问外部类的属性 Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static...进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。 一个进程内可拥有多个线程,进程可开启进程,也可开启线程。...首先equals与hashcode间的关系是这样的: 1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同; 2、如果两个对象的hashCode相同,它们并不一定相同...死锁避免是在系统运行过程中注意避免死锁的最终发生。 什么是线程池,如何使用? 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。
如果你知道一个对象是不可变动,那么需要拷贝的对象的内容时就不用复制它本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存,效率也很好。...动态链接库:某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。...既然有了字节流,为什么还要有字符流? 字符流是由 Java 虚拟机将字节转换得到的,这个过程非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。...他和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域内。 静态内部类: 静态内部类和成员内部类相比多了一个static修饰符。只能访问外部类的静态成员变量与静态方法。...内部类的好处 完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。 方便写事件驱动程序。 32.
一个类仅仅只有一个实例,并且提供全局的接入点。简洁点理解就是涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。...双检查加锁,旨在每次调用getInstance方法都需要同步,但是先不会同步,在第一次判断实例是否存在后,如果不存在才进入同步块,进入同步块后,第二次检查实例是否存在,如果不存在,在同步块内创建实例。...这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。其中使用到类的静态内部类和多线程缺省同步锁。...静态内部类 静态内部类指,有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。...如果对业务需求有特殊要求的时候阔以采用双检查锁的单例。
简单来说,就是在一个类的构造器创建了一个内部类(内部类本身是拥有对外部类的所有成员的访问权的),此时外部类的成员变量还没初始化完成。...但是,同时这个内部类被其他线程获取到,并且调用了内部类可以访问到外部类还没来得及初始化的成员变量的方法。...} } } 只要线程得到持有内部类引用的数组,就可以使用内部类获取外部类的有可能未初始化的成员变量。...(2)在构造器中内部类使用外部类情况:内部类访问外部类是没有任何条件的,也不要任何代价,也就造成了当外部类还未初始化完成的时候,内部类就尝试获取为初始化完成的变量。 那么,如何避免this逃逸呢?...也就是说,如果要在构造函数中创建内部类,那么就不能在构造函数中把他发布了,应该在构造函数外发布,即等构造函数执行完初始化工作,再发布内部类。
如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性 如果其他的类要访问静态内部类的属性或者调用静态内部类的方法...==与equlas有什么区别? \==可以判断基本数据类型值是否相等,也可以判断两个对象指向的内存地址是否相同,也就是说判断两个对象是否是同一个对象,Equlas通常用来做字符串比较。...可以重载,必须重写 52.如果父类只有有参构造方法,那么子类必须要重写父类的构造方法吗? 必须重写 53.创建一个子类对象的时候,那么父类的构造方法会执行吗? 会执行。...69.如何自定义一个异常 继承一个异常类,通常是RumtimeException或者Exception 70.在异常捕捉时,如果发生异常,那么try.catch.finally块外的return语句会执行吗...资源分配给进程,同一进程的所有线程共享该进程的所有资源。 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。 线程是指进程内的一个执行单元,也是进程内的可调度实体。
实现多重继承的“假象” Java 不支持多继承(不能 extends 多个类),但一个内部类可以继承一个类,外部类继承另一个类,变相实现“多继承”。 三、5种内部类,一文打尽! 1....不是 new Outer.Inner() inner.display(); 面试怎么说: “成员内部类常用于事件监听、GUI 编程,比如一个窗口类里定义一个按钮点击处理器,逻辑内聚,封装性好。”...五、面试高频问题 & 高分回答 Q1: 说说 Java 的内部类有哪些?用在什么场景?...答: Java 有 4 种内部类: 成员内部类:用于逻辑强关联的类,比如 Map.Entry; 静态内部类:工具类、配置类,不依赖外部实例; 局部内部类:方法内临时使用,避免命名污染; 匿名内部类...如果你在 Activity 或 Fragment 里定义了非静态内部类,并被长时间持有(如线程、单例),就会导致外部类无法被回收,引发内存泄漏。
使用类表示某些具有相同属性和行为的事物。 1....如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。 抽象类可以包含抽象方法和非抽象方法。 ...; 抽象类可以被继承; 可以通过两种方式获得抽象类对象:父类引用指向子类对象、匿名内部类; 子类必须重写抽象父类的所有抽象方法,或者是把子类也定义为抽象类; 如果一个类继承的抽象父类还有上级抽象父类...任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。 如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。...,子类重写父类方法,父类引用调用子类重写后的方法,执行的结果是子类重写后的方法 o.print(); } } 运行结果: PPT打印 接口是完全抽象的抽象类,并且可以多实现
使用类表示某些具有相同属性和行为的事物。...如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。 抽象类可以包含抽象方法和非抽象方法。...父类引用指向子类对象、匿名内部类; 子类必须重写抽象父类的所有抽象方法,或者是把子类也定义为抽象类; 如果一个类继承的抽象父类还有上级抽象父类,那么子类中需要要重写所有抽象父类的所有抽象方法; 抽象类也可以继承非抽象类...任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。 如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。...而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 一个 volatile 对象引用可能是 null。
在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等比较是否为同一个) 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。...内部类的作用 内部类可直接访问外部类的属性 Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static...是否可以被重写?以及原因? 可继承 不可重写 而是被隐藏 如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。...首先equals与hashcode间的关系是这样的: 1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同; 2、如果两个对象的hashCode相同,它们并不一定相同...试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。
Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中...一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。 构造代码块和构造函数有什么区别?...(这句话是针对同一个类环境下的,比如说,一个类有多个成员(属性,方法,字段),静态方法A,那么可以访问同类名下其他静态成员,你如果访问非静态成员就不行) 因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员...注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super(); 如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数...当元素的hashCode值相同时,才继续判断元素的equals是否为true。 如果为true,那么视为相同元素,不存。如果为false,那么存储。
对象锁和类锁是否会互相影响? 什么是线程池,如何使用? Java的并发、多线程、线程模型 谈谈对多线程的理解 多线程有什么要注意的问题?...(HashMap,HashSet等比较是否为同一个) 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。...一个进程内可拥有多个线程,进程可开启进程,也可开启线程。 一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。...如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。...当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。
Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中...(这句话是针对同一个类环境下的,比如说,一个类有多个成员(属性,方法,字段),静态方法A,那么可以访问同类名下其他静态成员,你如果访问非静态成员就不行) 因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员...在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。...注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super(); 如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数...当元素的hashCode值相同时,才继续判断元素的equals是否为true。 如果为true,那么视为相同元素,不存。如果为false,那么存储。
核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包 如果想要运行一个开发好的Java程序,计算机中只需要安装...static应用场景 因为static是被类的实例对象所共享,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量。 ...但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。 ...并且不允许定义为 private 或者 protected多继承一个类最多只能继承一个抽象类一个类可以实现多个接口字段声明抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final 的...不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类 创建一个对象用什么关键字?对象实例与对象引用有何不同?
如果子类改写了父类的方法,那么子类和父类的那些同名方法共享一个方法表项,都被认作是父类的方法。因此可以实现运行时多态。 Java 提供的多态机制?...静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。 为什么要把 String 设计为不可变?...节省空间:字符串常量存储在 JVM 的字符串池中可以被用户共享。 提高效率:String 可以被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。...HashSet 中存储的元素是不能重复的,主要通过 hashCode 与 equals 两个方法来判断存储的对象是否相同: 如果两个对象的 hashCode 值不同,说明两个对象不相同。...如果两个对象的 hashCode 值相同,接着会调用对象的 equals 方法,如果 equlas 方法的返回结果为 true,那么说明两个对象相同,否则不相同。
使用嵌套类的好处: 嵌套类可以访问外部类的所有数据成员和方法,即使它是私有的。 提高可读性和可维护性:因为如果一个类只对另外一个类可用,那么将它们放在一起,这更便于理解和维护。...内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。...3、另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。...但是该方法结束之后, 在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。...一个相关的缺点是,JavaBeans 模式排除了让类不可变的可能性,并且需要在程序员的部分增加工作以确保线程安全。
B:如果一个自定义类提供了构造方法,那么,系统将不再给出无参构造方法。 这个时候,你可以不使用无参构造方法。 如果你想使用,那么,就必须手动给出无参构造方法。...equals只能用于比较引用数据类型的。 **Object提供的equals是用于比较对象地址值是否相同。 **自定义类中,如果重写了equals方法,那么就是按照你自己的需求来比较的。...ThreadLocal 实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。...如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全, 所以在这种情况下要特别小心。...一个方法是否声明为同步取决于临界区访问(critial section access), 如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。
子类和父类不在同一个包中,那么子类只能重写父类声明为public和protected的非final方法。 重写方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。...如果 nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。...动态性 进程是一个在系统中活动的指令集合,包含了事件的概念,具有自己的生命周期和状态。 并发性 在单个处理器上,多个进程可以并发的执行,并且执行时他们彼此之间不会互相影响。...线程的优先级 线程运行时拥有优先级,优先级高的线程则拥有较多的运行机会。 线程默认的优先级与它的父线程相同,而主线程具有普通优先级。 Thread类提供了如下的成员,来处理线程的优先级。...避免多次锁定 尽量避免同一个线程对多个同步监视器进行锁定。 按相同的顺序加锁 如果多个线程需要对多个同步监视器加锁,则应该保证他们以相同的顺序请求加锁。