1:String是基本类型吗?基本数据类型有那些?
答:不是。四种整数类型(byte、short、int、long),两种浮点数类型(float、double),一种字符类型(char),一种布尔类型(boolean)。
2:int和Integer的区别?String和StringBuffer的区别?
答:int和Integer的区别?
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
- Integer的默认值是null,int的默认值是0
答:String和StringBuffer的区别?
1). String可以用+算术运算符拼接字符串(不管是二边有一个变量字符串还是都是常量字符串都可以拼接)StringBuffer不可以(除了二边只要有一个常量字符串对象就可以拼接 例如 ab2+“hello”)
2). String表示线程不安全 执行效率高 StringBuffer相反
3). String对象中的值是不可变的 StringBuffer中的值是可变的(也就是可以通过方法修改原来的StringBuffer变量并赋值给一个新的StringBuffer变量 二者之间是相等的)
4). String创建对象时可以String a = “abc” 但是 StringBuffer不能直接这样创建 需要StringBuffer pj1 = new StringBuffer(“abc”);
3:String s=new String(“xyz”);创建了几个String Object?
答:这个问题是很有争议性的,也可以说是个坑,下面链接是这个问题的专题讨论总结
https://www.iteye.com/blog/rednaxelafx-774673
4:说出ArrayList,Vector,LinkedList的存储性能和特性
- ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
- LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始
- ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢
- Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.
- LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.
arraylist和vector的区别?
1). 同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的
2). 数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半
5:List,Map,Set三个接口,存取元素时,各有什么特点?
答:List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。
- Set里面不允许有重复的元素,
存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。
取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。 - List表示有先后顺序的集合,
存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍历各个元素
方法2:调用get(index i)来明确说明取第几个。 - Map是双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。
取元素:用get(Object key)方法根据key获得相应的value。
也可以获得所有的key的集合,还可以获得所有的value的集合,
还可以获得key和value组合成的Map.Entry对象的集合。
List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值
。
6:HashMap和Hashtable的区别?
- 共同点:都是双列集合,底层都是哈希算法
- 区别:
- 1.HashMap是线程不安全的,效率高,JDK1.2版本
- Hashtable是线程安全的,效率低,JDK1.0版本
- 2.HashMap可以存储null键和null值
- Hashtable不可以存储null键和null值
7:final,finally,finalize的区别?
- final
- A、修饰符(关键字),,如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承。因此一个类不能继被声明为abstarct,又被声明为fianl的
- B、将变量或方法声明为fianl,可以保证他们在使用中不被改变,被声明为fianl的变量必须在声明是给定初值,而以后得引用中只能读取,不可修改,被声明为fianl的方法也同样只能使用,不能重写。
- finally
- A、在异常处理时提供finally块来执行清除操作,如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块。finally块中无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。
- finalize
- A、 是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器确定这个对象没有被引用的情况下调用的。
- B、finalize是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。
8:error和exception有什么区别?运行时异常和一般异常有何异同?
- Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的
- Exception:可恢复捕捉的。java健壮程序的手段。
一:Exceprion这个层次结构又分解为连个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。
- a:常见的RuntimeException(运行时异常):
IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
NumberFormatException (String转换为指定的数字类型异常)
ArithmeticException -(算术运算异常 如除数为0)
ArrayStoreException - (向数组中存放与声明类型不兼容对象异常)
SecurityException -(安全异常) - b:IOException(其他异常)
FileNotFoundException(文件未找到异常。)
IOException(操作输入流和输出流时可能出现的异常。)
EOFException (文件已结束异常
9:forward和redirect的区别?
是servlet种的两种主要的跳转方式。forward又叫转发,redirect叫做重定向
区别:(本地效应次数)
地址栏,数据共享,应用场景,效率,本质,次数
- 从地址栏显示来说:
1)forword是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
2)redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的地址。 - 从数据共享来说:
1)由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。即可以共享数据.
2)redirect不能共享 - 从运用的地方来说
1)forword 一般用于用户登录的时候,根据角色转发到相应的模块
2) redirect一般用于用户注销登录时返回主页面或者跳转到其他网站 - 从效率来说:
1)forword效率高,而redirect效率低 - 从本质来说:
forword转发是服务器上的行为,而redirect重定向是客户端的行为 - 从请求的次数来说:
forword只有一次请求;而redirect有两次请求
10:什么时候用assert?
- 断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、最关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。
- 断言可以有两种形式:
assert Expression1;
assert Expression1 : Expression2;
Expression1表示一个boolean表达式,Expression2表示一个基本类型、表达式或者是一个Object,用于在失败时输出错误信息。 - 第一种方式:exp1必须是返回boolean.
public class AsertTest{
public static void main(String args[]){
System.out.println("Assert begin!");
assert false;
System.out.println("Assert end!");
}
//运行后:assert为false时,会执出异常,System.out.println("Assert end!");没有执行.当把assert改为true时,程序顺利执行.
- 第二种方式:assert exp1:exp2
当exp1为true的时候后面exp2被忽略,如果false的话,后面的表达式的结果会被计算出来并作为AssertionError得构造器参数
public class AssertTest {
public static void main(String[] args) {
System.out.println("Assert begin!");
int i=0;
assert i == 0:"123456";
System.out.println("Assert end!");
}
}
// 运行后i == 0为true,而"123456"被忽略了
11:GC是什么?为什么要有GC ?
- GC是什么?:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
- 为什么要有GC ?:垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。
要请求垃圾收集,可以调用下面的方法之一:
System.gc() 或Runtime.getRuntime().gc() 。
12:写出四种会话跟踪技术
URL重写、隐藏表单域、Cookie、Session
- 1).隐藏表单域:,非常适合步需要大量数据存储的会话应用。
- 2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。 见http://blog.csdn.net/xh16319/article/details/8464055
- 3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值。 见:http://blog.csdn.net/xh16319/article/details/8464319 - 4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
13:Servlet生命周期是怎样的?doGet,doPost和service各有什么区别
- Servlet生命周期
/**
* Servlet的生命周期:
* 1、从第一次调用到服务器关闭。
* 2、如果Servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭
* 注意:
* init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
* destory方法是在servlet被销毁时执行,也就服务器关闭时。
* @author MyPC
*
*/
public class ServletLife extends HttpServlet {
//初始化方法,在servlet第一次加载内容的时候被调用
@Override
public void init() throws ServletException {
System.out.println("servlet初始化完成");
}
//service方法,真正处理请求的方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("servlet life");
System.out.println("servlet life");
}
@Override
public void destroy() {
System.out.println("我被销毁了...");
}
}
- service 和 doGet 和 doPost 方法的区别以及常见错误
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Service方法和doGet方法和doPost方法的区别
* Service方法:
* 可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。
* doGet方法:
* 处理get方式的请求
* doPost方法:
* 处理post方式的请求
* 注意:
* 如果在覆写的service方法中调用了父类的service方法(super.service(arg0, arg1)),
* 则service方法处理完后,会再次根据请求方式响应的doGet和doPost方法执行。所以,一般情况下
* 我们是不在覆写的service中调用父类的service方法的,避免出现405错误。
* Servlet的常见错误:
* 404错误:资源未找到
* 原因一:在请求地址中的servlet的别名书写错误。
* 原因二:虚拟项目名称拼写错误
* 500错误:内部服务器错误
* 错误一:
* java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod
* 解决:
* 在web.xml中校验servlet类的全限定路径是否拼写错误。
* 错误二:
* 因为service方法体的代码执行错误导致
* 解决:
* 根据错误提示对service方法体中的代码进行错误更改。
* 405错误:请求方式不支持
* 原因:
* 请求方式和servlet中的方法不匹配所造成的。
* 解决:
* 尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。
* @author MyPC
*/
public class ServletMethod extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int i=5/0;
System.out.println("我是service");
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("我是doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("我是doPost方法");
}
}
14:java有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
- 有两种实现方法, 分别使用 new Thread()和 new Thread(runnable)形式, 第一种直接调用
thread 的 run 方法, 所以, 我们往往使用 Thread 子类, 即 new SubThread()。 第二种调
用 runnable 的 run 方法。
有两种实现方法, 分别是继承 Thread 类与实现 Runnable 接口 - 用 synchronized 关键字修饰同步方法
synchronized
英 [ˈsɪŋkrənaɪzd] 美 [ˈsɪŋkrənaɪzd]
v.
(使)同步,在时间上一致,同速进行
synchronize的过去分词和过去式
- stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。 用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器。如果以前受这些监视器保护的任何对象都处于不连贯状态,那么损坏的对象对其他线程可见,这有可能导致不安全的操作。 由于上述原因,因此不应该使用stop()方法,而应该在自己的Thread类中置入一个标志,用于控制目标线程是活动还是停止。如果该标志指示它要停止运行,可使其结束run()方法。如果目标线程等待很长时间,则应使用interrupt()方法来中断该等待。
- suspend()方法 该方法已经遭到反对,因为它具有固有的死锁倾向。调用suspend()方法的时候,目标线程会停下来。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前,其他线程都不能访问该资源。除非被挂起的线程恢复运行。对任何其他线程来说,如果想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。由于上述原因,因此不应该使用suspend()方法,而应在自己的thread类中置入一个标志,用于控制线程是活动还是挂起。如果标志指出线程应该挂起,那么用wait()方法命令其进入等待状态。如果标志指出线程应当恢复,那么用notify()方法重新启动线程。
15:静态变量和实例变量的区别?
- 在Java中,静态变量和实例变量可以统称为成员变量。首先,明白什么是静态变量,什么是实例变量,他们定义的形式。静态变量也叫做类变量,独立于方法之外的变量,有static修饰。实例变量同样独立也是独立于方法之外 的变量,但没有static修饰。
- 举个例子:
public class StaticTest {
private static int staticInt = 2;//静态变量
private int random = 2;//实例变量
public StaticTest() {
staticInt++;
random++;
System.out.println("staticInt = "+staticInt+" random = "+random);
}
public static void main(String[] args) {
StaticTest test = new StaticTest();
StaticTest test2 = new StaticTest();
}
}
看到上述代码,大家可以想一下测试结果。
下面公布正确答案:
staticInt = 3 random = 3
staticInt = 4 random = 3
是否和你想的一样?上述例子很好的解释了静态变量和实例变量的区别。
下面来干货了,注意收好。
- 区别总结如下:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。结合上述给出的例子。每创建一个实例对象,就会分配一个random,实例对象之间的random是互不影响的,所以就可以解释为什么输出的两个random值是相同的了。
静态变量不属于某个实例对象,而是属于整个类。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就回被分配空间,静态变量就可以被使用了。结合上述给出的例子,无论创建多少个实例对象,永远都只分配一个staticInt 变量,并且每创建一个实例对象,staticInt就会加一。
总之,实例变量必须创建对象后,才可以通过这个对象来使用;静态变量则可以直接使用类名来引用(如果实例对象存在,也可以通过实例对象来引用)。
其实,这也可以解释,为什么static修饰的方法不用在实例对象创建后,可以调用。而没有static修饰的方法必须要与对象关联在一起,必须创建一个对象后,才可以在该对象上进行方法调用。
16:什么是java序列化?如何实现java序列化?
- 什么是java序列化?:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
- 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,
然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
17:IO和NIO有什么区别?
- 主要区别
- Java IO 和 NIO的主要区别体现在以上两个方面,以下详细说明这些区别的具体含义。
这个概念和编程方法中的面向过程、面向对象类似。Java IO 是面向流的而Java NIO是面向缓冲区的。
在Java IO中读取数据和写入数据是面向流(Stream)的,这表示当我们从流中读取数据,写入数据时也将其写入流,流的含义在于没有缓存 ,就好像我们站在流水线前,所有的数据沿着流水线依次到达我们的面前,我们只能读取当前的数据(相当于我们拥有一个数据流的切面)。如果需要获取某个数据的前一项或后一项数据那就必须自己缓存数据,而不能直接从流中获取(因为面向流就意味着我们只有一个数据流的切面)
而在Java NIO中数据的读写是面向缓冲区(Buffer)的,读取时可以将整块的数据读取到缓冲区中,在写入时则可以将整个缓冲区中的数据一起写入。这就好像是将流水线传输变成了卡车运送,面向流的数据读写只提供了一个数据流切面,而面向缓冲区的IO则使我们能够看到数据的上下文,也就是说在缓冲区中获取某项数据的前一项数据或者是后一项数据十分方便。这种便利是有代价的,因为我们必须管理好缓冲区,这包括不能让新的数据覆盖了缓冲区中还没有被处理的有用数据;将缓冲区中的数据正确的分块,分清哪些被处理过哪些还没有等等。
Java NIO的IO模型与很多IO的本质更加一致!磁盘IO读写就是数据块读写; TCP/IP协议传输的也是数据包而不是数据流。但是很多系统提供的是却是面向流的系统API,例如套接字API是面向数据流的。
- 阻塞和非阻塞
ava IO是阻塞的,如果在一次读写数据调用时数据还没有准备好,或者目前不可写,那么读写操作就会被阻塞直到数据准备好或目标可写为止。Java NIO则是非阻塞的,每一次数据读写调用都会立即返回,并将目前可读(或可写)的内容写入缓冲区或者从缓冲区中输出,即使当前没有可用数据,调用仍然会立即返回并且不对缓冲区做任何操作。这就好像去超市买东西,如果超市中没有需要的商品或者数量还不够,那么Java IO会一直等直到超市中需要的商品数量足够了就将所有需要的商品带回来,Java NIO则不同,不论超市中有多少需要的商品,它都会立即买下可以买到的所有需要的商品并返回,甚至是没有需要的商品也会立即返回。
阻塞IO会使得线程将大量的时间浪费在等待IO上,这是非常不划算的,但是这种阻塞可以在数据可用时立即获取并处理数据,而非阻塞IO则必须通过重复的调用来获取全部数据。
Java NIO 使用Selector实现单线程管理多个Channel,通过 select 调用,可以获取已经准备好的Channel并进行相应的处理。
18:什么是队列?实现阻塞接口的队列有那些?
类似于链表和堆栈,队列也是存储数据的结构。队列中数据进入队列的顺序很重要,
一般来说,队列就是一群人或者事物按照排好的顺序等待接受服务或者处理。
- 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
- 实现阻塞接口的队列有那些?
Queue接口,BlockingQueue接口
19:数据库设计的三大范式是什么?数据库事务的特性有哪些?
- 第一范式:简单说 列不能再分
- 第二范式:简单说 建立在第一范式基础上,消除部分依赖
- 第三范式:简单说 建立在第二范式基础上,消除传递依赖。
- 数据库事务的特性有哪些?
1):原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2):一致性:如果事务执行之前数据库是一个完整的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整的状态。
数据库的完整状态:当一个数据库中的所有的数据都符合数据库中所定义的所有约束,此时可以称数据库是一个完整的状态。
3):隔离型:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
4):持久性:指一个事务一旦被提交,他对数据库的影响是永久性的。
20:什么是索引?索引有哪几种类型?
- 索引是帮助MySQL高效获取数据的
排好序
的数据结构
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
- FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。 - HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。 - BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。 - RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。
索引种类
- 普通索引:仅加速查询
- 唯一索引:加速查询 + 列值唯一(可以有null)
- 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
- 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
- 全文索引:对文本的内容进行分词,进行搜索
21:单例模式和工厂模式的区别?
- 单例模式是创建一个类的单例对象
- 工厂模式就是不管如何实现的,只需要调用抽象话的接口就可以创建出特定类型的实例对象
22:
abstract class Name{
private String name;
public abstract boolean isStupidName(String name){}
}
有错吗?如果有错,错在何处?
答:有错。抽象方法没有方法体
抽象方法的特征:
- 格式,没有方法体,包括{ },例如 public abstract void dink();
- 抽象方法只保留方法的功能,具体的执行,交给继承抽象类的子类,由子类重写改抽象方法
- 如果子类继承抽象类,并重写了父类的所有的抽象方法,则此子类不是抽象类,可以实例化的
- 如果子类继承抽象类,没有重写父类中所有的抽象方法,意味着子类中还有抽象方法,那么此子类必须必须声明为抽象的。
23:
public class Something{
void doSometing(){
private String s="";
int L=s.length();
}
}
有错吗?如果有错,请指出错在哪?
答:有错。重载方法的变量s不能使用private进行修饰,应该去除