java面试基础题目小结

1.解释一下面向对象,都有哪些特性?

面向对象是一种思想,可以将复杂的问题简单化,让我们从执行者变成指挥者。

面向对象有三大特性:继承 、封装、 多态

继承:从一个已知类(父类)派生出另一个类(子类),子类可以使用父类的所有非private化的方法和属性,并且可以重写父类的方法

封装:将事物封装成一个类,减少耦合,增加聚合,同时保留特定的接口与外界联系,内部的改变不会影响外部调用

多态:一个行为以多种不同的形态实现,主要通过三种方式实现,

​ 1)通过子类重写父类方法 @Override;

​ 2)一个类中的方法进行重载(同样方法,不同参数);

​ 3)通过子类对象作为父类对像来实现 Animal cat=new Cat

2.为什么私有化构造器的类无法被继承?

父类和子类的关系,类的执行顺序

​ 父类静态成员变量+父类静态代码块——子类静态成员变量+子类静态代码块——父类普通变量+父类代码块——父类构造器——子类普通变量+子类代码块——子类构造器

如果私有化父类构造器,在创建子类对象的时候(super())无法调用父类的构造器编译报错,所以私有化构造器的类无法被继承

3.如果只有方法的返回值不同,能构成重载吗?

不能,因为我们调用某个方法的时候并不关心它的返回值,这个时候编译器无法确定我们调用的是哪个方法

4.向上向下转型

子类转成父类是向上转型 Father f= new Son()

父类转成子类是向下转型 Son s= (Son)f;

Father father = new Father();
Son son =  (Son) father;
报错java.lang.ClassCastException

向下转型必须先将子类指向父类,才能强制将父类向下转型子类

5.JDK,JRE和JVM的区别与联系有哪些

JDK是一个开发工具包,是java开发环境的核心组件,并且提供编译、调试和运行一个java程序所需要的所有工具,可执行文件和二进制文件,是一个平台特定的软件

JRE是指java运行环境,JVM的实现,提供运行java程序的平台。JRE包含了JVM,但是不包括Java编译器/调试器之类的开发工具

JVM是指java虚拟机,当我们运行一个程序时,JVM负责将字节码转成机器代码,JVM提供内存管理/垃圾回收机制和安全机制等

6.Java语言的平台无关性是如何实现的

JVM屏蔽了操作系统和底层硬性的差异
java面向JVM编程,先编译生成的字节码文件,然后将jvm解释成机器码执行

7.java语言是编译型还是解释型语言

java执行先编译后解释,不可以单纯归到编译型还是解释型

8.抽象类和接口有什么区别?什么时候使用抽象类,什么时候采用接口

抽象类 public abstract clasName{}
接口类 public interface clasName{}
抽象类和接口的主要区别可以总结如下:
1)抽象类中可以没有抽象方法,抽象方法和具体方法可以共存
2)接口1.8之前只能是抽象的,1.8之后提供了接口使用default实现
3)接口可以多继承,抽象类和实体类只能单继承
4)抽象类中可以存在普通的成员变量;接口中变量必须是static final,必须被初始化,接口中只有常量没有变量

当接口中需要有自己成员变量和实现方法的时候采用抽象类,如果只需要抽象方法不需要提供其他数据则采用接口

接口可以多次被实现,如果接口中出现相同的方法需要手写指定接口的方法MyInterface.work()

9 JDK8中为什么会出现默认方法

使用接口,使得我们面向接口抽象编程,但是其中有一个确定就是当接口改动时,需要修改所有的实现类。在JDK中,为了给已经存在的接口增加新的方法并且不影响已有的实现,于是使用default解决这个问题

10 java中的8种基本类型,和其中取值范围
基本类型每种类型所占字节数取值范围
byte1字节-127~~128 2的8次方
short2-32767~~32768 2的15次方 3万2千
int42的31次方 2的8*4-1次方 21亿左右
long82的63次方 2的8*8-1次方
float42的31次方 2的8*4-1次方
double82的63次方 2的8*8-1次方
char22的15次方 2的2*8-1 次方
booleanjava规范中并没有规定boolean类型所占字节数
10 java中的元注解
public @interface Target{
ElementType[] value();
} 
public enum ElementType{
TYPE,FIELD,METHOD,PARAMETED...
}

@Target({ElementType.TYPE,ElementType.METHOD}) 说明注解所修饰的对象范围

public @interface Retention{
ElementType[] value();
} 
public enum RetentionPolicy{
SOURCE,CLASS,RUNTIME
}

@Retention({RetentionPolicy.Source}) 保留策略定义了该注释被保留时间长短

