每日一点Java基础小知识 — day3
欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,期待大家的点赞关注喔
-
final关键字:
- final修饰符,可以修饰类,方法,变量,不能修饰接口
- final修饰的类不可以被继承
- final修饰的方法不可以被覆盖
- final修饰的变量为常量。只能赋值一次
- 一般final化的成员变量也会静态化
-
Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类
-
static修饰的为类成员,会随着类的加载而加载,比如静态代码块、静态成员、静态方法(这里只是加载,并没有调用)等等,可以想象一下,如果把一个Class文件中的外部类设为static,目的难道是让这个类随着应用的启动而加载吗?如果在这次使用过程中根本没有使用过这个类,那么是不是就会浪费内存。这样来说设计不合理,总而言之,设计不合理的地方,Java是不会让它存在的
而为什么内部类可以使用static修饰呢,因为内部类算是类的成员了,如果没有使用静态来修饰,那么在创建内部类的时候就需要先有一个外部类的对象,如果我们一直在使用内部类,那么内存中就会一直存在外部类的引用,而我们有时候只需要使用内部类,不需要外部类,那么还是会浪费内存,甚至会造成内存溢出。使用static修饰内部类之后,内部类在创建对象时就不需要有外部类对象的引用了
最终结论就是:static可以用来修饰内部类,但是不可以用来修饰外部类
-
Java的跨平台特性是因为 JVM 的存在, 它可以执行
.class
字节码文件,而不是.java
源代码 -
线程小知识:
-
start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码
-
run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码, 这样就没有达到写线程的目的
-
-
Java只支持单继承,实现多重继承三种方式:
- 直接实现多个接口
- 扩展(extends)一个类然后实现一个或多个接口
- 通过内部类去继承其他类
-
静态方法中没有this关键词,因为静态方法是和类同时被加载的,而this是随着对象的创建存在的,静态比对象优先存在
也就是说,静态可以访问静态,但静态不能访问非静态,而非静态可以访问静态。在静态方法中可直接调用本类的静态方法,也可以通过类名.静态方法名的方式来调用其他类的静态方法
-
数值型变量在默认情况下为Int型,byte和short型在计算时会自动转换为int型计算,结果也是 int 型
-
hashMap在单线程中使用大大提高效率,在多线程的情况下使用hashTable来确保安全。hashTable中使用synchronized关键字来实现安全机制,但是synchronized是对整张hash表进行锁定即让线程独享整张hash表,在安全同时造成了浪费。concurrentHashMap采用分段加锁的机制来确保安全
-
运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
-
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类
-
成员内部类
- 该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
- 成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:
外部类.this.成员变量
或外部类.this.成员方法
- 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
- 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
- 内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰
-
局部内部类
- 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
- 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的
-
匿名内部类
- 一般使用匿名内部类的方法来编写事件监听代码
- 匿名内部类是不能有访问修饰符和static修饰符的
- 匿名内部类是唯一一种没有构造器的类
- 匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写
-
内部静态类
- 静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似
- 不能使用外部类的非static成员变量或者方法
-
-
抛
InterruptedException
的代表方法有:- java.lang.Object 类的
wait
方法 - java.lang.Thread 类的
sleep
方法 - java.lang.Thread 类的
join
方法
- java.lang.Object 类的
-
在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已
-
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
-
引导类加载器(bootstrap class loader)
它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。主要负责
jdk_home/lib
目录下的核心api 或 -Xbootclasspath 选项指定的jar包装入工作(其中的 jdk_home 是指配置jdk环境变量是 java_home 的配置路径,一般是jdk/jre所在目录) -
扩展类加载器(extensions class loader)
它用来加载 Java 的扩展库。Java虚拟机的实现会提供一个扩展库目录,扩展类加载器在此目录里面查找并加载 Java 类,主要负责
jdk_home/lib/ext
目录下的 jar 包或-Djava.ext.dirs
指定目录下的jar包装入工作 -
系统类加载器(system class loader)
它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过
ClassLoader.getSystemClassLoader()
来获取它。主要负责CLASSPATH/-Djava.class.path
所指的目录下的类与jar包装入工作
-
-
方法的重写(override)两同两小一大原则:
-
方法名相同,参数类型相同
-
子类返回类型小于等于父类方法返回类型,子类抛出异常小于等于父类方法抛出异常
- 子类访问权限大于等于父类方法访问权限
-
-
HashTable和HashMap的区别:
-
Hashtable:
- HashTable 是一个散列表,它存储的内容是键值对(key-value)映射
- HashTable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null
- HashTable直接使用对象的HashCode
-
HashMap:
- 由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的
- 不是线程安全的,HashMap可以接受为null的键(key)和值(value)
- HashMap重新计算hash值
-