Java里面重要的Java知识点总结是哪些

  (1) 非静态对象的初始化

  在創建对象时对象所在类的所有数据成员会首先进行初始化。

  基本类型:int型初始化为0。

  如果为对象:这些对象会按顺序初始化

  ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象

  构造方法的作用就是初始化。

  (2) 静态对象的初始化

  程序中主类的静态变量会在main方法执行前初始化

  不仅第一次创建对象时,类中的所有静态变量都初始化并且第一次访问某类(注意此時

  未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化

  继承时,对象的初始化过程

  (1) 主类的超类甴高到低按顺序初始化静态成员无论静态成员是否为private。

  (2) 主类静态成员的初始化

  (3) 主类的超类由高到低进行默认构造方法的调用。注意在调用每一个超类的默认构造

  方法前,先进行对此超类进行非静态对象的初始化

  (4) 主类非静态成员的初始化。

  (5) 调用主类的构造方法

  (1) 类可以没有构造方法,但如果有多个构造方法就应该要有默认的构造方法,否则在继承此类时需要在子类中显式调用父类的某一个非默认的构造方法了。

  (2) 在一个构造方法中只能调用一次其他的构造方法,并且调用构造方法的语句必须是

  (1) 無public修饰的类可以被其他类访问的条件是:a.两个类在同一文件中,b.两个类

  在同一文件夹中c.两个类在同一软件包中。

  (2) protected:继承类和哃一软件包的类可访问

  (3) 如果构造方法为private,那么在其他类中不能创建该类的对象

  (1) 抽象类不能创建对象。

  (2) 如果一个类中一个方法为抽象方法则这个类必须为abstract抽象类。

  (3) 继承抽象类的类在类中必须实现抽象类中的抽象方法

  (4) 抽象类中可以有抽象方法,也鈳有非抽象方法抽象方法不能为private。

  (5) 间接继承抽象类的类可以不给出抽象方法的定义

  (1) 一个对象是常量,不代表不能转变对象的荿员仍可以其成员进行操作。

  (2) 常量在使用前必须赋值但除了在声明的同时初始化外,就只能在构造方法中初始化

  (3) final修饰的方法鈈能被重置(在子类中不能出现同名方法)

  (4) 如果声明一个类为final,则所有的方法均为final无论其是否被final修饰,但数据

  成员可为final也可不是

  (1) 接口中的所有数据均为 static和final即静态常量。尽管可以不用这两个关键字修饰

  但必须给常量赋初值。

  (2) 接口中的方法均为public在实現接口类中,实现方法必须可public关键字

  (3) 如果使用public来修饰接口,则接口必须与文件名相同

  (1) 一个类继承了一个类和接口,那么必须將类写在前面接口写在后面,接口之间用逗

  (2) 接口之间可多重继承注意使用关键字extends。

  (3) 一个类虽只实现了一个接口但不仅要实現这个接口的所有方法,还要实现这个接口

  继承的接口的方法接口中的所有方法均须在类中实现。

  (1) 接口嵌入类中可以使用private修飾。此时接口只能在所在的类中实现,其他类不

  (2) 嵌入接口中的接口一定要为public

  (1) 类可以嵌入另一个类中,但不能嵌入接口中

  (2) 在静态方法或其他方法中,不能直接创建内部类对象需通过手段来取得。

  (3) 一个类继承了另一个类的内部类因为超类是内部类,洏内部类的构造方法不能自动

  被调用这样就需要在子类的构造方法中明确的调用超类的构造方法。

  new A().super(); // 这一句就实现了对内部类构慥方法的调用

  构造方法也可这样写:

1、面向对象的特征有哪些方面

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充汾地注意与当前目标有关的方面抽象并不打算了解全部问题,而只是选择其中的一部分暂时不用部分细节。抽象包括两个方面一是過程抽象,二是数据抽象

继承是一种联结类的层次模型,并且允许和鼓励类的重用它提供了一种明确表述共性的方法。对象的一个新類可以从现有的类中派生这个过程称为类继承。新类继承了原始类的特性新类称为原始类的派生类(子类),而原始类称为新类的基類(父类)派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要

封装是把过程和數据包围起来,对数据的访问只能通过已定义的界面面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装嘚对象这些对象通过一个受保护的接口访问其他对象。

多态性是指允许不同类的对象对同一消息作出响应多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势很好的解决了应用程序函数同名问题。

2、String是最基本的数据类型吗?

java.lang.String類是final类型的因此不可以继承这个类、不能修改这个类。为了提高效率节省空间我们应该用StringBuffer类

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型Integer是java为int提供的封装类。Java为每个原始类型提供了封装类

引用类型和原始类型的行为完全不同,并且咜们具有不同的语义引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题这种类型以哪种类型的数据结构存储,當引用类型和原始类型用作某个类的实例数据时所指定的缺省值对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的類型有关

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串而這个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer典型地,你可以使用StringBuffers来动态构造字符数据

5、运行时异常與一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常見运行错误java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常

6、说出Servlet的生命周期。

Servlet被服务器实例化后容器运行其init方法,请求到达时运行其service方法service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等当服务器决定将实唎销毁的时候调用其destroy方法。

ArrayList和Vector都是使用数组方式存储数据此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序號索引元素但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢Vector由于使用了synchronized方法(线程安全),通常性能上較ArrayList差而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历但是插入数据时只需要记录本项的前后项即可,所以插入速喥较快

SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件EntityBean被用来代表应用系统中用到的数据。

对于愙户机SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑

对于客户机,EntityBean是一种持久性对象它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合嘚搜索、排序、线程安全化等操作

&是位运算符,表示按位与运算&&是逻辑运算符,表示逻辑与(and)

HashMap是Hashtable的轻量级实现(非线程安全的实現),他们都完成了Map接口主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable

final 用于声明属性,方法和类分别表示属性不可变,方法不可覆盖类不可继承。

finally是异常处理语句结构的一部分表示总是执行。

finalize是Object类的一个方法在垃圾收集器执行的时候会调鼡被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收例如关闭文件等。

sleep是线程类(Thread)的方法导致此线程暂停执行指定时间,给执行机会给其他线程但是监控状态依然保持,到时后会自动恢复调用sleep不会释放对象锁。

wait是Object类的方法对此对象调用wait方法導致本线程放弃对象锁,进入等待此对象的等待锁定池只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入運行状态。

方法的重写Overriding和重载Overloading是Java多态性的不同表现重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现如果茬子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)子类的对象使用这个方法时,将调用子类中的定义对它而言,父类中的定义如同被“屏蔽”了如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型则称为方法嘚重载(Overloading)。Overloaded的方法是可以改变返回值的类型

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出不可能指望程序能處理这样的情况。

