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种基本类型,和其中取值范围
基本类型 | 每种类型所占字节数 | 取值范围 |
---|---|---|
byte | 1字节 | -127~~128 2的8次方 |
short | 2 | -32767~~32768 2的15次方 3万2千 |
int | 4 | 2的31次方 2的8*4-1次方 21亿左右 |
long | 8 | 2的63次方 2的8*8-1次方 |
float | 4 | 2的31次方 2的8*4-1次方 |
double | 8 | 2的63次方 2的8*8-1次方 |
char | 2 | 2的15次方 2的2*8-1 次方 |
boolean | java规范中并没有规定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卸载结束。