1.面向对象四大特征
继承:子类可以有父类的方法,属性(非private)也可以重写父类的方法。缺点就是提高代码之间的耦合性。
super关键字:通过super实现对父类成员的访问。用来引用当前对象的父类。通过super显示的调用父类的有参构造,无参构造可以隐式调用
多态:多态存在的3个条件:1、继承关系2、重写父类的方法3、父类引用指向子类对象
父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际是调用子类重写父类的方法后的方法。Father f = new Children();f.toString()实际是调用子类重写后的方法。
多态机制:重载(编译时多态)覆盖(运行时多态)
多态的分类:方法重载实现的是编译时的多态性,而方法重写实现的是运行时的多态性。
抽象包括:数据抽象,行为抽象。
2.equals和== 区别
equals比较两个对象的内容是否相同
== 比较两个对象是否是同一对象。
==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。
3.反射:
1.如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)。
2.如果我还明确知道这个类里某个变量的名称,我还能得到这个变量当前的值。
3.当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。
第一种:通过Object类的getClass方法
1 |
|
第二种:通过对象实例方法获取对象
1 |
|
第三种:通过Class.forName方式
1 |
|
4.说说Cookie和Session的区别?
1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
5.hashCode和equals方法的区别与联系
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
6.反射++++++++++++++
**************************************
1.什么是构造函数
用来在对象实例化的时候初始化对象的成员变量。
当提供了构造函数时,编译器便不再创建默认的构造函数了。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
2.static关键字4种使用场景:成员变量,成员方法,内部类,代码块
3.char型变量可以存储中文,hello长度5,字节数5;你好 长度2,字节数4;
基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。
5.数组是对象,数组具有属性和方法,可以用instanceof判断数据的类型
数组初始化,一维数组:两种:int arr[]或int[] arr
二维数组:三种int arr[]或int[][] arr或int[] arr[]
数组length,字符串length();
6.java语言把所有异常当做对象来处理并定义一个基类java.lang.throwable作为所有异常的基类
异常处理是为了提高程序的 健壮性和安全性
7.JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中
8.接口和抽象类的异同是什么?
抽象类和接口的相同点:
1.都不能被实例化
2.接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
9.Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
10.有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。
11.转义字符
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符''\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
12.JSP/SEVERLET工作原理,生命周期
Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器。
servlet在服务器中的运行:1.加载 ->2.初始化 - > 3.调用 - 4.销毁
生命周期:servlet的生命周期在【2.初始化】后开始其生命周期,在【4.销毁】后结束其生命周期
(1) 加载和实例化
如果Servlet容器还没实例化一个Servlet对象,此时容器装载和实例化一个 Servlet。创建出该 Servlet 类的一个实例。如果已经存在一个Servlet对象,此时不再创建新实例。
(2) 初始化
在产生 Servlet 实例后,容器负责调用该 Servlet 实例的 init() 方法,在处理用户请求之前,来做一些额外的初始化工作。
(3) 处理请求
当 Servlet 容器接收到一个 Servlet 请求时,便运行与之对应的 Servlet 实例的 service() 方法,service() 方法根据用户的请求调用相对应的doGet或doPost 方法来处理用户请求。然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。
(4) 销毁
当 Servlet 容器决定将一个 Servlet 从服务器中移除时 ( 如 Servlet 文件被更新 ),便调用该 Servlet 实例的 destroy() 方法,在销毁该 Servlet 实例之前,来做一些其他的工作。
其中,(1)(2)(4) 在 Servlet 的整个生命周期中只会被执行一次。
13.转发重定向区别
重定向response.sendRedirect("success.jsp");
转发:request.getRequestDispatcher("success.jsp").forward(request,response);
1.转发在服务器端完成的;重定向是在客户端完成的
★2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
★4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
★5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
**************************
1.java语言优点
平台无关性,一次编译,到处运;
提供了许多内置类库,如对多线程的支持,对网络通信的支持,GC;
程序更加简洁,去除了C++中难以理解的指针,多重继承,运算符重载等;
健壮,安全,可以垃圾回收,异常处理;
提供了对WEB应用的开发。
2.反射3中方法获取类名
Class.forName("类的路径")
类名.Class
实例.getClass()。
3.创建对象四种方法
new;
反射机制;
clone();
反序列化。
4.克隆
Obj a=new Obj();
Obj b=a;
//a,b指向同一个引用,对b修改,会影响a
Obj a=new Obj();
Obj b=(Obj)a.clone();
//a,b指向不同的引用,对b修改,不会影响a
浅复制:仅复制对象的变量,不复制所引用的对象
深复制:复制对象的变量,并复制所引用的对象
步骤:
继承Cloneable接口,实质上是个标识接口,无任何接口方法
重写clone();
在clone方法中调用super.clone();
浅复制/深复制;Obj b=(Obj)a.clone();
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。
5.面向对象相比于面向过程
代码结构清晰,健壮,代码复用
通过继承,组合实现代码重用;组合:在新类中创建已有类的对象。组合是显示的,继承是隐式的。
6.内部类
4种:静态,匿名,局部,成员内部类。
7.关键字
this.name=name
this指向当前实例对象,区分对象的成员变量与方法的形参
static一个很重要的用途是实现单例模式,
static方法中不能使用this,super关键字,不能调用非static方法
instanceof判断左边的对象是否是右边的类的实例 if(s instanceof Object)
strictfp作用:精确浮点,当一个类被strictfp修饰,其所有方法都会被strictfp修饰
volatile与synchronized https://blog.csdn.net/seu_calvin/article/details/52370068详情
(1)从而我们可以看出volatile虽然具有可见性但是并不能保证原子性。
(2)性能方面,synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。
但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。
原子性表现在:要么不执行,要么执行到底。
8.值传递引用传递
八中基本数据类型按值传递,其他所有类型按引用传递
9.short s=1;s=s+1 报错
short s=1;s+=1 不报错,编译器会对+=进行特殊处理
10.String由char组成,英文占一个字符,中文占两个字符
“hello”长度5,字节5;“你好”长度2,字节4
11.finally不会执行的情况
当程序进入try语句之前就出现异常;在try中执行system.exit(0)强制退出方法。
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
编程习惯:
1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。
两种异常类Error和Exception,父类为Throwable
----------------------