学习笔记——Java基础(二)
1、抽象类和接口有什么区别?
答:通过abstract来定义抽象类,通过interface关键字来定义接口。
不同点:
- 抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存
- 接口中的方法在JDK8之前只能是抽象的,JDK8版本开始提供了接口中方法的default实现
- 抽象类和类一样是单继承的;接口可以实现多个父接口
- 抽象类中可以存在普通的成员变量;接口中的变量必须是static final类型的,必须被初始化,接口中只有常量,没有变量。
相同点:
- 都不能被实例化;
- 可以将抽象类和接口作为引用类型;
- 一个类如何继承了某个抽象类或者实现了某个接口,就必须对其中所有的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
追问:抽象类和接口如何选择?分别在什么情况下使用?
答:根据抽象类和接口的不同之处,当我们仅仅需要定义一些抽象方法而不需要其余额外的具体方法或者变量的时候,我们可以使用接口。反之,则需要使用抽象类,因为抽象类中可以有非抽象方法和变量。
追问:既然提到了接口的默认方法,那么当两个接口的默认方法同名时,怎么解决?
答:1、重写多个接口中的相同的默认方法
2、在实现类中指定要使用哪个接口中默认方法 eg:MyInterface.super.method();
追问:默认方法的意义是什么?
答:接口有个缺点是当接口有改动的时候,需要修改所有的实现类。所以在JDK8中,为了给已经存在的接口增加新的方法并且不影响已有的实现,所以引入了接口默认方法实现。
追问:普通类和抽象类的区别?
答:**普通类:**不能包含抽象方法,抽象类可以包含抽象方法。
**抽象类:**不能直接实例化,普通类可以直接实例化。
2、定义一个不做事且没有参数的构造方法的作用?
**Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。**所以,如果父类中只定义了有参数的构造方法,而在子类的构造方法中没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为java程序在父类中找不到没有参数的构造方法可以执行。
3、八种基本数据类型
类型 | 长度 | 范围 | 最大存储数据 |
---|---|---|---|
byte | 1字节 | -128~127 | 255 |
short | 2字节 | -32768~32767 | 65536 |
char | 2字节 | 存储Unicode码,用单引号赋值 | |
int | 4字节 | -231~231-1 | 2^32-1 |
float | 4字节 | 3.4e-45~1.4e38 | 直接赋值时必须在数字后加上f或F |
long | 8字节 | -263~263-1 | 2^64-1 |
double | 8字节 | 4.9e-324~1.8e308 | 赋值时可以加d或D也可以不加 |
boolean | 没规定 | 只有true和false |
4、元注解
元注解的作用是负责注解其它注解。
- @Target 说明注解所修饰的对象范围
- @Rentention保留策略定义了该注解被保留的时间长短。其中,**SOURCE:**表示在源文件中有效(即源文件保留);**CLASS:**表示在class文件中有效(即class保留);**RUNTIME:表示在运行时有效(即运行时保留)。例如,@Retention(RetentionPolicy.RUNTIME)**标注表示该注解在运行时有效。
- @**Documented:**该注解用于描述其它类型的annotation应该被作为被标注的程序成员公共API,因此可以被javadoc此类的工具文档化。
- @**Inherited:**该注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。
**注解的作用:**代替繁杂的配置文件,简化开发。
**如何定义一个注解?**定义注解类不能使用class、enum、以及interface,必须使用@interface。
5、关于反射
详细的反射,见博客《注解和反射》那一篇。
反射的优点:
运行期类型的判断,class.forName()动态加载类,提高代码的灵活度。
**追问:**什么是静态加载类?什么是动态加载类?
答:
静态加载类:编译时刻加载的类,例如:用new关键字创建的对象要通过编译器的静态检查,如果编译时该类不存在,那么使用该对象的类也无法通过编译。
动态加载类:运行时刻加载的类,在编译的时候不会进行判断,只有在运行时才会进行判断,假设该类不存在,在运行时才会报错。
**追问:**反射使用的前提条件?
答:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)。在运行期间,一个类,只有一个Class对象产生。
反射的缺点:
- 性能开销大:反射涉及了动态类型的解析,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。
- 安全限制:使用反射技术要求程序必须在一个没有安全限制的环境中运行。
性能开销大**:反射涉及了动态类型的解析,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。 - 安全限制:使用反射技术要求程序必须在一个没有安全限制的环境中运行。
- 内部暴露:由于反射允许代码执行一些在正常情况下不被运行的操作。(比如:访问私有的属性和方法),这可能导致代码功能失调并破坏可移植性。