1、abstract class与interface的区别
(1)abstract class是java语言中表示的一种继承关系,一个类只有一次继承的关系,不支持多重继承,一个类可实现多个接口
(2)abstract class可以有自己的数据成员,也可以是非abstract的成员方法,而interface 中只能有静态final的数据成员,所有方法都是abstract;
(3)两者反应的设计理念不同,abstract class是is-a的关系,而interface是like-a的关系;报警功能的门,open close是门本质,报警是功能;
is-a关系和is-like-a关系
is-a关系属于纯继承,即只有在基类中已经建立的方法才可以在子类中被覆盖,如下图所示:
基类和子类有着完全相同的接口,这样向上转型时永远不需要知道正在处理的对象的确切类型,这通过多态来实现。is-like-a关系:子类扩展了基类接口。它有着相同的基本接口,但是他还具有由额外方法实现的其他特性。
缺点就是子类中接口的扩展部分不能被基类访问,因此一旦向上转型,就不能调用那些新方法。
2.如何在jsp中防止用户本地提交表单?
最简单的办法:检查request的http头信息中的referer标志 Request.Headers.Get("referer");。该标志包含提交数据的来源,即包含form的网页地址。如果你用过netant等下载软件就会发现可以设置下载任务的来源,就是这个啦!一般伪造该标志比较困难(因为通常浏览器不会作假,不过像netant之类的agent就可以改)。当然恶意用户足够恶意和技术足够高超总能伪造的)
3.java多态的实现机制
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。(面向接口编程)
4.写代码分别使得JVM的堆、栈和持久代发生内存溢出(栈溢出)
public class test { public static void main(String[] args) { List l = new ArrayList(); while (true) { l.add(new String("hello word")); } }}
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2245)
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:242)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
at java.util.ArrayList.add(ArrayList.java:440)
at test.main(test.java:8)
public class stackTest{ private void f(){ while(true){ } } public void g(){ while(true){ Thread thread = new Thread(new Runnable(){ @Override public void run() { f(); } }); thread.start(); } } public static void main(String[] args) { stackTest a = new stackTest(); a.g(); }}
public class permtest { public static void main(String[] args) { List l = new ArrayList(); int i=0; while (true) { l.add(String.valueOf(i++).intern()); } }}
5.
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.跟接口结合在一起,可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
6.
HashCode被设计用来提高性能。在用户类和其他类进行比较的时候或被添加到集合中的时候,需要重写这两个方法。equals()方法与hashCode()方法的区别在于:
如果两个对象相等(equal),那么他们一定有相同的哈希值。
如果两个对象的哈希值相同,但他们未必相等(equal)。
7.面向对象的特性
封装
封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。
下面列出了使用封装的一些好处:
通过隐藏对象的属性来保护对象内部的状态。
提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
禁止对象之间的不良交互提高模块化。
多态
多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。
继承
继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。
抽象
抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
抽象和封装的不同点
抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。
overload和override的区别
override(重写)
1、方法名、参数、返回值相同。2、子类方法不能缩小父类方法的访问权限。3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。4、存在于父类和子类之间。5、方法被定义为final不能被重写。overload(重载)1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。3、存在于父类和子类、同类中。
7.进程和线程的关系
进程是操作系统资源分配的基本单位, 线程是操作系统执行的基本单位。线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。一个程序至少有一个进程,一个进程至少有一个线程.
引入线程的好处
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。