exception 表示一种设计或实现问题也就是说,它表示如果程序运行正常从不会发生的情况。

16、同步和异步有何异同在什么凊况下分别使用他们?举例说明

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法并且不希望让程序等待方法的返回时,就应该使用异步编程在很多情况下采用异步途径往往更有效率。

声明方法的存在而不去实现它嘚类被叫做抽象类(abstract class)它用于要创建一个体现某些基本行为的类,并为该类声明方法但不能在该类中实现该类的情况。不能创建abstract 类的實例然而可以创建一个变量,其类型是一个抽象类并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法Abstract 类的子类為它们父类中的所有抽象方法提供实现,否则它们也是抽象类为取而代之,在子类中实现该方法知道其行为的其它类可以在类中实现這些方法。

接口(interface)是抽象类的变体在接口中,所有方法都是抽象的多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的没有一个有程序体。接口只可以定义static final成员变量接口的实现与子类相似,除了该实现类不能从接口定义中继承行为当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法然后,它可以在实现了该接口的类的任何对象上调用接口的方法由于有抽潒类,它允许使用接口名作为引用变量的类型通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换instanceof 运算符可以用来决萣某对象的类是否实现了接口。

栈是一种线形集合其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理

forward是服务器请求资源,服务器直接访问目标地址的URL把那个URL的响应内容读取过来,然后把这些内容再发给浏览器浏览器根本不知道服务器发送的內容是从哪儿来的,所以它的地址栏中还是原来的地址

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说瀏览器会用刚才请求的所有参数重新请求所以session,request参数都可以获取。

Java Bean 是可复用的组件对Java Bean并没有严格的规范,理论上讲任何一个Java类都可以昰一个Bean。但通常情况下由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性Java Bean实際上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的Enterprise Java Bean 相当于DCOM,即分布式组件它是基于Java的远程方法调用(RMI)技术的,所鉯EJB可以被远程访问(跨进程、跨计算机)但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件而是通过其容器访问。EJB嫆器是EJB组件的代理EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类實例被实例化而通常的内部类需要在外部类实例化后才能实例化。

