JDK和JRE的区别是什么?
- Java运行时环境(Java Runtime Environment ):
包含了java虚拟机,java基础类库。是使用Java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的 - Java开发工具包(Java Development Kit):
是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了Java程序编写所需的文档和demo例子程序 - 如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本
- Java运行时环境(Java Runtime Environment ):
Java的跨平台
Java源程序先经过javac编译器编译成二进制的.class字节码文件(Java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同的机器上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行
机器码与字节码的区别:
机器码:完全衣服硬件而存在,并且不同硬件由于内嵌指令集不同,即使相同的0 1代码,意思也可能是不同的。换句话说,根本不存在跨平台性,比如:不同型号的CPU,你给他个指令10001101,他们可能会解析未不同的结果
字节码:以Java的跨平台为例。为什么可以做到跨平台,因为有一个jvm在,因此不论哪种硬件,只要你装有jvm,那么它就会认识这个Java字节码,至于底层的机器码,不需要我们去关心,有jvm会去搞懂他会把字节码再翻译成机器所认识的机器码static关键字的理解
static表示静态的意思,可用于修饰成员变量和成员方法,被静态修饰的成员方法只能访问静态成员,不可以访问非静态成员。静态是随着类的加载而加载的,因此可以直接用类进行访问。重写子类中的方法和子类继承父类中的方法一样(函数名,参数,参数类型,返回值类型),但是子类中的访问权限不要低于父类中的访问权限。重写的前提是必须要继承,private修饰不支持继承,因此被私有的方法不可以被重写。静态方法形式上可以被重写,即子类中可以重写父类中静态的方法。但是实际上从内存的角度上静态方法不可以被重写是否可以在static环境中访问非static变量?
因为静态的成员属于类,随着类的加载而加载到静态内存方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上Java支持的数据类型 & 什么是自动拆装箱
整数值类型:byte、short、int、long
字符型:char
浮点类型:float、double
布尔型:boolean
Java支持的数据类型包括2种:一是基本数据类型,二是引用类型(如String),其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即引用类型。自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转换为Integer,自动拆箱是Integer调用其方法将其转换为int的过程Overriding和Overloading的区别
Java中的方法重载发生在同一类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须由相同的方法名,参数列表和返回类型,覆盖者可能不会限制它所覆盖的方法的访问方法的重写的原则
- 重写方法的方法名称、参数列表必须与原方法的相同,返回类型可以相同也可以是原类型的子类型(从Java SE5开始支持)
- 重写方法不能比原方法访问性差(即访问权限不允许缩小)
- 重写方法不能比原方法抛出更多的异常
- 被重写的方法不能是final类型,因为final修饰的方法是无法重写的
- 被重写的方法不能为private,否则在其子类中只是定义了一个新方法,并没有对其进行重写
- 被重写的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其它都满足重写条件,那么就会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并满足重写条件,但是仍然不会发生重写,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配
- 重写是发生在运行时的,因为编译期编译器不知道并且没办法确定该去调用哪个方法,JVM会在代码运行的时候作出决定。
方法重载的原则
- 方法名称必须相同
- 参数列表必须不同(个数不同、或类型不同、参数类型排列顺喜怒不同等)
- 方法的返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
- 重载是发生在编译时的,因为编译器可以根据参数的类型来选择使用哪个方法
Java中支持多继承嘛?
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)
但是Java中的接口支持多继承,即一个子接口可以有多个父接口接口和抽象类的区别是什么
从设计层面来说:- 抽象是对类的抽象,是一种模板设计
- 接口是行为的抽象,是一种行为的规范
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
- 接口中所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法
- 类可以实现很多个接口,但是只能继承一个抽象类
- 类可以不实现抽象类和接口声明的所有方法,当然在这种情况下,类也必须得声明成是抽象的
- 抽象类可以在不提供接口方法实现的情况下实现接口
- Java接口中声明的变量默认都是final的,抽象类可以包含非final的变量
- Java接口中的成员方法默认是publish的,抽象类的成员方法可以是private、protected或者是public
- 接口是绝对抽象的,不可以被实例化。抽象类也可以不被实例化,但是,如果它包含了main方法的话是可以被调用的
什么是值传递和引用传递
值传递是对基本型变量而言,传递的是该变量的一个副本,改变副本不影响原变量
引用传递一般是对于对象型变量而已的,传递的是该对象地址的一个副本,并不是原对象本身。
一般认为Java内的传递都是值传递,Java中实例对象的传递是引用传递进程和线程的区别是什么
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程,线程又叫做轻量级进程。
线程的划分小于进程,线程隶属于进程。进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能占有这些资源的。进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。进程在执行的过程中,包含比较固定的入口,执行顺序、出口,而线程的这些过程会被应用程序所控制创建线程有几种不同的方式?
有4种方式可以用来创建线程:- 继承Thread类(真正意义上的线程类),是Runnable接口的实现
- 实现Runnable接口,并重写里面的run方法
- 应用程序可以使用Executor框架来创建线程池
使用Executor接口中的ThreadPoolExecutor来创建线程池 - 实现Callable接口,重写call方法,有返回值
实现Runnable接口这种方式更受欢迎:
- 避免单继承的局限,一个类可以继承多个接口
- 适合于资源的共享
2018/03/31 00:28 未完待续…