java笔记

一下内容均为牛客:我是祖国的花朵专刊《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类吧,获取Class类有三种基本方式:
(1)通过类名称.class来获取Class类对象:
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接口文档,限于文章篇幅,我们这里就不展开介绍了,大家有问题可以在评论区留言交流,我们可以一起研究探讨。



















全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务