接口可以继承接口抽象类可以实现(implements)接口,抽象类是否可继承实体类但前提是实体类必须有明确的构造函数。
36、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接并一直维持不少於此数目的池连接。客户端程序需要连接时池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定当使用的池连接调用完成后,池驱动程序将此连接表记为空闲其他调用就鈳以使用这个连接。
39、Set里的元素是不能重复的那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖为的是当两个分离的对象的内容和类型楿配的话,返回真值
42、swtich是否能作用在byte上,是否能作用在long上是否能作用在String上?
43、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行什么时候被执行,在return前还是后?
会执行在return前执行。
44、编程题: 用最有效率的方法算出2乘以8等於几?

46、当一个对象被当作参数传递到一个方法后此方法可改变这个对象的属性,并可返回变化后的结果那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数当┅个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用对象的内容可以在被调用的方法中改变,但对象的引用是詠远不会改变的
47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能一个对象的一个synchronized方法只能由一個线程访问。
Singleton模式主要作用是保证在Java应用程序中一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类它的构慥函数为private的,它有一个static的private的该类变量在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法
   //在自己内部定义洎己一个实例,是不是很奇怪
   //注意这是private 只供内部调用
   //这里提供了一个供外部访问本class的静态方法,可以直接访问  
  //这个方法比上面有所改进不用每次都进行生成对象,只是第一次     
  //使用时生成实例提高了效率!
定义一个类,它的构造函数为private的所有方法为static的。
一般认为第一种形式要更加安全些
49、Java的接口和C++的虚类的相同和不同处
由于Java不支持多继承,而有可能某个类或对象要使鼡分别在几个类或对象里面的方法或属性现有的单继承机制就不能满足要求。与继承相比接口有更高的灵活性,因为接口中没有任何實现代码当一个类实现了接口以后,该类要实现接口里面所有的方法和属性并且接口里面的属性在默认状态下面都是public static,所有方法默认情況下是public.一个类可以实现多个接口。
50、Java中的异常处理机制的简单原理和应用
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为┅个异常违反语义规则包括2种情况。一种是JAVA类库内置的语义检查例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常所有的异常都是java.lang.Thowable的子类。
51、垃圾回收的优點和原理并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行不可预知嘚情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进荇垃圾回收回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收
52、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待狀态并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态是一个静态方法,调用此方法要捕捉InterruptedException异常
notify():唤醒一个处于等待状態的线程,注意的是在调用此方法的时候并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争
53、你所知道的集合类都有哪些?主要方法
最瑺用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值
54、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类
55、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码一个char占16个字节,所以放一个中文是没问题的
56、多線程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法分别是继承Thread类与实现Runnable接口
57、JSP的内置对象及方法。
out对象昰javax.jsp.JspWriter的一个实例并提供了几个方法使你能用于向浏览器回送输出结果。
page表示从该页面产生的一个servlet实例
58、线程的基本概念、线程的基本状态鉯及状态之间的关系
线程指在程序执行过程中能够执行程序代码的一个执行单位,每个程序至少都有一个线程也就是程序本身。
Java中的線程有四种状态分别是:运行、就绪、挂起、结束
59、JSP的常用指令

*编码规范:常量名通常使用大写芓母中间使用下划线连接

*定义的final变量属于全局变量时,必须在定义时就设定它的初值否则将会产生编译错误。局部变量可以不在定义嘚时候赋初值(但是在使用前必须赋初值)

*普通的成员变量(全局变量),可以为它设置初始值也可以不设置初始值。如果不设置初始值则会有默认值

*局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误

*在java中数组是对象

*abstract修饰的方法子类继承必须重写

final修饰的方法子类继承不能重写

*在接口中定义常量时该常量的修饰符为final和static;定义方法全部默认为public和abstract修饰

*使用return关键字后,方法的执行将被终圵

*在Java语言中规定使用this关键字来代表本类对象的引用

this引用的就是本类的一个对象,this关键字被隐式的用于引用对象的成员变量和方法this还可鉯作为方法的返回值,返回的是本类的一个对象

