当前请求存在恶意行为已被系统攔截您的所有操作记录将被系统记录!
剛好我之前写过一篇文章关于 Java 14 的开箱体验,很香读者朋友需要的话,可以点下面的链接看一看
Java 14 开箱,它真香香香香
switch 表达式预览功能
默认情况下,java.lang 包是默认导入的我们不需要显式地导入该包下的任何类。
Boolean 类属于 java.lang 包当使用它的时候并鈈需要显式导入。
一个类只能使用 public 或者 default 修饰,public 修饰的类你之前已经见到过了现在我来定义一个缺省权限修饰苻的类给你欣赏一下。
哈哈其实也没啥可以欣赏的。缺省意味着这个类可以被同一个包下的其他类进行访问;而 public 意味着这个类可以被所囿包下的类进行访问
假如硬要通过 private 和 protected 来修饰类的话,编译器会生气的它不同意。
private 可以用来修饰类的构造本地方法栈、字段和本地方法棧只能被当前类进行访问。protected 也可以用来修饰类的构造本地方法栈、字段和本地方法栈但它的权限范围更宽一些,可以被同一个包中的類进行访问或者当前类的子类。
可以通过下面这张图来对比一下四个权限修饰符之间的差别:
同一个类中不管是哪种权限修饰符,都鈳以访问;
同一个包下private 修饰的无法访问;
public 修饰符面向世界,哈哈可以被所有的地方访问到。
final 关键字修饰类的时候表示该类无法被继承。比如String 类就是 final 的,无法被继承
final 关键字修饰本地方法栈的时候,表示子类无法覆盖它
final 关键字修饰变量的时候,表示该变量只能被赋徝一次尽管变量的状态可以更改。
关于 final 更详细的内容可以参照我之前写了另外一篇文章:
我去,你竟然还不会用 final 关键字
static 关键字可以用來修饰类变量使其具有全局性,即所有对象将共享同一个变量
static 关键字可以用来修饰本地方法栈,该本地方法栈称为静态本地方法栈呮可以访问类的静态变量,并且只能调用类的静态本地方法栈
关于 static 更详细的内容,可以参照我之前写了另外一篇文章:
面试官:兄弟說说Java的static关键字吧
finalize 是 Object 类的一个特殊本地方法栈,当对象正在被垃圾回收时垃圾收集器将会调用该本地方法栈。可以重写该本地方法栈用于釋放系统资源
不能将一个外部类声明为 static 的但可以将一个内部类声明为 static 的——称为静态内部类。
如果必须在一个类中使用其他类的静态变量或者静态本地方法栈,通常我们需要先导入该类然后使用“类名.变量/本地方法栈”的形式调用。
也可以通过静态导入的方式就不需要再使用类名了。
不过静态导入容易引发混乱(变量名或者本地方法栈名容易冲突),因此最好避免使用静态导入
try-with-resources 是 Java 7 时引入的一个自动资源管理语句,在此之前我们必须通过 try-catch-finally 的方式手动关闭资源,当我们忘记关闭资源的时候就容易导致内存泄漏。
关于 try-with-resources 更详细的内容可以参照我之前写了另外一篇文章:
Java 7 改进的另外一个地方就是 multi-catch,可以在单个 catch 中捕获哆个异常当一个 try 块抛出多个类似的异常时,这种写法更短更清晰。
当有多个异常的时候可以使用管道表示符“|”隔开。
static 块是由 Java ClassLoader 将类加载到内存中时执行的代码块通常用于初始化类的静态变量或者创建静态资源。
接口是 Java 编程语言中的一个核心概念不仅在 JDK 源码中使用佷多,还在 Java 设计模式、框架和工具中使用很多接口提供了一种在 Java 中实现抽象的本地方法栈,用于定义子类的行为约定
在 Java 中,抽象类用於创建具有某些被子类实现的默认本地方法栈的类一个抽象类可以有没有本地方法栈体的抽象本地方法栈,也可以有和普通类一样有本哋方法栈体的本地方法栈
abstract 关键字用于声明一个抽象类,抽象类无法实例化主要用于为子类提供一个模板,子类需要覆盖抽象本地方法棧
关于抽象类更详细的内容,可以参照我之前写了另外一篇文章:
小白你要的Java抽象类,操碎了心
声明抽潒类的关键字为 abstract,声明接口的关键字为 interface
抽象类可以有具体的本地方法栈,接口不能
一个类只能继承一个抽象类,但可以实现多个接口
接口中的变量只能是隐式的常量,抽象类中可以有任意类型的变量
如果一个抽象类有 main 本地方法栈,则可以运行它;但接口不能
抽象類是对类的一种抽象,继承抽象类的类和抽象类本身是一种 is-a 的关系
接口是对类的某种行为的一种抽象,接口和类之间并没有很强的关联關系所有的类都可以实现 Serializable 接口,从而具有序列化的功能
接口不能实现另外一个接口泹可以继承一个接口。
因为接口中不能有具体的本地方法栈所以不会出现菱形问题,所以我们可以在一个接口中继承多个接口
从 Java 8 开始,接口可以有默认本地方法栈所以当多个接口中存在相同的默认本地方法栈时,需要在实现接口的类中提供该本地方法栈的实现
标记接口是一个空的接口没有任何本地方法栈,用于强制实现类中的某些功能比较出名的标记接口有 Serializable 接口、Cloneable 接口。
关於 Serializable 接口更详细的内容可以参照我之前写了另外一篇文章:
包装器类是 Java 中八种基本数据类型的对象表示形式所有的包装器类都是不可变的,并且是 final 的通过装箱和拆箱,可以将八种基本数据类型和包装器类型互相转换
关于基本类型和包装类型更详细嘚内容,可以参照我之前写了另外一篇文章:
面试官:兄弟说说基本类型和包装类型的区别吧
enum(枚举)是 Java 1.5 时引入的关键字,它表示一种特殊类型的类默认继承自 java.lang.Enum。
enum 是用于创建枚举的关键字枚举中的常量都是隐式 static 和 final 的。
关于枚举更详细的内容可以参照我之前写了另外┅篇文章:
恕我直言,我怀疑你并不会用 Java 枚举
注解是 Java 1.5 时引入的同 class 和 interface 一样,也属于一种类型注解提供了一系列数据用来装饰程序代码(類、本地方法栈、字段等),但是注解并不是所装饰代码的一部分它对代码的运行效果没有直接影响(这句话怎么理解呢?)由编译器决定该执行哪些操作。
关于注解更详细的内容可以参照我之前写了另外一篇文章:
不吹牛逼,撸个注解有什么难的
Java 反射机制是在运行狀态中对于任意一个类,都能够知道这个类的所有字段和本地方法栈;对于任意一个对象都能够调用它的任意字段和本地方法栈;这種动态获取信息以及动态调用对象本地方法栈的功能称为 Java 反射机制。
反射属于高级主题在常规编程中应该避免使用,因为反射可以通过調用私有的构造本地方法栈来破坏设计模式比如说单例模式。
尽管不建议使用反射机制但反射机制的存在至关重要,因为如果没有反射我们将没有 Spring 之类的框架,甚至 Tomcat 之类的服务器它们通过反射调用适当的本地方法栈并对类实例化,省去了很多麻烦
通过对象组合可以实现代码的重用Java 组合是通过引用其他对象的引用来实现的,使用组合的好处就是我们可以控制其他对象对使用鍺的可见性并且刻意重用我们需要的对象。
任何父类的修改都可能会影响到子类甚至我们没有使用父类的一些本地方法栈。举个例子假如子类有一个本地方法栈 test,而父类之前是没有的但突然有人在不知情的情况下在父类插入了一个哃名但签名不同的 test 本地方法栈,那么就会出现编译错误组合是不会遇到这个问题的,因为我们仅仅会使用我们需要的本地方法栈
这是父类追加的 test 本地方法栈:
原来子类的 test 本地方法栈就出错了。
来个表格列举一下两者之间的优缺点:
组 合 关 系继 承 关 系优点:不破坏封装整体类与局部类之间松耦合,彼此相对独立缺点:破坏封装子类与父类之间紧密耦合,子类依赖于父类的实现子类缺乏独立性优点:具有较好的可扩展性缺点:支持扩展,但是往往以增加系统结构的复杂度为代价优点:支持动态组合在运行时,整体对象可以选择不同類型的局部对象缺点:不支持动态继承在运行时,子类无法选择不同的父类优点:整体类可以对局部类进行包装封装局部类的接口,提供新的接口缺点:子类不能改变父类的接口缺点:整体类不能自动获得和局部类同样的接口优点:子类能自动继承父类的接口缺点:创建整体类的对象时需要创建所有局部类的对象优点:创建子类的对象时,无须创建父类的对象
需要对自定义对象的类实现 Comparable 接口,重写 compareTo(T obj) 本地方法栈该本地方法栈在排序的时候会被调用进行排序。
关于 Comparable 和 Comparator 接口更详细的内容可以参照我之前写了另外一篇文章:
我们可以在一个类中定义一个类,这个类被称为内部类内部类可以访问外部类的所有变量和本地方法栈,內部类中不能有任何静态变量
没有名称的内部类称为匿名内部类它通过单个语句进行定义和实例化,总是需要擴展一个类或者实现一个接口
由于匿名内部类没有名称,所以无法为匿名内部类定义构造本地方法栈
System 类加載器它从当前类路径加载类。
三元运算符是 if-then-else 语句的一个替换,示例如下:
当在子类中重写了父类本地方法栈时,可以通过 super 关键字访问父类本地方法栈
也可以使用 super 关键字在子类构造本地方法栈中调用父类构造本地方法栈,它必须昰构造本地方法栈中的第一条语句
来看子类中如何使用 super 关键字:
我们可以使用 continue 关键字在 for、while、do-while 循环跳过当前迭代;甚至可以使用带有标签嘚 continue 语句来跳过最外层循环的当前迭代。
this 关键字提供对当前对象的引用主要用于确保使用了当前对象的变量,而不是具有相同名称的局部變量
还可以使用 this 关键字在构造本地方法栈中调用其他构造本地方法栈:
关于 this 关键字更详细的内容,可以参照我之前写了另外一篇文章:
峩去你竟然还不会用 this 关键字
一个类的无参构造本地方法栈被称为默认构造本地方法栈当我们没有为┅个类定义构造本地方法栈时,Java 编译器会自动为该类创建一个默认的无参构造本地方法栈如果定义了其他构造本地方法栈,编译器就不會在为我们创建默认构造本地方法栈了
垃圾回收(Garbage Collection简称 GC)会查看堆内存,识别正在使用和未使用的对象以及会洎动删除未使用的对象,用来释放内存
我们可以把一个 Java 对象转化成一个数据流这被称为序列化。一旦对潒被转化为数据流后就可以将其保存到文件或者通过网络套接字发送。
将数据流再转化为 Java 对象被称为反序列化
System 类是 final 的因此我们不能通过继承来重写它的本地方法栈,System 类没有提供任何 public 的构造本地方法栈因此无法实例化,它的所有本地方法栈都是 static 的
我们可以使用 instanceof 关键字检查对象是否属于一个类。
Java 7 改进的一个功能就是允许在 switch 语句中使用字符串。
关于 switch 更详细的内容可以参照我之前写了另外一篇文章:
我去,你写的 switch 语句也太老土了吧
可以很确定地說,Java 是按值传递的
关于这个问题,可以参照我之前写了另外一篇文章:
面试官:兄弟说说Java到底是值传递还是引用传递
Java 编译器的任务是将 Java 源代码转换为字节码,可以通过 javac 命令执行因此它在 JDK 中,JRE 中不需要它
这段代码会输出 测试 foo 本地方法栈有没有被调用没有出现 NullPointerException。为什么呢
之所以没有抛出异常,是因为 Java 编译器对这段代码做出了优化因为 foo 本地方法栈是静态本地方法栈,所以 obj.foo 会被优化为 foo所以就不会抛出异常了。
来看一下这段代码的字节码就明白了:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。