JDK的三大版本
javaSE :桌面端开发
JavaEE :企业级开发
JavaME:嵌入式开发
JVM , JRE ,JDK 的关系
JVM是Java虚拟机
JRE是Java运行环境
JDK是开发人员提供的开发工具
什么是跨平台?原理是什么
Java语言的程序经过一次编译后,可以在多个平台运行
原理是 :Java程序是通过Java虚拟机在平台上运行的,只要该系统可以安装上对应的虚拟机,就可以运行
Java语言有哪些特点
1.简单易学因为是在C语言的基础上升级
2.面向对象四大特性 :封装,继承,多态,抽象
3.可以跨平台,支持网络编程,支持多线程
4.健壮性(强类型机制,异常处理,垃圾自动回收)
5.安全性高
什么是字节码?采用字节码的最大好处是什么?
字节码是Java源代码经过JVM编译产生的.class文件,不面向任何特定的处理器,只面向虚拟机
Java文件通过字节码的方式解决了传统解释性语言效率低的问题,同时又保证了Java语言可移植性的特点,因此面向其他系统时不需要多编译一次
运行过程:Java源代码通过编译器,编译成.class文件,再被jvm的解释器进行解释成机器可执行的二进制机器码,最终在机器上执行的是机器码,然后程序执行
Java和C++的区别
都是面向对象的语言,都有封装继承多态,但Java是纯粹的面向对象语言也更高级,C++是既面向过程又面向对象,Java不提供指针访问内存,因此也更安全,C++语言支持多继承,Java虽然不支持多继承 ,但可以实现多个接口,Java内存的管理机制不需要手动释放
java数据类型
基本类型有8个: 整数类型 byte、short、int、long 浮点数类型 float、double 字符型 char 布尔类型 boolean 引用类型包括三种: 类 Class 接口 Interface 数组 Array
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
编码
Java语言采用Unicode为每一个字符设置了唯一的值因此在任何平台都能使用
注释
/** 单行注释
*
*
*/ 文档注释
/*
*
*
*/多行注释
行内注释/**/
访问修饰符
public
protected 同包 子包能用
default(不写)同包 使用
private 当前类
运算符
&与运算,不能短路
&&与运算,可以短路
关键字
final:被final修饰的类不能被继承,被修饰的方法不能被子类重写,是最终方法,被修饰的变量会变成常量,只能修改一次
final finally finalize:三者没有关系,finally是Try catch,finalize是object的一个方法,一般由垃圾回收期调用
this关键字,代表对象本身,理解为指向对象本身的一个指针
三个用法
(1) this.属性名
this调用本类中的属性,也就是类中的成员变量; (2) this.方法名
this调用本类中的其他方法; (3) this() 用于访问构造方法
this调用本类中的其他构造方法,调用时要放在构造方法的首行。
【1】 super.xxx; xxx可以是类的属性。 例如super.name;即从子类中获取父类name属性的值
【2】 super.xxx(); xxx()可以是类中的方法名。 super.xxx();的意义是直接访问父类中的xxx()方法并调用
【3】 super(); 此方法意义是直接调用父类的构造函数。 super(无参/有参)即调用父类中的某个构造方法,括号里的内容根据你所调用的某个构造函数的变化而改变
static :有一个块的概念,静态代码块程序一执行就加载,只会加载一次,所以把只需要初始化一次的属性放到代码块里,就可以提高性能
Java面向对象设计
面向对象和面向过程的区别是什么:面向过程的优点是性能高于面向对象,因为类在调用时需要实例化,因此需要更多的内存资源
面向对象的优点:易维护,易复用,易扩展 原因:面向对象有 封装 继承 多态等特性,因此可以设计出低耦合的系统
面向对象的底层其实依然是面向过程的,因为底层的类封装的方法是面向过程的,把面向过程抽象成类,然后封装从而方便使用,这就是面向对象
Java三大特性有哪些方面
抽象:
将一类对象的共同特征总结出来构造类的过程,包括了数据抽象和行为抽象两方面,抽象只关注对象有哪些属性和行为,却不关注这些细节
封装:
隐藏实现细节,将类的某些信息隐藏在类的内部,不允许外部程序直接访问,并通过该类提供的方法来实现对隐藏信息的操作和访问
继承:使用已存在的类作为基类,子类继承基类,能够方便复用方法 1.子类拥有父类的非private的属性和方法 2.子类可以拥有自己属性和方法 3.子类可以用自己的方法实现父类的方法,也就是重写
多态:
多态是同一个行为具有多个不同表现形式或形态的能力。两种方式可以实现多态1:继承 2:接口 必要条件:1.继承 2.重写 3.父类引用指向子类对象(向上转型)
重写:
是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变
重载(overloading)
是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
重载和重写在多态中的区别:
重载是编译时的多态性,而重写是运行时的多态性
抽象类和接口的对比:
根本区别:
抽象类是对类的抽象,是一种设计的模板模式,接口是行为的抽象,是一种行为的规范
相同点:
1.接口和抽象类都不能被实例化(不能被new)
2.都位于继承的顶端,都用于被其他类继承和实现,
3.都包含了抽象方法,其子类都必须覆盖这些抽象方法
不同点:
1.抽象类是通过abstract修饰 ,接口是interface
-
抽象类是extends ,接口是 implements
-
抽象类中可以有构造器,接口不能有构造器
-
访问修饰符不同,抽象类的方法可以是任意的访问修饰符,接口默认是public 也不允许private 和 protected
-
一个类只能继承一个抽象类,一个类可以实现多个接口
-
字段声明不同,抽象类字段声明可以是任意的,接口默认是 static 和 final 修饰
拓展:Java8中的接口引入了默认的方法和静态方法 ,其目的是为了减少抽象类和接口之间的差异
普通类和抽象类的区别:
1.普通类不包含抽象方法,抽象类可以包含抽象方法,也可以只有普通方法没有抽象方法
2.抽象类不能实例化,普通类可以实例化
对象实例和对象引用有何不同:
对象的引用会指向对象的实例,对象的引用放在内存的栈内存中,一个对象的引用可以指向一个或0个对象,一个对象有N个对象指向他,对象实例放在堆内存中
成员变量与局部变量的区别:
1.作用域不同
2.存储位置不同 成员变量随着对象的创建而存在,随着对象的消失而消失,存在堆中 。 局部变量在方法被调用时存在,存在于栈中,语句结束后变量被自动释放。
3.生命周期不同:成员变量生命周期更长,对象创建就存在,对象消失而消失,局部变量方法调用时才存在,程序结束就自动释放
4.初始值不同:成员变量有初始值 例如int = 0,而局部变量没有初始值
无参构造器的作用:
首先,没有自己写构造方法时,系统自动创建一个,写了就不创建,所以Java程序执行子类构造方法前会调用父类的构造方法,帮助子类完成初始化,如果没有用super调用父类特定的构造方法,那么就会调用父类 无参构造器;
一个类的构造方法作用是什么?
完成类的初始化工作,也就是为了完成初始化的
若一个类没有声明构造方法,该类能正确执行吗?为什么?
可以,因为类中默认了无参的构造方法
构造方法有哪些特性?
名字与类名相同。
2.没有返回值,但不能用 void 声明构造函数。
3.生成类的对象时自动执行,无需调用。
静态变量和实例变量的区别:
静态变量用static修饰,属于内存中的一份。实例变量每次创建对象都会给每个对象分配内存空间,实例变量是属于实例对象的,在内存中创建几次对象就有几个成员变量
内部类分类有哪些:
1.成员内部类 :互相调用对象或方法都可以
2.局部内部类 :方法里面定义的类
3.匿名内部类 :它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类
4.静态内部类:被static修饰,不能调用非static对象和方法 ,其他类可以通过创建实例化对象的方式调用静态内部类
实例化方式 : 外部类.内部类 对象 =new 外部类.内部类();
内部类的优点:
内部类不被同包其他类可见,有很好的封装性,匿名内部类方便回调函数
内部类使用场景:几个类的逻辑关系很强,同时想对外隐藏这些类;多线程 ;不需要被其他的类使用时
构造器是否能被重写?不能,因为没法继承所以就不能重写,只能被子类调用; 可以被重载
==和equals :
==:引用数据类型比较内存地址, 基本数据类型比较值
equals:当类没有覆盖equals方法时和==一样, 当类覆盖了equals方法时(String就重写了equals方法) 可以比较具体内容
hashCode与equals的区别:
(1)同一对象多次调用hashCode()方法,总是返回相同的整型值。
(2)如果a.equals(b),则一定有a.hashCode() 一定等于 b.hashCode()。 (3)如果!a.equals(b),则a.hashCode() 不一定等于 b.hashCode()。此时如果a.hashCode() 总是不等于 b.hashCode(),会提高hashtables的性能。
(4)a.hashCode()==b.hashCode() 则 a.equals(b)可真可假
(5)a.hashCode()!= b.hashCode() 则 a.equals(b)为假。
对象相等与指向他们的引用相等两者有什么不同:
对象相等比的是内存中存放的内容是否相等,引用相等比较他们指向的内存地址是否相等
JDK中常用的包有哪些:
lang ,IO ,NIO ,Java.net ,util ,Java.sql