什么是面向对象编程?
面向对象编程一般指面向对象程序设计,面向对象程序设计(Object Oriented Programming)作为一种新方法,是一种计算机编程架构,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。该程序的设计思想侧重于考虑程序中有哪些对象。不同的对象有哪些属性和行为;对象之间关系。
面向对象编程主要有三大特性,分别为:封装、继承、多态,
继承:子类继承父类可以实现代码的抽取和复用,单继承,多实现
封装:将事物的属性和行为抽取出来封装到类中
多态:父类的引用指向子类的实现 Animal a = new Dog(); 三个条件:继承 重写 向上转型
JRE、JDK、JVM区别?
①、JDK:java development kit (Java开发工具包,主要给Java程序开发人员使用)
②、JRE: java runtime environment (Java开发环境,运行java程序,主要是java程序使用者用)
③、JVM :Java Virtual Machine (java虚拟机)
JDK=JRE + Java工具(javac java jconsole,jmap)
JRE=JVM + 类库(Object,String...)
JDK1.8之前和JDK1.8之后定义接口不同?
①、在JDK1.8以前接口中只能定义抽象方法和静态常量;
public static final int A = 10;
public abstract void a();
静态常量通过接口名称使用
抽象方法必须有实现类重写,实现类对象可以调用
②、JDK1.8以后可以有default方法和静态方法;
public default int a() {
return 1;
}
public static int b() {
return 1;
}
default方法由实现类对象调用
静态方法通过接口名称调用
接口和抽象类有何不同?
①、语法上的区别:
包含抽象方法的类必须是抽象类,抽象类中也可以不包含抽象方法;
在JDK1.8以前接口中只能定义抽象方法和静态常量;
②、功能不同:
接口设计的目的是对类中的方法进行约束,接口是对行为的抽象, 表达A like B eg:Bird like Fly;
抽象类设计的目的是代码复用;A is B eg: Man is Person
final、finally、finalize区别,什么作用?
①、final是一个关键字,可以修饰类,变量和方法
final修饰的类不能被继承 final修饰的方法不能被重写 final修饰的变量为常量,不能被重新赋值
②、finally是和异常处理相关的一个关键字
finally一般用在try-catch结构中,不管是否出现异常,finally后面的语句都会被执行
finally也可以用来释放资源
③、finalize是Object中定义的方法
垃圾回收器将对象从堆内存回收之前,会调用对象的finalize方法
局部变量和成员变量区别?
①、定义位置不同:
局部变量:在方法的内部
成员变量:在方法外部,在类中定义的变量
②、作用范围不一样:
局部变量:只能本方法中使用
成员变量:实例变量,非静态成员变量,在所有非静态方法中可以使用
静态变量,静态成员变量,在所有方法中可以使用
③、默认值不一样:
成员变量:有默认值,基本类型:能是0的是0,boolean类型是false,引用类型:null
局部变量:没有默认值,必须手动赋值
④、生命周期不同:
局部变量:随着方法进栈而生成,随着方法出栈而消失
成员变量:实例变量,随着对象的创建而生成,随着对象被gc回收,而消失
静态变量,随着类的加载而生成,类被卸载时,静态变量被销毁
值传递和引用传递区别?
指的是在方法调用时,是将实参复制一份给形参
![](https://img-blog.csdnimg.cn/img_convert/f83baa6bac8a4834a26c6b8dfbfb3cab.png)
基本数据类型的变量,由于存储的是数据本身,所以就是值传递
引用数据类型的变量,存储的是对象的地址,所以就是引用传递
==和equals区别?
①、"=="是比较运算符;equals是java.lang.Object类中的方法;
②、"=="可以比较两个基本数据类型的值是否相等 ,也可以比较两个引用数据类型所指向的对象的地址是否相等;
③、equals方法不能比较两个基本数据类型的变量是否相等 ,但是equals方法可以比较两个引用数据类型的变量是否相等,默认情况下比较的是引用数据类型变量所指向的对象的地址是否相等;equals方法被重写之后,比较的是引用数据类型变量所指向的对象的内容
hashcode和equals的区别?
①、hashCode和equals都是Object类中的方法;
②、equals默认的实现:对象地址是否一样;
③、hashCode是基于native方法实现的,底层是通过hash函数返回一个hash值
重载和重写区别?
重载:在一个类中定义多个方法名相同,形参列表不同(个数,类型)的方法;
为了方便调用,并且可以达到调用区分
重写:在子类中声明和父类方法名,形参列表相同方法;
抛出的异常小于父类 ,访问修饰符大于等于父类(private 修饰的方法无法重写),返回值类型如果是引用类型,可以是父类方法返回值的子类类型;返回值类型如果是基本类型,必须一样
重写通常发生在父子类中,是多态的前提
Java数据类型?
基本数据类型(四类八种):整型 byte short int long
浮点型 float double
布尔型 boolean
字符型 char
引用类型:类、接口、枚举,数组、注解
包装类和基本数据类型区别?以及两者之间的转换?包装类的作用?
包装类是对基本数据类型的封装
![](https://img-blog.csdnimg.cn/img_convert/805874f182604c109e8b8ba3eefe1387.png)
作用:包装类作为基本数据类型对应的引用数据类型,方便了涉及到对象的操作;
包装类中提供了对应基本数据类型最大值,最小值等属性,及相关方法
转换:
①基本类型转化包装类型(装箱),包装类.valueOf(基本类型)
②包装类型转化基本类型(拆箱),对象.xxValue();
③jdk1.5以后提供了自动的包装类和基本类型的转化,不需要显示调用上面的2个方法; 自动装箱和拆箱
构造器代码块、局部代码块、静态代码块执行顺序和执行次数?
①执行顺序
静态代码块:当类加载的时候执行;如果类中有多个静态代码块,按照书写顺序执行
构造器代码块:对象被创建(任意构造方法执行)之前执行,优先于构造方法;
如果类中有多个构造代码块,按照书写顺序执行
局部代码块:当方法执行的时候;如果方法有多个局部代码块,按照顺序执行
②执行次数
静态代码块:一次
构造器代码块:每次创建对象都会执行
局部代码块:每次调用方法都会执行
构造代码块的作用?
构造代码块中定义的是不同对象共性的初始化内容,可以给所有对象进行统一初始化
用于匿名内部类的实例初始化操作,匿名内部类没有明显的构造方法