Bootstrap

Java常见易错知识点总结

目录

1.内部类

1.成员内部类

2.局部内部类

3.匿名内部类

4.内部静态类

2.Yield

3.Request范围内的几个方法

4.Socket编程

5.接口和抽象类

抽象类

接口

6.Volatile

7.RMI(远程通讯手段) 

8. Error 和 Exception 区别

9.构造方法的特点

 10.静态调用

11.JVM内存五大区域

 12.运行时常量池

13.八大排序的效率

14.Default和Protected 

15.类方法与实例方法

16.自动类型转换规则

 17.单例模式

一、单例模式的定义

二、单例模式的设计要素

三、单例模式的6种实现及各实现的优缺点

(一)懒汉式(线程不安全)

(二)饿汉式(线程安全)

(三)懒汉式(线程安全)

(四)双重检查锁实现(线程安全)

(五)静态内部类实现(线程安全)

(六)枚举类实现(线程安全)

四、单例模式的应用场景

18.volatile与synchronized的区别 


1.内部类

        在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。

1.成员内部类

(1)该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

(2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员

内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:【外部类.this.成员变量  或  外部类.this.成员方法】;

(3)在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问;

(4)成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;

(5)内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。

2.局部内部类

(1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;

(2)局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

3.匿名内部类

(1)一般使用匿名内部类的方法来编写事件监听代码;

(2)匿名内部类是不能有访问修饰符和static修饰符的;

(3)匿名内部类是唯一一种没有构造器的类

(4)匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

4.内部静态类

(1)静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似;

(2)不能使用外部类的非static成员变量或者方法。

2.Yield

Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

3.Request范围内的几个方法

request.getAttribute()方法返回request范围内存在的对象

request.getParameter()方法是获取http提交过来的数据。

getAttribute是返回对象。

getParameter返回字符串。

4.Socket编程

5.接口和抽象类

抽象类

特点:

1.抽象类中可以构造方法

2.抽象类中可以存在普通属性,方法,静态属性和方法。

3.抽象类中可以存在抽象方法。

4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。

5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。

接口

1.在接口中只有方法的声明,没有方法体。

2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上

public static final 

3.在接口中的方法,永远都被public来修饰。

4.接口中没有构造方法,也不能实例化接口的对象。

5.接口可以实现多继承

6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法

7.则实现类定义为抽象类。

6.Volatile

volatile到底做了什么:

  • 禁止了指令重排
  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
  • 不保证原子性(线程不安全)

synchronized关键字和volatile关键字比较:

  • volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
  • 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞
  • volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性

7.RMI(远程通讯手段) 

  协议:TCP/IP

8. Error 和 Exception 区别

     Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。 Throwable 类有两个重要的子类 Exception (异常)和 Error (错误)。
    Exception 和 Error 二者都是 Java 异常处理的重要子类,各自都包含大量子类。
    Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获,通常遇到这种错误,应对
其进行处理,使应用程序可以继续正常运行。 Exception 又可以分为运行时异常
(RuntimeException, 又叫非受检查异常)和非运行时异常(又叫受检查异常) 。
    Error : Error 属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获 。例如,系统崩
溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,一旦这类错误发生,通常应用程序
会被终止,仅靠应用程序本身无法恢复。

9.构造方法的特点

(1)构造方法的方法名必须与类名相同。

(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。

(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。

(4)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。

(5)构造方法可以重载,以参数的个数,类型,顺序。

 10.静态调用

     静态成员和静态方法,可以直接通过类名进行调用;其他的成员和方法则需要进行实例化成对象之后,通过对象来调用。

11.JVM内存五大区域

 12.运行时常量池

  为了避免歧义,以下提及的JVM,是Hotspot

  方法区是什么?
        方法区是广义上的概念,是一个定义、标准,可以理解为Java中的接口,在Jdk6、7方法区的实   现  叫永久代;Jdk8之后方法区的实现叫元空间,并从JVM内存中移除,放到了直接内存中;
 方法区是被所有方法线程共享的一块内存区域.

 运行时常量池是什么?
 运行时常量池是每一个类或接口的常量池的运行时表示形式

 具体体现就是在Java编译后生成的.cl

;