java书写有哪些易错点,java基础知识易错点总结

1.关于多态编译运行的时候看什么:

class Fu {

int num = 4;

void show() {

System.out.println("Fu show num");

}

}

class Zi extends Fu {

int num = 5;

void show() {

System.out.println("Zi show num");

}

}

class Demo {

public static void main(String[] args) {

Fu f = new Zi();

f.num  // 4

f.show(); //Zi show num

}

}

得出结论:

①.多态成员变量

当子父类中出现同名的成员变量时,多态调用该变量时:

编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。

运行时期:也是调用引用型变量所属的类中的成员变量。

简单记:编译和运行都参考等号的左边。编译运行看左边。

②.多态成员方法

编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。

运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。

简而言之:编译看左边,运行看右边。

2.关于构造方法

构造方法,如果没有明写构造方法,则默认会有无参构造方法,若出现构造方法,则系统默认的无参构造方法自动省略,如果有子类继承了父类,①.总体来说,子类构造方法第一行必须要super(参数...)(第一行是父类构造方法),若父类只有无参构造方法(默认的,或者是自己重新的),可以不写,省略,默认是存在的。②若父类含有无参构造,则子类可以不写构造方法(默认还是有无参构造方法的),若父类没有无参构造方法,则子类必须写构造方法(可含参数,也可不含参数),且第一行必须写super(参数)。

3.关于代码块的执行顺序:

public class Fu {

int num =10;

static{

System.out.println("开始执行父类静态代码块");

}

{

System.out.println("开始执行父类代码块");

}

public Fu(/*int x*/){

System.out.println("开始执行父类构造方法");

}

public Fu(int x,int y){

System.out.println("两个参数的父类构造方法");

}

public void show(){

{

int x=1;

System.out.println("父类局部代码块X:"+x);

}

int x =99;

System.out.println("父类局部代码块外x:"+x);

}

}

public class Zi extends Fu {

int num =5;

static{

System.out.println("子类静态代码块");

}

{

System.out.println("子类构造代码块");

}

public Zi(){

System.out.println("子类构造方法");

}

@Override

public void show() {

{

int x=1;

System.out.println("子类局部代码块X:"+x);

}

int x =99;

System.out.println("子类局部代码块外x:"+x);

}

}

public class CodeBlockTest {

public static void main(String[] args) {

Fu f = new Zi();

System.out.println(f.num);

}

}

输出结果:

开始执行父类静态代码块

子类静态代码块

开始执行父类代码块

开始执行父类构造方法

子类构造代码块

子类构造方法

10

得出结论:

执行顺序:静态代码块>构造代码块>构造方法>局部代码块

如果子类继承父类,则①先执行父类静态代码块②子类静态代码块③父类构造代码块④父类构造方法④子类构造代码块⑤子类构造方法。

3.关于String

字符串是常量,它的值在创建之后不能修改:原码如下,用final修饰不可修改

public final class String

implements java.io.Serializable, Comparable, CharSequence{}

https://www.cnblogs.com/zhangyinhua/p/7689974.html

https://blog.csdn.net/qq_34490018/article/details/82110578

4.关于数据结构:

堆栈,采用该结构的集合,对元素的存取有如下的特点:

先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。

栈的入口、出口的都是栈的顶端位置

压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

b207327250be26275150f93eec14b78d.png

队列,采用该结构的集合,对元素的存取有如下的特点:

1195a47adb78ce7b1500491559cbca90.png

数组,采用该结构的集合,对元素的存取有如下的特点:

先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,安检。排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查。

队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。

查找元素快:通过索引,可以快速访问指定位置的元素

增删元素慢:

指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。如下图

指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。如下图

0b97251ee8c0722e86b6288238fbf691.png

链表,采用该结构的集合,对元素的存取有如下的特点:

多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。

查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

增删元素快:

增加元素:操作如左图,只需要修改连接下个元素的地址即可。

删除元素:操作如右图,只需要修改连接下个元素的地址即可。

5d7a782daf9f5e46b89a5edbdc447005.png

哈希表结构(实际上是数组+链表)

①首先会根据存放类对象的hashCode值判断是否有相同的对象,若相同,判断equals方法,若还不相同,将该对象放在和已有类对象hashCode相同的链表上面,若没有相同hashCode对象,则放在下一个数组位置,若相同则重复,不能存放

84728757ec48e5e3d13b4387cddffaa1.png

5.关于集合

List集合:有索引,可以存放重复的元素,可以用for循环遍历

ArrayList:底层是数组,查询和遍历速度快,增删的时候需要重复创建数组速度较慢,线程不安全。

LinkedList:底层是链表,查询,遍历慢,增删速度快,线程不安全。

Vector:底层是数组,线程安全;

Set集合:没有索引,不可以方重复的元素(需要根据hashCode,和equals方法,判断元素是否重复),只能用迭代器和增强for循环遍历

HashSet:底层数据结构是哈希表相当于数组加链表,没有索引,无序,线程不安全,(要保证元素的唯一需要重写hashCode和equals方法),其实是一个HashMap;构造方法源码如下:

e3d4770e8f73708b3174c8ba20f6ede8.png LinkedHashSet:底层是哈希表+链表,没有索引,有序,线程不安全

Map集合:

HashMap:

是Map集合的子集合

底层采用哈希表结构

HashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。

不能保证元素存与取的顺序完全一致,线程不安全,可以存放null键,null值

具体数据结构可以参考视频:https://pan.baidu.com/s/1Vs5sQN7IlD_XnbvMrNIq4Q

LinkedHashMap:

是HashMap集合的子集合

底层采用哈希表+链表结构

LinkedHashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。

HashTable基本和hashMap相同,区别,既不能方null键,又不能放null值,线程安全。

V put(K key, V value)  把指定的键与指定的值添加到Map集合中:对于put方法,当已经存入相同键的数据的时候,会覆盖,返回被覆盖的value,否则,没有存入相同键的数据的时候,返回null

6.关于可变参数:同一个方法中只能有一个可变参数,并且该可变参数只能放在方法参数的最后一个

//JDK1.5之后写法

public int add(int...arr){

int sum = 0;

for (int i = 0; i < arr.length; i++) {

sum += arr[i];

}

return sum;

}

6.关于异常,以及try/catch块中各种复杂头疼的地方:请参阅:http://www.cnblogs.com/lulipro/p/7504267.html

7.关于分布式和集群的概念:

多台服务器跑的都是一套完整的代码,这就叫集群。

多台服务器合起来跑的才是一套完整代码,这就叫分布式。

未完待续........

基础知识可参考:https://blog.csdn.net/Frank_Adam/article/details/79487873,https://blog.csdn.net/qq_33824460/article/details/57943966该博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值