java笔记
1、面向对象可以解释下吗?都有哪些特性?
面向对象是一种思想,可以将复杂问题简单化,让我们从执行者变为了指挥者。面向对象的三大特性为:封装,继承与多态。- 封装:将事物封装成一个类,减少耦合,隐藏细节。保留特定的接口与外界联系,当接口内部发生改变时,不会影响外部调用方。
- 继承:从一个已知的类中派生出一个新的类,新类可以拥有已知类的行为和属性,并且可以通过覆盖/重写来增强已知类的能力。
- 多态:多态的本质就是一个程序中存在多个同名的不同方法,主要通过三种方式来实现:
- 通过子类对父类的覆盖来实现
- 通过在一个类中对方法的重载来实现
- 通过将子类对象作为父类对象使用来实现
2、JDK,JRE和JVM的区别与联系有哪些?
三者的基本概念可以概括如下:
- JDK(Java Development Kit)是一个开发工具包,是Java开发环境的核心组件,并且提供编译、调试和运行一个Java程序所需要的所有工具,可执行文件和二进制文件,是一个平台特定的软件
- JRE(Java Runtime Environment)是指Java运行时环境,是JVM的实现,提供了运行Java程序的平台。JRE包含了JVM,但是不包含Java编译器/调试器之类的开发工具
- JVM(Java Virtual Machine)是指Java虚拟机,当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等
区别与联系:
- JDK是开发工具包,用来开发Java程序,而JRE是Java的运行时环境
- JDK和JRE中都包含了JVM
- JVM是Java编程的核心,独立于硬件和操作系统,具有平台无关性,而这也是Java程序可以一次编写,多处执行的原因
Java语言的平台无关性是如何实现的?
- JVM屏蔽了操作系统和底层硬件的差异
- Java面向JVM编程,先编译生成字节码文件,然后交给JVM解释成机器码执行
- 通过规定基本数据类型的取值范围和行为
Java语言是编译型还是解释型语言?
答:Java的执行经历了编译和解释的过程,是一种先编译,后解释执行的语言,不可以单纯归到编译性或者解释性语言的类别中。
3、抽象类和接口有什么区别?
答:抽象类和接口的主要区别可以总结如下。
- 抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存
- 接口中的方法在JDK8之前只能是抽象的,JDK8版本开始提供了接口中方法的default实现
- 抽象类和类一样是单继承的;接口可以实现多个父接口
- 抽象类中可以存在普通的成员变量;接口中的变量必须是static final类型的,必须被初始化,接口中只有常量,没有变量
4、Java中的8种基本数据类型及其取值范围
答:Java种的8种基本数据类型分别是:byte,short,int,long,float,double,char以及boolean。boolean类型的取值为true和false两种,其余每一种基本类型都占有一定的字节,并且拥有着最大值和最小值。比如int的取值范围为 Integer.MIN_VALUE 到 Integer.MAX_VALUE。这个题目的答案,我希望大家可以自己动手输入代码来一一查看以加深记忆。这里给出每种基本类型所占用的字节数:
- byte:1字节
- short:2字节
- int:4个字节
- long:8字节
- float:4字节
- double:8字节
- char:2字节
- boolean:Java规范中并没有规定boolean类型所占字节数
5、Java中的元注解有哪些?
答: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标注,表明MyAnn注解就只能作用在类/接口和方法上。
@Target({ElementType.TYPE, ElementType.METHOD}) public @interface MyAnn { }
- @Retention:(保留策略)
保留策略定义了该注解被保留的时间长短。关键源码如下:
public @interface Retention { RetentionPolicy value(); } public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
其中,SOURCE:表示在源文件中有效(即源文件保留);CLASS:表示在class文件中有效(即class保留);RUNTIME:表示在运行时有效(即运行时保留)。例如,@Retention(RetentionPolicy.RUNTIME)标注表示该注解在运行时有效。
- @Documented:
该注解用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被javadoc此类的工具文档化。Documented是一个标记注解,没有成员。关键源码如下:
public @interface Documented { }
- @Inherited:
该注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。关键源码如下:
public @interface Inherited { }
解析:
Java中的注解是一个基础知识点,我们在程序中频繁的使用注解。使用注解可以代替配置文件,比如SpringBoot就是提供了大量的注解来代替配置文件,从而极大的方便了Web项目的搭建与开发。那么,我们再来详细阐述下Java中的注解吧。
注解的作用:
代替繁杂的配置文件,简化开发。
如何定义一个注解?
定义注解类不能使用class、enum以及interface,必须使用@interface。下边是一个简单的注解定义:
public @interface MyAnn{}
如何定义注解的属性?
public @interface MyAnn { String value(); int value1(); } // 使用注解MyAnn,可以设置属性 @MyAnn(value1=100,value="hello") public class MyClass { }定义注解时候的value就是属性,看着是一个方法,但我们称它为属性。当为注解指定属性后,那么在使用注解时就必须要给属性赋值了。
6、说说Java中反射机制?
答: 反射机制是指在运行中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性。即动态获取信息和动态调用对象方法的功能称为反射机制。
解析:
反射机制是Java中的高级特性之一,市场上流行的各个框架,比如Spring等底层都依赖于Java中的反射机制。那么,我们一起来详细看下反射机制吧。
反射机制的作用:
- 在运行时判断任意一个对象所属的类
- 在运行时构造一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法,生成动态代(dai)理
与反射相关的类:
- Class:表示类,用于获取类的相关信息
- Field:表示成员变量,用于获取实例变量和静态变量等
- Method:表示方法,用于获取类中的方法参数和方法类型等
- Constructor:表示构造器,用于获取构造器的相关参数和类型等
Class c = int.class; Class c = int[ ].class; Class c = String.class(2)通过对象.getClass( )方法来获取Class类对象:
Class c = obj.getClass( );(3)通过类名称加载类Class.forName( ),只要有类名称就可以得到Class:
Class c = Class.forName(“cn.ywq.Demo”);接下来,我们给出一个以反射方式来创建对象的Demo:
package com.ywq; public class Demo1 { public static void main(String[] args) throws Exception { String className = "com.ywq.User"; // 获取Class对象 Class clazz = Class.forName(className); // 创建User对象 User user = (User)clazz.newInstance(); // 和普通对象一样,可以设置属性值 user.setUsername("yangwenqiang"); user.setPassword("19931020"); System.out.println(user); } } class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } }结果输出如下:
由图中可以看出,我们通过反射机制来成功创建了一个User对象,该对象和以new Object()方式创建的对象一样,可以设置其属性值。
关于反射这块的详细API接口介绍,建议大家参考官方提供的API接口文档,限于文章篇幅,我们这里就不展开介绍了,大家有问题可以在评论区留言交流,我们可以一起研究探讨。