Java基础
本部分是笔者在做牛客网Java基础练习时,做的笔记,希望对大家有用!没事可以看看,都是互联网笔试中常考的一些点!
- 超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中: 传送协议。 服务器。 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)。 路径。(以“/”字符区别路径中的每一个目录名称) 。查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- HttpServlet容器响应Web客户请求流程如下:
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,这个方法中会根据request的Method来判断具体是执行doGet还是doPost,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpS
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
doGet() 或 doPost() 是创建HttpServlet时需要覆盖的方法. - AWT,抽象窗口工具包,是Java提供的建立图形用户界面的工具集,可用于生成现代的、鼠标控制的图形应用接口,且无需修改,就可以在各种软硬件平台上运行。 而swing是Java语言在编写图形用户界面方面的新技术,Swing采用模型-视图-控制设计范式,Swing可以使Java程序在同一个平台上运行时能够有不同外观以供用户选择。 两者不同在于一个是初代工具集,一个是进化版的工具集,用户不会再满足于初始的功能,而是更加注重于附加价值,明显从这点上,Swing是比AWT要好很多。 写法上,Swing的头文件引用包需要用到Javax,组件调用时也需要在AWT的基础上加上“J”。
- Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT 的Java程序,其运行速度比较慢。
- final修饰的类不能被继承
- 抽象类不能被实例化,无法使用new关键字调用抽象类的构造器创建抽象类的实例,即使抽象类不包含抽象方法,也不能被实例化。
- 于JSP生命周期::init方法:负责初始化Servlet对象。在Servlet的整个生命周期类,init()方法只被调用一次。
JSP会先解释成Servlet源文件,然后编译成Servlet类文件
service()方法是接收请求,返回响应的方法。每次请求都执行一次,该方法被HttpServlet封装为doGet和doPost方法
destroy方法:销毁Servlet对象,释放占用的资源,Servlet要被卸载时调用;
- 重写的规则,子类重写父类方法,不能比父类有更严格的访问级别,比如父类是包访问权限,子类可以是public
- 只有实现了Serializable接口的类,其对象才能序列化。
- java的访问权限有public、protected、private和default的,default不能修饰变量
- 普通变量不能用abstract修饰,abstract一般修饰方法和类
- 被定义为abstract的类需要被子类继承,但是被修饰为final的类是不能被继承和改写的
- 使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
- 重载: 只有在 同一类定义中的同名成员函数才存在重载关系 ,主要特点是 函数的参数类型和数目有所不同 ,但 不能出现函数参数的个数和类型均相同 ,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致的。另外,重载和成员函数是否是虚函数无关
- 覆盖: 在派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。
- 隐藏: 派生类中的函数屏蔽了基类中的同名函数, 2个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类函数是否是虚函数)。2个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一类中)。
- Java程序的种类有: (a)内嵌于Web文件中,由浏览器来观看的_Applet (b)可独立运行的 Application (c)服务器端的 Servlets
- java虚拟机的功能:虚拟机通过类加载器寻址和装载类文件 、解释字节码为指令并执行 、进行垃圾回收 、提供与硬件交互的平台
- ava反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
- 编码格式由浏览器决定,浏览器根据html中指定的编码格式进行编码,tomcat根据指定的格式进行解码,另外get请求和post请求对编码格式的处理也是不同的
- 1、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。原因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰 类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以。锁应该归其子类所有。所以。抽象方 法也就不能用synchronized关键字修饰了;native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?
- 2、接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去 实现(非继承) ,不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。
- 类的执行流程:1、执行父类的静态代码块 2、执行子类的静态代码块 3、执行父类的构造代码块 4、执行父类的构造函数 5、执行子类的构造代码块 6、执行子类的构造函数
- 抽象类和接口的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以定义静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。 - 类方法就是静态方法。其它的就是实例方法 。实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用。
- Webservice是跨平台,跨语言的远程调用技术; 它的通信机制实质就是xml数据交换; 它采用了soap协议(简单对象协议)进行通信
- PreparedStatement是CallableStatement的父接口;
- 通过DriverManager.getConnection方法获取 Connection 对象;
- 所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。 定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别;
- HashMap与TreeMap都是非线程安全的 ;
- 在jvm中 是使用监视器锁来实现不同线程的异步执行, 在语法的表现就是synchronized 。
- 构造方法没有返回值,不能添加void,构造方法可以被重载;
- this代表当前对象,也就是当前类的对象的引用 。super代表其父类对象;
- 静态块:用static申明,JVM加载类时执行,仅执行一次;
- 构造块:类中直接用{}定义,每一次创建对象时执行;
- 执行顺序优先级:静态块>main()>构造块>构造方法;
- 当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch代码段,有多个符合条件的catch时,只执行第一个;
- CopyOnWriteArrayList适用于写少读多的并发场景;
- ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可以并发执行。在读多写少的情况下可以提高效率;
- ConcurrentHashMap是同步的HashMap,读写都加锁;
- volatile只保证多线程操作的可见性,不保证原子性;
- List接口中的对象按一定顺序排列,允许重复
- Set接口中的对象没有顺序,但是不允许重复
- Map接口中的对象是key、value的映射关系,key不允许重复
- 重载要满足以下条件: 1.必须是同一个类; 2.方法名(也可以叫函数)一样; 3.参数类型不一样或参数数量不一样;
- 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
- Java中原始数据类型都是值传递,传递的是值得副本,形参的改变不会影响实际参数的值, 引用传递传递的是引用类型数据,包括String,数组,列表, map,类对象等类型,形参与实参指向的是同一内存地址,因此形参改变会影响实参的值。
- Error和 Exception都是Throwable的子类,其中Error是不可处理的异常,是由虚拟机造成的,如内存溢出,堆栈溢出等,Exception是可处理的异常,他有一个重要的子类 RuntimeException, 表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界。 这些异常是不检查异常 ,程序中可以选择捕获处理,也可以不处理。
- doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的;
- 依赖注入的动机就是减少组件之间的耦合度,使开发更为简洁;
- Sting 类保存字符串只是保存所有单单的字符串;而 char[] 字符数组 会在最后自动加上'\n';
- System.in 和 System.out 是java中的标准输入输出流,一般情况下代表从控制台输入和输出到控制台
- 执行顺序优先级:静态块>main()>构造块>构造方法;类的加载顺序:类的静态成员变量-->类的成员变量-->类的构造方法
- init方法:负责初始化Servlet对象。在Servlet的整个生命周期类,init()方法只被调用一次。
- 初始化块在构造器执行之前执行,类初始化阶段先执行最顶层父类的静态初始化块,依次向下执行,最后执行当前类的静态初始化块;创建对象时,先调用顶层父类的构造方法,依次向下执行,最后调用本类的构造方法。
- 最终类就是被final修饰的类,最终方法就是被final修饰的方法。最终类不能被继承,最终方法不能被重写
- maven和ant都有“生命周期”的概念,当你输入一个命令后,maven或者ant会执行一系列的有序的步骤,直到到达你指定的生命周期
- final所修饰的成员变量只能赋值一次,可以在类方法中赋值,也可以在声明的时候直接赋值,而final修饰的局部变量可以在声明的时候初始化,也可以在第一次使用的通过方法或者表达式给它赋值。
- 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被 线程共享 的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
- 事物隔离级别由数据库系统实现,是数据库系统本身的一个功能;
- 按值传递:就是将该值的副本传过去(基本数据类型+String类型的传递,就是按值传递) ;
- 按引用传递:就是将值的内存地址传过去(除基本数据类型+String以外类型的传递,就是引用传递);
- java.awt: 包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面
- java.lang: 提供java编程语言的程序设计的基础类
- java.io: 包含提供多种输出输入功能的类,
- java.net: 包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET,
- java.applet: 包含java小应用程序的类
- java.util: 包含一些实用性的类
- 关系数据模型和对象数据模型之间有以下对应关系:表对应类,记录对应对象,表的字段对应类的属性;
- 出于运行速率的考虑,java编译器会把经常经常访问的变量放到缓存中,读取变量则从缓存中读。但是在多线程编程中,内存中的值和缓存中的值可能会出现不一致。volatile用于限定变量只能从内存中读取,保证对所有线程而言,值都是一致的。但是volatile不能保证原子性,也就不能保证线程安全。
- volatile关键字:volatile关键字用在多线程同步中,可保证读取的可见性;JVM保证从主内存加载到线程工作内存的值是最新的;volatile能禁止进行指令重排序.
- 1.this 和 super 只能放在第一行
2.this()和super()不可以同时出现在一个构造函数中
3.在方法中定义使用的this关键字,它的值是 当前对象 的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this. - abstract修饰符用来修饰类和成员方法
1:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。
2:用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。
Abstract是Java中的一个重要关键字,可以用来修饰一个类或者一个方法。 修饰一个方法时,表示该方法只有特征签名(signature),没有具体实现,而是把具体实现留给继承该类的子类。一个类中只要有一个abstract 方法,那么这个类就要被声明为abstract,但是其中可以有非abstract方法。 abstract类可以使得类的设计者能够创建方法的原型,而真正的实现留给使用这个类的人。 - JAVA异常类:异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。非RuntimeException一般是外部错误,其必须被 try{}catch语句块所捕获。Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉。
- java.lang包是java语言的核心包,lang是language的缩写 。java.lang包定义了一些基本的类型,包括Integer,String之类的,是java程序必备的包,有解释器自动引入,无需手动导入;
- JSP内置对象和属性列举如下:
1.request对象 。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。 2.response对象 。 response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象 。 session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象。out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象。page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象。application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象。exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象。pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象。config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) - Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)。
- ResultSet跟普通的数组不同,索引从1开始而不是从0开始。
- Java字节码是Java源文件编译产生的中间文件;
- Spring是一系列轻量级Java EE框架的集合;Spring中包含一个“依赖注入”模式的实现;使用Spring可以实现声明式事务;Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。
- forward,服务器获取跳转页面内容传给用户,用户地址栏不变;
redirect,是服务器向用户发送转向的地址,redirect后地址栏变成新的地址 - ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可以并发执行。在读多写少的情况下可以提高效率;
- CopyOnWriteArrayList适用于写少读多的并发场景;
- ConcurrentHashMap是同步的HashMap,读写都加锁;
- volatile只保证多线程操作的可见性,不保证原子性;
- Hibernate鼓励使用双向一对多关联,不使用单向一对多关联。单向一对多关联映射是在one端维护关系的,必须先保存many端后才可以保存one端,所以在保存many端时该端不知道one端是否存在相应的数据,所以只能将维护的关系字段设置为null,如果为非空则无法保存。因为是one端维护关系,所以在保存one端时,会发出多余的update语句维护many端的外键关系。
- 使用ObjectOutputStream和ObjectInputStream可以将对象进行传输. 声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据。
- Vector实现了List接口,即间接实现Collection接口;List接口继承了Collection接口,List接口允许存放重复的对象,排序方式为按照对象的插入顺序。 Set接口继承了Collection接口,Set接口不允许存放重复的对象,排序方式为按照自身内部的排序规则。
- 堆内存分为Perment Space和Heap Space,前者存放静态类型数据,如java class,method等,年老代中存放一些生命周期较长的对象,而新生成的对象都是存放在年轻代中。持久区存放运行时需要的Class和Interface的元数据,而对象存放在堆空间的新生代和年老代。
- java类加载器:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用 - JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。
- GenericServlet类的实现接口中包括了ServletConfig接口,但是它自身的init(ServletConfig config)方法又需要外界给它传递一个实现ServletConfig的对象,就是说GenericServlet和ServletConfig的依赖关系既是继承关系,也是一种关联关系。
- Vector支持线程的同步,也就是内部加锁的 ,但是效率低,因此在新版jdk中加入线程不安全的Arraylist
- HashMap与TreeMap都是非线程安全的,Properties、StringBuffer、Vector、HashTable是线程安全的