SOURCE:源文件中保存; CLASS:在字节码文件中保存; RUNTIME:运行时保留

@Documented 是一个标记注解

public @interface Documented{

}
该注解用于描述其他类型的annotation应该被作为被标注的程序成员的公共api,因此可以被javadoc此类的工具文档化

@Inherited注解标记其他的注解用于指明标记的注解是可以被自动继承的。

public @interface Inherited{}

https://www.cnblogs.com/springmorning/p/10261472.html

11.说说java中的反射机制

反射机制是指在运行中,对任意一个类,都能够知道这个类的属性和方法。对于任意一个对象都能够调用它的任意一个方法和属性。即动态获取信息和动态调用对象方法的功能

反射机制的作用

​ 在运行时判断任意一个对象所属的类

​ 在运行时构造一个类的对象

​ 在运行时判断任意一个类所具有的成员变量和方法

​ 在运行时调用任意一个对象的方法,生产动态代理

与反射相关的类

​ Class:表示类,用于获取类的相关信息

​ Field:表示类的成员变量,用于获取实例变量和静态变量

​ Method:表示方法,用于获取类中的方法参与和方法类型

​ Constructor:表示构造器,用于获取构造器的相关参数和类型

Class c=int.Class;通过类名称.class来获取类对象
Class c =obj.getClass();通过对象获得类对象
Class c= Class.forName(""); 通过类名加载类对象
public class Demo{

public static void main(String[] args){
	Class c =Class.forName("user")
 	User user=c.newInstance();
 	user.setUserName();
}
}
12 equals和==的区别,equals和hashCode的关系

​ ==实际上就是比较两个对象的hashCode,而java无法直接拿到地址,hashCodehashcode是根据对象的内存地址经哈希算法得来的。

​ 如果equals相等那么hashCode肯定相等,但是hashCode相等,equals不一定相等(属性不一定相等)

hashCode的作用
在java中某些集合类中需要保证不重复的特性,但是每次插入的时候和前面的数据一个个比较效率太低,于是对于每个元素(对象)都返回一个经过hash算法得到hashCode,当插入新的算法的是直接找到地址所在的hashCode判断是否相同如果不相同则肯定是不同的值,如果相同再调用equals方法比较(Set必定重写了equals方法)
  /**
   *  ==比较的是基础类型的值和引用对象的地址值(String中的equals已经被重写过,比较每一个char) 要用equals比较对象的化需要重写equals方法
   */
  
  
  //String.equals String重写了equals方法
  public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        //如果是String 则先比较字符串长短
        //再比较每一个char 字符
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    
    //Object.equals ==直接比较地址值
    public boolean equals(Object obj) {
        return (this == obj);
    }
    
13 StringBuffer和StringBuilder的区别
14 java中的泛型的理解

​ 什么是泛型:泛型相当于是类型的占位符,将参数类型当作参数那样传,

​ 泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行 时由于对象类型不匹配引发的异常。
​ 泛型有三种使用方式,分别为:

​ 泛型类:是在实例化类的时候指明泛型的具体类型;泛型方法

​ 泛型类:List, Set<K,V>, Map<K,V>

​ 泛型接口 :

public interface Generator<T>{

}

​ 泛型方法:是在调用方法的时候指明泛型的具体类型 。

public static <T> T get(T t1,T t2) { 
    if(t1.compareTo(t2)>=0);//编译错误  ,the method compareTo(T) is undefined for the type T.
    return t1; 
} 
//泛型的上下边界添加,必须与泛型的声明在一起   T extends Comparable  K super Comparable
public static <T extends Comparable> T get(T t1,T t2) { //添加类型限定 
        if(t1.compareTo(t2)>=0); 
        return t1; 
    }
15 java序列化和反序列化的过程
	1.Java序列化,反序列化:Java序列化指将Java对象转换为字节序列的过程,反序列化指将字节序列转换为目标对象的过程;字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
	2.什么情况下需要序列化:当Java对象需要网络传输或者持久化到磁盘上时;
	如果要将对象存到redis中 需要将对象实现Serializable implements Serializable  
	要缓存的JavaBean必须实现Serializable接口,因为Spring会将对象先序列化再存入 Redis 不然会报错
		Caused by: java.io.NotSerializableException
	3.序列化的实现?让类实现Serializable接口,标注该类对象可以被序列化;
16 静态与非静态的区别

静态由关键字static修饰
静态有一些特点:
1.全局唯一,任何一次的修改都是全局性的影响
2.只加载一次,优先于非静态
3.使用方式上不依赖于实例对象。
4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值