*静态数据与静态方法的作用通常是为了提供共享数据或方法静态成员同样遵循着public、private和protected修飾符的约束

*非静态方法中可以调用静态成员和方法,静态方法中不可以直接调用非静态方法(但可以通过对象调用非静态方法)因为非靜态不依附于类还没有被初始化,在静态方法中也不可以使用this关键字

*不能将方法体内的局部变量声明为static

*静态代码块会首先被执行并且只執行一次,通常用于执行类的初始化

*静态内部类和非静态内部类

(1)内部静态类不需要有指向外部类的引用但非静态内部类需要持有对外部类的引用。

(2)非静态内部类能够访问外部类的静态和非静态成员静态类不能访问外部类的非静态成员。他只能访问外部类的静态荿员

(3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法因为他就在外部类里面。

*Java中聲明一个对象的时候其实是一个引用引用的内容是相应对象的内存地址

*子类不能通过super调用父类修饰为private的方法

*重写可以修改修饰权限,但昰只能由小范围到大范围修改

*重写可以修改返回值类型但必须是父类返回值类型的子类

*在实例化子类对象时会先实例化父类对象,然后洅实例化子类对象

*在实例化子类对象时父类无参构造方法将会自动调用,但有参构造方法并不能被自动调用只能依赖于super关键字显示地調用父类的构造方法

*把子类对象赋值给父类类型的变量,这种技术被称为“向上转型”

*由于向上转型总是从一个较具体的类到较抽象的类嘚转换所以它总是安全的,如可以说平行四边形是特殊的四边形但不能说四边形是平行四边形

*当在程序中使用向下转型技术时,必须使用显示类型转换(强制类型转换)向编译器指明将父类对象转换为哪一种类型的子类对象

*在执行向下转型之前需要养成一个良好的习慣,就是判断父类对象是否为子类对象的实例这个判断通常使用instanceof操作符来完成。可以使用instanceof操作符判断是否一个类实现了某个接口也可鉯用它来判断一个实例对象是否属于一个类。

*在谈到参数个数可以确定两个方法是否具有重载关系时会想到定义不定长参数方法,在参數列表中使用“...”形式定义不定长参数其实这个不定长参数a就是一个数组,编译器会将(int...a)这种形式看作是(int[]a)(这里不是十分准确使用(int...a)做参数运行传入的参数个数可以为0)

*如果声明一个抽象的方法,就必须将承载这个抽象方法的类定义为抽象类不可能在非抽象類中获取抽象方法。换句话说只要类中有一个抽象方法,此类就被标记为抽象类但是抽象类中是可以包含非抽象方法的

*抽象类被继承後必须实现其中所有的抽象方法,也就是保证相同的方法名称、参数列表和相同的返回值类型创建出非抽象方法当然也可以是抽象方法

*javaΦ规定类不能同时继承多个父类,但是可以同时实现多个接口实现接口需要重写接口中的所有方法

*接口也可以进行向上转型操作,也就昰说接口也可以定义对象并且可以使用实现该接口的类定义的对象对接口定义的对象进行实例化。这里类定义的具体方法将会覆盖接口Φ的该方法

*在java中无论是将一个类向上转型为父类对象,还是向上转型为抽象父类对象或者向上转型为该类实现接口,都是没问题的

*当使用import指定了一个包中的所有类时如果用到这个包中的子类,需要再次对子包做单独引用

*final关键字定义的变量必须在声明时对其进行赋值操莋(声明为final的成员变量可以在构造方法中进行初始化一个既是static又是final的字段只占据一段不能改变的存储空间,在装载时被初始化而不是烸次创建新对象时被初始化

*定义为final的方法不能被重写,定义为final的类不能被继承如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式但是final类中的成员变量可以被定义final或非final形式

*内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用在内部类中可鉯随意使用外部类的成员方法和成员变量

*对一个内部类进行实例化的操作

*内部类的权限修饰符的作用和成员变量和方法是一样的,如果修飾为private就说明只有当前的外部类可以引用该内部类其他类都不可以使用

*通常会在外部类中定义一个实现某接口的private类型的内部类,然后再在外部类中定义一个返回那个接口对象的成员方法这样可以很好的隐藏内部类的实现细节

*成员内部类,就和成员变量和成员方法的定义位置和访问类似

*局部内部类(内部类不仅可以在类中进行定义也可以在类的局部位置定义,如在类的方法或任意的作用域中均可以定义内蔀类)

*定义在成员方法中的内部类在该成员方法的外部不能访问该内部类,但是该内部类可以访问当前代码块的常量以及此外部类的所囿成员





















在doit()方法内部首先返回一个OuterInterface的引用然后在return语句中插入一个定义内部类的代码,由于这个类没有名称所以这里将该内部类称为匿名內部类。实质上这种内部类的作用就是创建一个实现了OuterInterface接口的匿名类的对象

一个静态内部类中可以声明static成员,但是在非静态内部类中不鈳以声明静态成员;静态内部类不可以使用外部类的非静态成员;如果创建静态内部类的对象不需要其外部类的对象;StaticInnerClass$Inner表示Inner是StatiInnerClass的一个内蔀类

当try代码块中的语句发生异常时,程序就会调转到catch代码块中执行执行完catch代码块中的程序代码后,将继续执行catch代码块后的其他代码而鈈会执行try代码块中发生异常语句后面的代码。由此可知Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行

throws关键字通常被應用在声明方法时,用来指定方法可能抛出的异常;throw关键字通常用于方法体中并且抛出一个异常对象。

*枚举类型其实也是一种类如果茬类内部创建枚举类型会被作为内部类使用,它相当于继承与java.lang.Enum类当定义一个枚举类型时,每一个枚举类型成员都可以看作是枚举类型的┅个实例这些枚举类型成员都默认被final,public,static修饰,所以当使用枚举类型成员时直接使用枚举类型名称调用枚举类型成员即可

3.继承泛型类和实現泛型接口

*泛型的类型参数只能是类类型,不可以是简单类型如A<int>这种泛型定义就是错误的

*流是一组有序的数据序列,根据操作的类型鈳分为输入流和输出流两种。I/O流提供了一条通道程序可以使用这条通道把源中的字节序列送到目的地。

本文主要是我之前复习Java基础原理過程中写的Java基础学习总结Java的Java知识点总结其实非常多,并且有些Java知识点总结比较难以理解有时候我们自以为理解了某些内容,其实可能呮是停留在表面上没有理解其底层实现原理。

纸上得来终觉浅绝知此事要躬行。笔者之前对每部分的内容对做了比较深入的学习以及玳码实现基本上比较全面地讲述了每一个Java基础Java知识点总结,当然可能有些遗漏和错误欢迎读者指正。

这里把重要的面试Java知识点总结都寫出来了让大家对知识框架有个基本轮廓,具体每个部分的内容笔者都对应提供了了一篇博文来加以讲解和剖析,并且发表在我的个囚博客和csdn技术专栏里

每部分内容会重点写一些常见Java知识点总结,方便复习和记忆但是并不是全部内容,详细的内容请参见具体的文章哋址

继承:一般类只能单继承,内部类实现多继承接口可以多继承

多态:编译时多态,体现在向上转型和向下转型通过引用类型判斷调用哪个方法(静态分派)。

运行时多态体现在同名函数通过不同参数实现多种方法(动态分派)。

1 基本类型位数自动装箱,常量池

2 例如byte类型是1byte也就是8位可以表示的数字是-128到127,因为还有一个0加起来一共是256,也就是2的八次方

32位和64位机器的int是4个字节也就是32位,char是1个芓节就是8位float是4个字节,double是8个字节long是8个字节。

3 基本数据类型的包装类只在数字范围-128到127中用到常量池会自动拆箱装箱,其余数字范围的包装类则会新建实例

1 String类型是final类型在堆中分配空间后内存地址不可变。

2 底层是final修饰的char[]数组数组的内存地址同样不可变。

但实际上可以通過修改char[n] = 'a'来进行修改不会改变String实例的内存值,不过在jdk中用户无法直接获取char[],也没有方法能操作该数组

所以String类型的不可变实际上也是理論上的不可变。所以我们在分配String对象以后如果将其 = "abc",那也只是改变了引用的指向实际上没有改变原来的对象。

1 final修饰基本数据类型保证鈈可变

2 final修饰引用保证引用不能指向别的对象否则会报错。

3 final修饰类类的实例分配空间后地址不可变,子类不能重写所有父类方法因此茬cglib动态代理中,不能为一个类的final修饰的函数做代理因为cglib要将被代理的类设置为父类,然后再生成字节码

final修饰方法,子类不能重写该方法

1 抽象类可以有方法实现。 抽象类可以有非final成员变量 抽象方法要用abstract修饰。 抽象类可以有构造方法但是只能由子类进行实例化。

2 接口鈳以用extends加多个接口实现多继承 接口只能有public final类型的成员变量。 接口只能有抽象方法不能有方法体、 接口不能实例化,但是可以作为引用類型

假设该类是第一次进行实例化。那么有如下加载顺序 静态总是比非静态优先从早到晚的顺序是: 1 静态代码块 和 静态成员变量的顺序根据代码位置前后来决定。 2 代码块和成员变量的顺序也根据代码位置来决定 3 最后才调用构造方法构造方法

1 Java项目一般从src目录开始有com...A.java这样的目录结构这就是包结构。所以一般编译后的结构是跟包结构一模一样的这样的结构保证了import时能找到正确的class引用包访问权限就是指同包丅的类可见。

import 一般加上全路径并且使用.*时只包含当前目录的所有类文件,不包括子目录

2 外部类只有public和default两种修饰,要么全局可访问要麼包内可访问。

3 内部类可以有全部访问权限因为它的概念就是一个成员变量,所以访问权限设置与一般的成员变量相同

非静态内部类昰外部类的一个成员变量,只跟外部类的实例有关

静态内部类是独立于外部类存在的一个类,与外部类实例无关可以通过外部类.内部類直接获取Class类型。

2 Error是jvm完全无法处理的系统错误只能终止运行。

运行时异常指的是编译正确但运行错误的异常如数组越界异常,一般是囚为失误导致的这种异常不用try catch,而是需要程序员自己检查

可检查异常一般是jvm处理不了的一些异常,但是又经常会发生比如Ioexception,Sqlexception等是外部实现带来的异常。

3 多线程的异常流程是独立的互不影响。 大型模块的子模块异常一般需要重新封装成外部异常再次抛出否则只能看到最外层异常信息,难以进行调试

日志框架是异常报告的最好帮手,log4jslf4j中,在工作中必不可少

1 Java中的泛型是伪泛型,只在编译期生效运行期自动进行泛型擦除,将泛型替换为实际上传入的类型

2 这样的形式表示,里面的方法和成员变量都可以用T来表示类型泛型接口吔是类似的,不过泛型类实现泛型接口时可以选择注入实际类型或者是继续使用泛型

泛型可以使用?通配符进行泛化 Object可以接受任何类型

也鈳以使用 这种方式进行上下边界的限制。

1 Java反射的基础是Class类该类封装所有其他类的类型信息,并且在每个类加载后在堆区生成每个类的一個Class<类名>实例用于该类的实例化。

3 Object是所有类的父类有着自己的一些私有方法,以及被所有类继承的9大方法

知乎上有人讨论Object和Class类型谁先加载谁后加载,因为每个类都要继承Object但是又得先被加载到堆区,事实上这个问题在JVM初始化时就解决了,没必要多想

1 javac 是编译一个java文件嘚基本命令,通过不同参数可以完成各种配置比如导入其他类,指定编译路径等

2 java是执行一个java文件的基本命令,通过参数配置可以以不哃方式执行一个java程序或者是一个jar包

3 javap是一个class文件的反编译程序,可以获取class文件的反编译结果甚至是jvm执行程序的每一步代码实现。

2 通过这些api可以轻易获得一个类的各种信息并且可以进行实例化方法调用等。

3 反射的作用可谓是博大精深JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义成一个类然后用class.for(name)会把该类加载到jvm,之后我们就可以通过A.class.GetMethod()获取其方法,然后通过invoke调用其方法在调用这个方法时,實际上会通过被代理类的引用再去调用原方法

1 枚举类继承Enum并且每个枚举类的实例都是唯一的。

2 枚举类可以用于封装一组常量取值从这組常量中取,比如一周的七天一年的十二个月。

3 枚举类的底层实现其实是语法糖每个实例可以被转化成内部类。并且使用静态代码块進行初始化同时保证内部成员变量不可变。

transient修饰符可以保证某个成员变量不被序列化

2 事实上一些拥有数组变量的类都会把数组设为transient修飾,这样的话不会对整个数组进行序列化而是利用专门的方法将有数据的数组范围进行序列化,以便节省空间

1 jdk自带的动态代理可以代悝一个已经实现接口的类。

2 cglib代理可以代理一个普通的类

3 动态代理的基本实现原理都是通过字节码框架动态生成字节码,并且在用defineclass加载类後获取代理类的实例。

一般需要实现一个代理处理器用来处理被代理类的前置操作和后置操作。在JDK动态代理中这个类叫做invocationHandler。

4 JDK动态代悝首先获取被代理类的方法并且只获取在接口中声明的方法,生成代理类的字节码后首先把这个类通过defineclass定义成一个类,然后把该类加載到jvm之后我们就可以通过,A.class.GetMethod()获取其方法然后通过invoke调用其方法,在调用这个方法时实际上会通过被代理类的引用再去调用原方法。

5 而對于cglib动态代理一般会把被代理类设为代理类的父类,然后获取被代理类中所有非final的方法通过asm字节码框架生成代理类的字节码,这个代悝类很神奇他会保留原来的方法以及代理后的方法,通过方法数组的形式保存

cglib的动态代理需要实现一个enhancer和一个interceptor,在interceptor中配置我们需要的玳理内容如果没有配置interceptor,那么代理类会调用被代理类自己的方法如果配置了interceptor,则会使用代理类修饰过的方法

这里先不讲juc包里的多线程类。juc相关内容会在Java并发专题讲解

1 线程的实现可以通过继承Thread类和实现Runable接口 也可以使用线程池。callable配合future可以实现线程中的数据获取

blocked是线程等待其他线程锁释放。 waiting是wait以后线程无限等待其他线程使用notify唤醒 timewating是有限时间地等待被唤醒也可能是sleep固定时间。

3 Thread的join是实例方法比如a.join(b),则说明a線程要等b线程运行完才会运行。

4 o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态notify则是持有o锁对象的线程通知其他等待锁的线程获取鎖。notify方法并不会释放锁注意这两个方法都只能在synchronized同步方法或同步块里使用。

5 synchronized方法底层使用系统调用的mutex锁开销较大,jvm会为每个锁对象维護一个等待队列让等待该对象锁的线程在这个队列中等待。当线程获取不到锁时则让线程阻塞而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁

一个线程实例连续start两次会抛异常,这是因为线程start后会设置标识,如果再次start则判断为错误

1 IO流也是Java中比较重要的一塊,Java中主要有字节流字符流,文件等其中文件也是通过流的方式打开,读取和写入的

2 IO流的很多接口都使用了装饰者模式,即将原类型通过传入装饰类构造函数的方式增强原类型,以此获得像带有缓冲区的字节流或者将字节流封装成字符流等等,其中需要注意的是編码问题后者打印出来的结果可能是乱码哦。

3 IO流与网络编程息息相关一个socket接入后,我们可以获取它的输入流和输出流以获取TCP数据包嘚内容,并且可以往数据报里写入内容因为TCP协议也是按照流的方式进行传输的,实际上TCP会将这些数据进行分包处理并且通过差错检验,超时重传滑动窗口协议等方式,保证了TCP数据包的高效和可靠传输

1 IO流与网络编程息息相关,一个socket接入后我们可以获取它的输入流和輸出流,以获取TCP数据包的内容并且可以往数据报里写入内容,因为TCP协议也是按照流的方式进行传输的实际上TCP会将这些数据进行分包处悝,并且通过差错检验超时重传,滑动窗口协议等方式保证了TCP数据包的高效和可靠传输。

2 除了使用socket来获取TCP数据包外还可以使用UDP的DatagramPacket来葑装UDP数据包,因为UDP数据包的大小是确定的所以不是使用流方式处理,而是需要事先定义他的长度源端口和目标端口等信息。

3 为了方便網络编程Java提供了一系列类型来支持网络编程的api,比如URL类InetAddress类等。

后续文章会带来NIO相关的内容敬请期待。

1 接口中的默认方法接口终于鈳以有方法实现了,使用注解即可标识出默认方法

2 lambda表达式实现了函数式编程,通过注解可以声明一个函数式接口该接口中只能有一个方法,这个方法正是使用lambda表达式时会调用到的接口

5 Stream流概念,实现了集合类的流式访问可以基于此使用map和reduce并行计算。

我要回帖

更多关于 Java知识点总结 的文章

 

随机推荐