JDK提供的编译器是什么?
javac.exe
标识符的概念是什么?
标识符的概念:给类、接口、方法、变量取名字时使用到的字符序列
组成部分:大小写字母、数字、_、$、中文
例如:
注意事项:
- 不能以数字开头 譬如:123name 就是不合法的
- 区分大小写
但是可以包含关键字和保留字。 如:不可以使用 void 作为标识符,但是 Myvoid 可以- 不能使用Java关键字 例如: imooc 和 IMooc 是两个不同的标识符
- 不能使用除了$和_以外的特殊符号
- 考虑编码问题,不要使用中文命名
重载和重写的概念:
重载的概念:
理解:方法与方法之间的关系
条件:
- 在同一个类中
- 方法名相同
- 参数列表的个数或者类型不一致
- 与返回值无关
好处是什么?
系统会根据参数类型自动匹配到重载的方法上
重载的示例
//返回两个整数的和
int add(int x,int y){
return x+y;
}
//返回三个整数的和
int add(int x,int y,int z){
return x+y+z;
}
//返回两个小数的和
double add(double x,double y){
return x+y;
}
重写的概念:
理解: 在子类中可以根据需要对从父类中继承来的方法进行改造,也称 为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
重写的特点:
1.子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表 。 2.子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型 (返回类型为类)。 3.子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限 。 4.子类不能重写父类中声明为private权限的方法 。 5.子类方法抛出的异常不能大于父类被重写方法的异常 (父类异常的子类)。
重写的示例
public class Person{
public String name;
public int age;
public String getInfo(){
return “Name:” + name + “\n” + “age:” + age;
}
}
public class Student extends Person{
public String school;
public String getInfo(){
return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school;
}
public static void main(String[] args){
Person p1=new Person();
//调用Person的getInfo方法
p1.getInfo();
Student s1 = new Student();
//调用Student的getInfo方法
s1.getInfo();
}
}
Java中重写和重载的区别:
重写:overriding,是指在继承的情况下,子类中定义了与父类中具有相同型构的新方法,也就是子类重写了父类的方法。 重载:overloading,是在同一个类中,定义了一个以上具有相同名称,但是有着不同型构的方法,在同一个类中是不允许定义多于一个具有相同型构的方法的。 构造器也是可以重载的,实际上,构造器就是一个方法,构造器的名称就是方法的名称。
数组的初始化
两种:
静态初始化、动态初始化
静态初始化:
数据由程序员指定,长度由系统自动分配 -- String[] name = {“aaa”,”bbb”,”ccc”};
动态初始化:
长度由程序员指定,数据由系统自动分配 -- String[] names = new String[3];
默认值类型:
整数类型 - 0 浮点类型 - 0.0 字符类型 - ‘ ’ 布尔类型 - false
引用类型 - null
关于Java程序结构特点描述:
一个Java程序由一个或多个文件组成,每个文件中可以定义一个或多个类,每个类由若干个方法和变量组成。
Java程序中声明有public类时,则Java程序文件名必须与public类的类名相同,并区分大小写,扩展名为.java。
组成Java程序的多个类中,有且仅有一个主类。
一个.java文件中定义多个类时,不允许其中声明多个public类。
位运算
理解:十进制数据转换为二进制数据,再做运算
&:同位比较,两者为1,结果才为1
|:同位比较,两者有1,结果就为1
^:同位比较,两者相同为0,不同为1
<<:整体向左移动n位,就用n个0补位
\>>:整体向右移动n位,就用n个最高位(符号位)补位
\>>> :整体向右移动n位,就用n个0补位
例题:变量float f1,f2 = 8.0F
变量f1没有被初始化,f2被初始化为8.0
switch的数据类型:
byte、short、int、char、字符串(JDK1.7)、枚举(JDK1.5)
构造方法的概念:
与类名相同且没有返回项的方法
作用:
创建对象、初始化数据
全局变量:
成员变量和静态变量
局部变量:
方法内的变量
final含义:最终的
修饰类:类不能被继承
修饰方法:方法不能被重写
修饰变量:常量
填空题
- 控制类中成员的访问权限的修饰符有( public ),( private),( protected ),( 默认的 )四种
- 集合的顶级接口有两个,分别是( Collection ),( Map ),单值集合常见的子类有( ArrayList),(LinkedList ),( Vector ) ,键值对集合常见的子类有( HashMap ),( TreeMap ),( ConcurrentHashMap )。
- java注解中有两个常用的元注解是( @Target )和( @Retention )。
- 多态常见的两种使用方式是( 类的多态 )和(接口的多态 )。
- java中所有类的父类是(Object ),请任意列举出这个类的三个方法:( hashCode ),( equals ),( toString )。
简答题
1.论述面向对象的三大特征及其使用场景?
封装、继承、多态
封装:一般类的属性都必须封装(私有化属性+get/set),保证了属性的安全性
继承:多个类有共同的属性和方法,就抽取出放在父类中,减少代码的冗余,增加了程序的复杂度和可维护性
多态:编写方法,参数尽可能选择接口或者父类类型,提高了程序的可扩展性
2.多态的优缺点?
优点:提高了程序的可扩展性,不违反OCP原则
缺点:不能使用子类独有的属性和方法
3.抽象类和接口的区别?
抽象类:单继承,抽象类中可以有属性、构造方法、成员方法、静态方法、抽象方法
接口:多实现,接口中只能有静态常量、抽象方法、静态方法(JDK1.8)、默认方法(JDK1.8)
4.Java类加载机制的步骤?
含义:JVM会将该类的class文件加载到方法区中的过程
什么时候JVM会将该类的class文件加载到方法区中?
- 第一次创建该类的对象
- 第一次调用该类的静态方法
- 第一次获取该类的class对象 -- Class<?> clazz = Class.forName("com.qf.test01.A");
class文件加载几次? 1次
class文件里的内容有什么?
class文件中包含了该类所有的信息,属性、构造方法、成员方法、静态方法、抽象方法...
class对象的作用是什么?
class对象作为class文件的访问入口
加载步骤:
- 加载(获取类的全限定名生成字节流,读取到方法区中,并在堆中创建该类的class对象)
- 连接
2.1验证(验证class文件是否合法 - 是否符合class文件规范、语法/数据、符号引用是否正确)
2.2 准备(类变量开辟空间,给类变量赋系统初始值,但是静态常量直接赋值)
2.3 解析(符号引用,转换为直接引用) - 初始化(将代码中的静态值赋值给静态变量)
5.Switch的表达式类型,底层原理?
表达式类型:byte、short、int、char、枚举(JDK1.5)、字符串(JDK1.7)
底层原理:
byte、short自动向上转型成int
char获取对应的Unicode码
枚举获取的是对象编号
字符串获取的hash码+equals
总结:表达式的类型最终都会转换为int,去做识别
6. 内部类分类及区别?
成员内部类:内部类可以调动外部类所有的属性
静态内部类:内部类只能调用外部类的静态属性
接口内部类:相当于静态内部类
局部内部类:方法中声明的类,可以调用外部类的方法中的局部变量,局部变量自动使用final修饰(JDK1.8)
匿名内部类:抽象类子类的对象或接口实现类的对象只使用一次,就使用匿名内部类去替代
7. ArrayList与Vector的区别?
ArrayList:线程不安全,扩容机制(原来的1.5倍)
Vector:线程安全,扩容机制(判断容量增量,如果容量增量为0,原来长度的2倍;如果容量增量不为0,原来长度+容量增量)
8.LinkedList删除元素的过程
- 判断元素是否为空,如果为空,判断条件使用元素==null,如果不为空,判断条件使用equals,直到找到该元素或者遍历到最后一个元素
- 加入A、B、C三个节点,删除的是B节点,通过B节点找到A节点,将A节点下一个位置指向C节点,通过B节点找到C节点,将C节点上一个位置指向A节点 -- 断链
9. 什么叫做Hash碰撞
多个元素的hash值一样造成Hash碰撞,将数据存入到HashMap或者ConcurrentHashMap,一般会重写Key元素所属类的hashCode()和equals(),从而降低Hash碰撞,因为hash碰撞会损耗性能,因为HashMap或ConcurrentHashMap的数据结构为一维数组+单向链表,数据直接存在数组中的效率胜过存在单向链表中
10. JDK1.7 和 1.8下HashMap的区别?
HashMap - JDK1.7:一维数组+单向链表,头插法
HashMap - JDK1.8:一维数组+单向链表+红黑树,尾插法,计算hash值高16位^低16位
JDK1.8的HashMap什么时候做到一维数组+单向链表 和 一维数组 + 红黑树的转换?
一维数组+单向链表 --> 一维数组 + 红黑树:数组长度大于64,链表长度大于8
一维数组 + 红黑树 --> 一维数组+单向链表:红黑树节店小于6
JDK1.8的HashMap数据结构为什么加上了红黑树?
提高了查询效率
11. 论述多线程的生命周期?
![img](file:///C:\Users\17866\AppData\Local\Temp\ksohtml2160\wps1.jpg)
12. Java线程安全的几种方式?
- synchronized
- lock
15.线程池的运行流程?
- 核心线程
- 任务队列
- 普通线程
- 拒绝策略
16创建自定义线程池的参数有哪些?
核心线程数、最大线程数、任务队列、线程工厂、闲置时间、时间单位、拒绝策略
17.TCP连接机制和断连机制是什么?
三次握手
四次挥手
18. 异常的处理机制是什么?
- 程序中出现的异常,会创建异常对象交给JVM -- 抛出异常
- JVM会循环是否有处理异常的代码
2.1 有 - 就将异常对象交给其处理 -- 捕获异常+处理异常
2.2 没有 - 程序就终止运行
19. 什么叫做序列化接口?有什么作用?
Serializable为序列化接口
ObjecOutputStream将对象写入到文件,该对象所属的类必须实现序列化接口,序列化接口作为写入文件的凭证
钝化/序列化:将程序中的对象写入到文件中
活化/反序列化:将文件中的对象读取到程序中
20. 字节流和字符流的区别?
字节流以字节为单位去传输数据
字符流以字符为单位去传输数据,字符流底层由字节流+编译器实现,编译器会根据编码格式去操作数据
标签:知识点,27,--,重写,public,子类,父类,方法,class From: https://blog.51cto.com/u_16154651/6567325