1、JDK,JRE,JVM三者之间的联系和区别
①、JVM,即Java Virtual Machine,Java虚拟机
JVM并不能识别.java文件,只能识别.class文件,JVM能识别.class文件中的字节码指令并调用操作系统完成指定的个动作,所以JVM是Java跨平台的核心。
②、JRE,Java Runtime Environment,Java运行时环境
JRE主要包含2个部分,JVM的标准实现和Java的一些基本类库。相比于JVM,多出来的是一部分Java类库。
③、JDK,Java Development Kit,开发工具包
JDK是整个Java开发的核心,它集成了JRE和一些好用的小工具,例如:javac.exe,java.exe,jar.exe等。
因此,如果只是部署和运行Java程序,只需安装JRE即可;如果要开发Java程序则需要安装JDK。
2、Java跨平台的原因
跨平台的含义是不依赖于操作系统和硬件环境。Java编译器将Java编译成与平台无关的class字节码文件,然后由JVM执行class字节码文件,该字节码是与平台无关的,是介于源代码和机器指令之间的一种状态,在后续的执行中,JVM将class字节码文件解释成与平台相对应的机器指令,这样既减少了编译次数,又增强了程序的可移植性,因此被称为“一次编译,多处运行!”
3、接口和抽象类的区别
①、接口
接口是public的,不能有私有的方法或变量,方法都没有方法体,通过interface关键字实现;
接口中的变量会被隐式的指定为public static final类型(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),一般不在接口中定义变量。
②、抽象类
如果一个类含有抽象方法,则此类是抽象类,抽象类必须用abstract修饰,被声明的抽象方法不能有方法体。抽象类的子类必须实现其所有抽象方法,否则也是抽象类,子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)
③、二者的相似之处
都不能实例化;
二者的子类或者实现都只有实现了所有的(抽象)方法之后才能实例化。
④、不同之处
接口不能有方法的实现,而抽象类中非抽象方法可以有方法体;
一个类只能继承一个父类,但是同时可以实现多个接口;
接口强调特定功能的实现,而抽象类强调所属关系;
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号;
接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改;
抽象类是 is a的关系,接口是has a的关系。
4、public、private、protected、default(什么都不写)区别
作用类 | 当前类 | 同一包 | 子孙包 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
5、重载与重写
①、重载发生在类内部,方法名相同而参数不同,是一个类中多态性的体现。
②、重写是子类继承父类,子类继承父类并重写父类中的方法,只改变父类中的方法体
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性的表现,构造方法不能被重写,声明为final的方法不能被重写,声明为static的方法不能被重写,但是能够被再次申明
6、面向对象三大特性
①、封装
把同一类事物的属性和方法封装到一个类中,不允许外部程序直接访问,而是需要通过类的方法访问类的隐藏数据,隐藏了类的实现细节,便于修改和实现。
②、继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
子类拥有父类非private方法和属性,并且子类可以额外设计方法即对父类进行扩展。
③、多态
多态,即同一个行为具有不同表现形式的能力。
多态的条件:
继承;
重写;
父类引用指向子类对象;
7、向上转型与向下转型
①、向上转型,子类引用的对象转换为父类类型称为向上转型,即把子类对象直接赋给父类引用,注意instanceof关键字;
②、向下转型,父类引用的对象转换为子类类型称为向下转型,把指向子类对象的父类引用赋给子类引用叫向下转型;
向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法
向下转型,
情况一:如果父类引用的对象如果引用的是指向的子类对象(Animal a = new Dog(); Dog d = (Dog)a;
),那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现(Animal a = new Animal(); Dog d = (Dog)a;
)
向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
8、final、static、this、super关键字
①、static
- 被static关键字修饰的变量和方法属于类,被类的所有对象和方法共享,可以使用类名访问,也可以通过对象调用。
- 静态代码块,不管该类创建了多少个对象,静态代码块只执行一次,代码块执行顺序为:静态代码块—>非静态代码块—>构造方法
- static修饰类只能作为静态内部类,静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有,没有这个引用就意味着:
- 它的创建是不需要依赖外围类的创建。
- 它不能使用任何外围类的非static成员变量和方法。
②、this
this关键字可以在任何类中使用,在但仅代表该类的对象,一般是在类的方法中访问本类的其他方法或变量时使用,静态方法中不能使用this和super(因为静态成员是属于类的,实在类加载的时候就存在的,非静态成员是属于对象的,非静态成员不存在的时候静态成员就已经存在了,所以在静态中调用非静态肯定是错误的)
③、super
用于子类访问父类的成员,必须放在子类方法的第一行,而this关键字使用的时候也必须放在第一行,所以this和super不能同时存在。
④、final
- final修饰类则该类不允许被继承;
- final修饰方法,则该方法不允许被重写;
- final修饰全局成员变量,不会进行默认的初始化,因此必须对其手动初始化,或者通过构造函数初始化,但二者只能选其一,因为一旦初始化成功后被final修饰的成员就不能被修改了,也即被final修饰的成员只能赋值一次。
- final修饰局部变量时可以初始化也可以不初始化
- final修饰引用类型变量不能重新赋值但可以改变引用类型变量所引用对象的内容(引用类型变量指向的地址值不变)
9、Java是值传递还是引用传递
Java是值传递,Java中只有值传递
- 值传递,是指调用函数时将实际参数拷贝一份传递到函数中,如果对函数的参数进行修改也不会影响到实际参数;
- 引用传递,是指调用函数时把实际参数的地址传到函数中,函数对参数的修改将会影响到实际参数,应将应用传递中的引用理解为"地址"、“指针”。
值传递传递的是实参副本,函数修改不会影响到实际参数;引用传递传递的是实参地址,函数修改会影响实参
10、深拷贝与浅拷贝
推荐阅读:【Java深入】深拷贝与浅拷贝详解
11、基本数据类型和包装类型的区别
- 包装类是对象,拥有字段和方法,对象的调用都是通过引用对象的地址;
- 包装类存储在堆中,基本类型存储在值栈中;
- 初始值不同,包装类初始值为null
来源:CSDN
作者:ZphPnHui
链接:https://blog.csdn.net/qq_43060759/article/details/104728252