在Java中,异常可以分为两大类:编译时异常(编译时检查异常)和运行时异常(非编译时检查异常)。
编译时异常(Checked Exceptions)是指在编译时期必须被捕获或声明抛出的异常。这些异常通常是可恢复的,也就是说,程序在遇到这类异常时,如果适当处理,还有可能继续运行。Java编译器会检查这些异常是否被正确处理,如果没有,编译器将报错,不允许程序通过编译。
编译时异常的特点包括:
- 必须处理:编译器强制要求程序必须处理这些异常,要么通过
try-catch
语句捕获,要么在方法签名中使用throws
关键字声明抛出。 - 通常是由外部因素引起的:比如
IOException
、SQLException
等,这些异常通常与程序执行的环境有关,比如文件操作、数据库操作等。 - 应该被恢复:编译时异常通常表示可以恢复的错误,比如通过用户输入来解决。
编译时异常的例子包括:
IOException
:当发生输入输出异常时抛出。SQLException
:当数据库操作出现异常时抛出。FileNotFoundException
:当文件未找到时抛出。
在Java中,静态变量(也称为类变量)是属于类的,而不是属于类的某个特定实例的。让我们逐个检查给出的选项:
- 静态变量不属于对象实例,它们是类级别的,因此不能被继承,也就不能被子类覆盖。
- 尽管静态变量属于类,不属于特定的实例,但是它们可以通过实例方法被访问和修改。
- 静态变量不属于任何对象实例,它们在类加载到JVM时分配空间,而不是在创建对象时。
- 静态变量是类的一部分,它们在类加载时就已经存在,不依赖于任何对象实例。
在Java中,try
代码块必须至少与一个catch
代码块或者一个finally
代码块一起使用。try
代码块不能单独存在,因为它的目的是捕获和处理可能发生的异常。
如果try
代码块中可能抛出异常的代码没有被相应的catch
代码块处理,那么必须使用finally
代码块来确保资源的正确释放或者执行一些清理工作。
其实try还有一种用法,就是try-with-resources(Java7引入的),用法是
try(创建需要使用后关闭的局部变量) {
内部结构。。。
}
括号里创建的局部变量会在try的整个结构执行完毕后自动关闭释放。这种try的使用可以在添加异常到方法签名后不搭配catch和finally。
Java线程的一些状态:
NEW:这个状态表示线程已经被创建,但还没有启动。在这个阶段,线程还没有开始执行。
RUNNING:这个状态表示线程正在Java虚拟机中执行。线程的执行可能是在操作系统的内核态或用户态,这取决于操作系统对线程的支持。
WAITING:这个状态表示线程正在等待另一个线程完成某些操作。例如,线程可能在等待获取一个将会被另一个线程释放的锁。
BLOCKED:这个状态表示线程因为请求一个监视器锁(monitor lock)而被阻塞,而这个锁正被其他线程持有。当锁被释放时,这个线程可能会变成可运行状态。
TIMED_WAITING:这个状态类似于WAITING,但线程等待一定的时间后会再次尝试获取锁,或者等待某个条件发生。
TERMINATED:这个状态表示线程已经执行完毕,结束了它的运行。
Lambda表达式在Java中引入了一种简洁的方式来表示匿名函数,即没有名称的函数,它们可以被直接传递到方法中。
Lambda表达式本身是不可序列化的。虽然它们可以被传递到方法中,但它们不能被直接序列化。不过,如果Lambda表达式实现了java.io.Serializable
接口,那么包含Lambda表达式的类可以被序列化。
在Lambda表达式中,如果表达式体只有一条语句,那么这条语句的结果将作为函数的返回值,无需使用return
关键字。如果表达式体有多条语句,那么必须使用return
语句来返回值。
Lambda表达式用于实现函数式接口的实例,函数式接口是指只包含一个抽象方法的接口。Java 8引入了@FunctionalInterface
注解来标记函数式接口。
nio
包(New Input/Output)在Java 1.4中引入.
InputStream
和OutputStream
是Java I/O库中的基础抽象类,用于提供字节流的输入和输出操作。
Reader
和Writer
是Java I/O库中的抽象类,用于提供字符流的输入和输出操作。这些类使用字符集进行编码转换,适合处理文本数据。
Java 7开始引入了java.nio.file
包(在Java 7中被称为java.nio.file
,而在Java 8中被称为java.nio.file
),其中包含了Files
工具类,它提供了许多静态方法来简化文件的创建、删除、移动、复制以及属性获取等操作。
yield()
方法用于提示线程调度器,当前线程愿意让出对CPU的使用权。这是一个非强制的提示,调度器可以忽略这个提示。yield()
方法并不涉及线程同步,它只是提供了一种让当前线程放弃CPU使用权的方式,以允许其他线程运行。
在Java 8之前,接口不能包含构造器。但是从Java 9开始,接口可以包含私有的构造器,尽管这些构造器不能被外部访问。
super
关键字用于引用父类中的属性、方法或构造函数。它不是用来实现继承的关键字,而是在子类中用来访问父类成员的关键字。
this
关键字用于引用当前对象的属性和方法,或者在构造函数中调用当前类的另一个构造函数。它不涉及继承机制。
虽然private
修饰符可以用于类的成员(如字段和方法),但它不能用于类本身。private
类将限制类的访问范围,使其只能在定义它的文件内被访问,但这不是Java中常用的做法。
和private
一样,protected
修饰符可以用于类的成员,但不能用于类本身。protected
类将允许同一个包内的类以及不同包中继承了这个类的子类来访问这个类。
基本数据类型(如int
、double
、boolean
等)变量不能被赋值为null
。null
是用于引用类型的特殊值,表示没有引用任何对象。
引用类型变量(如类、接口、数组等)可以被赋值为null
,表示它们没有引用任何对象。
静态变量是类级别的变量,它们可以是基本数据类型或引用类型。基本数据类型的静态变量不能被赋值为null
,而引用类型的静态变量可以被赋值为null
。
成员变量是类的实例变量,它们可以是基本数据类型或引用类型。基本数据类型的成员变量不能被赋值为null
,而引用类型的成员变量可以被赋值为null
。
在Java 8之前,接口只能包含抽象方法和静态变量。从Java 8开始,接口可以包含默认方法(有具体实现的方法)和静态方法,但它们都不是实例方法。接口中的变量默认是public static final
的,因此是常量,不能是实例变量。
在Java 8之前,实现接口的类必须实现接口的所有方法。从Java 8开始,接口可以包含默认方法,实现接口的类不需要实现这些默认方法。
接口和抽象类在Java中是两种不同的概念。接口定义了方法的规范,而抽象类可以包含方法的具体实现。尽管它们都可以包含抽象方法,但它们的用途和定义方式有所不同。
在Java中,String
类是不可变的,并且Java虚拟机(JVM)有一个字符串常量池(String Pool)的概念,用于存储字符串字面量。当两个字符串字面量相等时,它们通常会指向字符串常量池中的同一个对象。
枚举类型可以拥有自己的实例变量和实例方法,就像普通的类一样。
枚举隐式地继承了java.lang.Enum类,但它不能继承其他类。然而,枚举可以实施(implement)一个或多个接口。
枚举类型是一种数据类型,可以用于定义一组命名的常量。
枚举可以包含构造函数,但这些构造函数不能被直接调用,它们被用来初始化枚举常量。
在Java中,==
运算符用于比较两个引用是否指向同一对象,即它们是否具有相同的内存地址。它不比较对象的内容是否相等。
在Java中,多态性(Polymorphism)是指允许不同类的对象对同一消息做出响应的能力,即同一个接口可以被不同的实例以不同的方式实现。多态性分为编译时多态(方法重载)和运行时多态(方法覆盖)。
在Java中,抽象方法(abstract method)是不能有方法体的。抽象方法只在抽象类(abstract class)或接口(interface)中声明,不提供具体的实现,目的是强制要求任何非抽象的子类提供这些方法的具体实现。
在Java中,接口(interface)中的方法默认是public
和abstract
的。这意味着当你在接口中声明一个方法时,即使你没有显式地指定public
或abstract
关键字,这些方法也是public
和abstract
的。
接口中的方法默认同时具有public
和abstract
的特性。
在Java中,接口(interface)默认情况下具有以下特性:
- Public:接口本身以及它包含的所有成员(方法、变量等)默认都是
public
的。这意味着它们对任何其他类都是可见的,不需要显式地使用public
关键字。 - Abstract:接口中的方法默认是抽象的(
abstract
),这意味着它们没有具体的实现,需要被实现接口的类具体实现。从Java 8开始,接口也可以包含默认方法(default
)和静态方法(static
),这些方法提供了具体的实现。 - 接口中的变量默认是
public static final
的,通常称为常量。
在Java中,接口(interface)和它其中的方法有一些默认的访问修饰符和行为特性,这些特性在Java语言规范中是预定义的:
- 接口默认是
public
的:
-
- 接口本身默认具有
public
访问修饰符。这意味着,如果你在定义接口时没有指定访问修饰符,接口将自动具有public
的访问级别,从而可以被任何其他类访问。这是从Java 9开始明确的行为,而在Java 8及之前的版本中,虽然行为相同,但这一点并没有在语言规范中明确指出。
- 接口本身默认具有
- 接口中的方法默认是
public
和abstract
的:
-
- 在接口中声明的任何方法都会自动具有
public
访问修饰符。这是因为接口的目的是定义可以被任何实现该接口的类所实现的规范,而public
访问级别确保了这些方法可以被广泛访问。 - 从Java 8开始,接口中的方法除了可以是
public
和abstract
的,还可以是public
和default
的(带有默认实现的方法),或者是public
和static
的(静态方法)。但在Java 8之前,接口中的方法只能是public
和abstract
的。
- 在接口中声明的任何方法都会自动具有
因此,当说“接口默认是public
的,而方法是abstract
修饰的”时,实际上是指:
- 接口本身具有
public
的访问级别。 - 接口中的方法默认具有
public
访问级别,而在Java 8之前的版本中,接口中的方法只能是abstract
的,没有具体的实现。 - 从Java 8开始,接口中的方法可以有默认实现(
default
方法),也可以是静态的(static
方法),但这些方法不是abstract
的。
在Java中,break
语句确实只能用于两种情况:
- 循环语句:当在
for
、while
或do-while
循环中使用break
时,它会立即终止循环的执行,控制流将转到循环后面的语句。 switch
语句:在switch
语句中使用break
可以终止某个case
块的执行,并跳出switch
语句。如果没有break
,switch
语句将继续执行后面的case
块(这称为"fall-through")。
break
语句不能在其他上下文中使用,例如,它不能用于单独的代码块或条件语句中。
在Java中,静态方法可以被重载。方法重载(Method Overloading)是指在同一个类中可以有多个同名方法,只要这些方法的参数列表不同(即参数的数量或类型不同)。
静态方法作为类的一部分,遵循与实例方法相同的重载规则。因此,一个类中可以有多个同名的静态方法,只要它们的参数列表不同。
运行时异常(RuntimeException),这类异常通常是由程序的运行时错误引起的,如逻辑错误或者是不当的API使用。不需要强制使用 try-catch
语句块来捕获处理,不过,为了提高程序的健壮性,建议在可能抛出该异常的地方进行适当的异常处理。
编译时异常(checked exceptions)是那些在编译时期必须被捕获或声明抛出的异常,这些异常通常是可恢复的,并且与外部资源有关,比如文件操作、网络通信等。编译时异常需要在方法签名中使用 throws
关键字声明抛出,或者在方法内部使用 try-catch
语句块捕获处理。
在Java的早期版本中,抽象类只能包含抽象方法,即没有方法体的方法。但是,从Java 8开始,抽象类被允许包含具有具体实现的实例方法,这些方法被称为具体方法或普通方法。这个特性使得抽象类可以提供一些通用的实现,供所有子类使用,或者作为子类方法的默认实现。
这个改变是在Java 8版本中引入的,作为语言规范的一部分,允许抽象类有更多的灵活性。因此,从Java 8开始,抽象类可以包含具体方法的实现,这些方法可以被同一个抽象类的其他方法调用,也可以被继承这个抽象类的子类调用,而不需要子类提供这些方法的实现。
在Java中,如果一个类实现了某个接口,它确实需要实现该接口中声明的所有方法。但是,从Java 8开始,接口可以包含默认方法(使用default
关键字定义的方法),这些方法提供了默认的实现,因此实现接口的类可以选择不实现这些默认方法。
在面向对象编程(OOP)中,基类(Base Class)通常指的是作为其他类继承起点的类。
创建对象:
new
关键字是Java中最基本的创建对象的方式。它通过调用构造函数来分配内存,并初始化对象。clone()
方法可以用于创建一个对象的副本,但它需要对象的类实现Cloneable
接口,并重写clone()
方法。clone()
方法默认是保护的,并且返回对象的引用,所以它可以用来创建对象的副本。newInstance()
方法是java.lang.Class
类的一个方法,它可以用来创建类的新实例。这个方法相当于调用类的new
操作符,并调用无参构造函数来创建对象。
在Java中,面向对象编程(OOP)的原则是指导面向对象软件设计和开发的基本法则。
单一职责原则(Single Responsibility Principle)指的是一个类应该只有一个引起它变化的原因,即一个类应该只负责一个功能。
开闭原则(Open/Closed Principle)指的是软件实体应当对扩展开放,对修改关闭。这意味着在不修改现有代码的情况下,应该能够扩展软件实体的功能。
依赖倒置原则(Dependency Inversion Principle)要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
里氏替换原则(Liskov Substitution Principle)是指子类对象应该能够替换其基类对象,而不影响程序的正确性。这个原则强调了继承和多态性的正确使用。
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用对象和类的概念来模拟现实世界中的实体和行为。OOP的核心思想是将数据(属性)和操作数据的方法(行为)封装在对象中,从而提高代码的可重用性、灵活性和易于维护性。
- 类(Class):
-
- 类是对象的蓝图或模板,定义了对象的属性(字段或变量)和方法(函数或行为)。
- 类可以看作是对象的类型,对象是类的实例。
- 对象(Object):
-
- 对象是类的实例,具有状态(属性)和行为(方法)。
- 对象之间的交互是通过它们的方法来实现的。
- 封装(Encapsulation):
-
- 封装是将数据和操作数据的方法组合在一起,并隐藏内部实现的细节。
- 通过访问修饰符(如private、public、protected)控制对类成员的访问。
- 继承(Inheritance):
-
- 继承是一种创建新类的方式,新类可以继承现有类的属性和方法。
- 继承支持代码重用,并可以建立类之间的层次关系(基类和子类)。
- 多态(Polymorphism):
-
- 多态是指允许不同类的对象对同一消息做出响应的能力。
- 多态性分为编译时多态(方法重载)和运行时多态(方法覆盖)。
- 抽象(Abstraction):
-
- 抽象是将复杂的现实世界简化为基本的构建块的过程。
- 在编程中,抽象允许我们定义只包含关键信息的类,隐藏不必要的复杂性。
- 关联(Association):
-
- 关联是两个类之间的连接,表示一个类的对象与另一个类的对象之间的联系。
- 关联可以是有方向性的,并且可以有多重性(一对一、一对多、多对多)。
- 聚合(Aggregation):
-
- 聚合是一种特殊的关联,表示整体和部分的关系,但部分可以独立于整体存在。
- 例如,一个大学(整体)可以由多个学院(部分)组成,但学院也可以独立于大学存在。
- 组合(Composition):
-
- 组合也是一种整体和部分的关系,但部分不能独立于整体存在。
- 在组合中,部分对象的生命周期依赖于整体对象。
- SOLID原则:
-
- SOLID是面向对象设计的几个核心原则的缩写,包括单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。
- 这些原则指导开发者如何设计灵活、可维护和可扩展的系统。
面向对象编程强调的是将现实世界的问题域映射到程序中的对象,并通过这些对象的交互来解决问题。OOP在现代软件开发中被广泛使用,因为它提供了一种自然的方式来模拟现实世界的复杂性,并且使得代码更加模块化和易于管理。
近日总结:发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯发疯我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山我要去爬山