面向对象
java三大特性
- 封装: 将事务封装成一个类,达到解耦,隐藏细节的效果。通过get/set等方法,封装了内部逻辑,并保留了特定的接口与外界联系。
- 继承: 从一个已知的类中派生出一个新的类,新类可以拥有已知类的行为和属性,并且可以通过覆盖/重写来增强已知类的能力。
- 多态: 同一个实现接口,使用不同的实例而执行不同的操作。继承是多态的基础,没有继承就没有多态。
关于继承
- Java中不支持多继承,即一个类只可以有一个父类存在。
- Java中的构造函数是不可以继承的,如果一个父类构造函数时私有的,那么久不允许有子类存在。
- 子类拥有父类非private的属性和方法
- 子类可以添加自己的方法和属性,即对父类进行扩展
- 子类可以重新定义父类的方法,即方法的覆盖/重写
关于覆盖/重写(@Override)
子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型,但子类丰富或修改了功能。
关于重载
重载是指在一个类中(包括父类)存在多个同名的不同方法,这些方法的参数个数,顺序以及类型不同均可以构成方法的重载。如果仅仅是修饰符、返回值、抛出的异常不同,那么这是两个相同的方法。
所以只有方法返回值不同是不能构成重载的
如:
public int add(int a, int b){}
public void add(int a, int b){}
子类与父类的相互转型
假设有两个类,Father是父类,Son是其子类。
- 向上转型
Father f1 = new Son();
问题:在向上转型的过程中,我们容易出现方法丢失的问题,比如我们将一个导出类(子类)进行向上转型,但是在基类(父类)中可能缺少部分导出类(子类)的方法,所以我们对导出类(子类)进行向上转型之后,使用基类(父类)对象去调用方法,只能调用基类(父类)有的方法。
- 向下转型
父类对象转为子类
Son s1 = (Son) f1;
注意:该父类必须实际指向了一个子类对象才可强制类型向下转型,看看下面的错误例子
Father f2 = new Father();
Son s2 = (Son)f2;
为什么Son s1 = (Son) f1;
可以转型而Son s2 = (Son)f2;
转型失败?
因为 f1 指向一个子类对象,但 f2 被传给了一个 Father 对象,这也就说明了该父类必须实际指向了一个子类对象才可强制类型向下转型
JDK, JRE, JVM
- JDK: java 开发工具包,包含了JRE,同时还包含了java编译器javac、监控工具jconsole、分析工具jvisualvm
- JRE: java 运行时环境,包含了java虚拟机、java基础类库
- JVM: 是指Java虚拟机,当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等
区别与联系:
- JDK是开发工具包,用来开发Java程序,而JRE是Java的运行时环境
- JDK和JRE中都包含了JVM
- JVM是Java编程的核心,独立于硬件和操作系统,具有平台无关性,而这也是Java程序可以一次编写,多处执行的原因
Java语言的平台无关性是如何实现的?
抽象类与接口
java中通过abstract
来定义抽象类,通过interface
关键字来定义接口
抽象类和接口的主要区别可以总结如下:
- 抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存
- 接口中的方法在JDK8之前只能是抽象的,JDK8版本开始提供了接口中方法的default实现
- 抽象类和类一样是单继承的,但接口可以继承多个接口
- 抽象类中可以存在普通的成员变量;接口中的变量必须是static final类型的,必须被初始化,接口中只有常量,没有变量
8种基本数据类型
数据类型 | 字节 | 位 |
---|---|---|
byte | 1 | 8 |
short | 2 | 16 |
int | 4 | 32 |
long | 8 | 64 |
float | 4 | 32 |
double | 8 | 64 |
char | 2 | 16 |
boolean | - | - |
注:boolean没有规定
注解
注解的本质就是一个继承了 Annotation 接口的接口,用来将任何的信息或元数据(Metadata)与程序元素(类、方法、成员变量等)进行关联。程序可以通过反射获取标注内容。
注解的作用
代替繁杂的配置文件,简化开发。
定义注解
public @interface MyAnnotation {
String value();
int value1();
}
// 使用注解MyAnnotation,可以设置属性
@MyAnnotation(value1=100,value="hello")
public class MyClass {
}
从代码可以看出,定义注解使用的是@interface,可以在方法内部定义属性。
元注解
元注解的作用就是负责注解其他注解。Java中提供了4个元注解。
- @Target:说明注解所修饰的对象范围
源码如下:
public @interface Target {
ElementType[] value();
}
public enum ElementType {
TYPE,FIELD,METHOD,ParaMETED,CONSTRUCTOR,LOCAL_VARIABLE,ANNOCATION_TYPE,PACKAGE,TYPE_ParaMETER,TYPE_USE
}
用例
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
}
说明: 这表明MyAnnotation只能作用域类/接口和方法上。
- @Retention:(保留策略): 保留策略定义了该注解被保留的时间长短。
源码如下:
public @interface Retention {
RetentionPolicy value();
}
public enum RetentionPolicy {
SOURCE, CLASS, RUNTIME
}
说明: SOURCE:表示在源文件中有效(即源文件保留);CLASS:表示在class文件中有效(即class保留);RUNTIME:表示在运行时有效(即运行时保留)
- @Documented: 声明注解能够被javadoc等识别
- @Inherited: 声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解
反射
反射机制是指在运行中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性。即动态获取信息和动态调用对象方法的功能称为反射机制。
(未完待续)
java异常体系
异常主要分为Exception和Error
Throwable 是 Java 语言中所有错误与异常的超类。Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
Exception和Error有什么区别?
- Exception是程序正常运行中预料到可能会出现的错误,并且应该被捕获并进行相应的处理,是一种异常现象.Exception又分为了运行时异常和编译时异常。
- Error是正常情况下不可能发生的错误,Error会导致JVM处于一种不可恢复的状态
NoClassDefFoundError 和 ClassNotFoundException 区别?
- NoClassDefFoundError 是一个 Error 类型的异常,是由 JVM 引起的,不应该尝试捕获这个异常。引起该异常的原因是 JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因导致;
- ClassNotFoundException 是一个受查异常,需要显式地使用 try-catch 对其进行捕获和处理,或在方法签名中用 throws 关键字进行声明。当使用 Class.forName, ClassLoader.loadClass 或 ClassLoader.findSystemClass 动态加载类到内存的时候,通过传入的类路径参数没有找到该类,就会抛出该异常;另一种抛出该异常的可能原因是某个类已经由一个类加载器加载至内存中,另一个加载器又尝试去加载它。
捕获异常应该遵循哪些原则
- 不要使用Exception捕获,而是尽可能详细的写出要捕获的异常;
- 使用日志记录,方便以后排查;
- 不要使用try-catch去包住一块很大的代码块,这不利于排查问题;
java异常处理关键字
throw 和 throws 的区别是什么?
- throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。
- throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。
Java中的值传递和引用传递
- 值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。
- 引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。
(未完待续)
(后续更新: 泛型、StringBuffer与StringBuilder、序列化与反序列化、==equalshashcode三剑客、静态与非静态)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。