java三目运算符排序基础问题

博客分类:
面试考察知识点如下:
一.序列化的实现方式
概念:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
目的:1、以某种存储形式使自定义对象持久化; 2、将对象从一个地方传递到另一个地方。
实现方法:
1:被序列化的类要实现 java.io.Serializable 接口,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件 ,反之,反序列化时用到对象输入流ObjectIntputStream,
然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型 注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量) ,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错。
序列化 //创建一个对象输出流,将对象输出到文件
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));
out.writeObject("序列化日期是:");
//序列化一个字符串到文件
out.writeObject(new Date());
//序列化一个当前日期对象到文件
UserInfo user=new UserInfo("renyanwei",");
out.writeObject(user);
//序列化一个会员对象
out.close();反序列化
//创建一个对象输入流,从文件读取对象
ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));
//注意读对象时必须按照序列化对象顺序读,否则会出错
//读取字符串
String today=(String)(in.readObject());
System.out.println(today);
//读取日期对象
Date date=(Date)(in.readObject());
System.out.println(date.toString());
//读取UserInfo对象并调用它的toString()方法
UserInfo user=(UserInfo)(in.readObject());
System.out.println(user.toString());
in.close();
2: 被序列化的类要实现java.io.Externalizable接口,Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容。
//当序列化对象时,该方法自动调用 public void writeExternal(ObjectOutput out) throws IOException{ System.out.println("现在执行序列化方法"); //可以在序列化时写非自身的变量 Date d=new Date(); out.writeObject(d); //只序列化userName,userPass变量 out.writeObject(userName); out.writeObject(userPass); } //当反序列化对象时,该方法自动调用 public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{ System.out.println("现在执行反序列化方法"); Date d=(Date)in.readObject(); System.out.println(d); this.userName=(String)in.readObject(); this.userPass=(String)in.readObject(); }
序列化//创建一个对象输出流,讲对象输出到文件
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));
UserInfo user=new UserInfo("renyanwei",");
out.writeObject(user);
//序列化一个会员对象
out.close();
//创建一个对象输入流,从文件读取对象
ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));
//读取UserInfo对象并调用它的toString()方法
UserInfo user=(UserInfo)(in.readObject());
System.out.println(user.toString());
in.close();
二.基本的动态代理
概念:所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
实现方法:
import java.lang.reflect.M
import java.lang.reflect.InvocationH
//动态代理类(需要继承自InvocationHandler ) public class HelloHandler implements InvocationHandler { private O public HelloHandler() { } public HelloHandler(Object proxyed) {
this.proxyed= } @Override public Object invoke(Object proxy1, Method method, Object[] args) throws Throwable { O System.out.println("start to invoke"); //调用原始对象的方法 result=method.invoke(proxyed, args);//返回调用结果 System.out.println("end to invoke");
Hello world=new HelloWord();
//实例化一个动态代理类
InvocationHandler in=new HelloHandler(world);
//获取反射类
Class cls=Proxy.getProxyClass(world.getClass().getClassLoader(), world.getClass().getInterfaces());
//获取反射构造
Constructor ct = cls.getConstructor(new Class[]{InvocationHandler.class});
//返回实例
Hello subject =(Hello) ct.newInstance(new Object[]{in});
//调用subject.say(5,10);
可以合并起来写
Hello subject =(Hello)Proxy.newInstance(world.getClass().getClassLoader(), world.getClass().getInterfaces(),in);
subject.say(5,10);
三.了解jvm体系
Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。
Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:
*JVM指令系统 : Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令,目前已使用了160多种操作码。
*JVM寄存器: 4个最为常用的寄存器。它们是: pc程序计数器、optop操作数栈顶指针、frame当前执行环境指针   vars指向当前执行环境中第一个局部变量的指针。所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。速度最快。
*JVM栈结构: 局部变量、执行环境、操作数栈。局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。操作数栈用于存储运算所需操作数及运算的结果。速度仅次于寄存器。存储java引用,不会存储java对象。 
*JVM碎片回收堆:Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。对内存进行释放和回收的工作是由Java运行系统承担的。
*JVM存储区: JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。
注:存储区有如上4种JVM寄存器、JVM栈结构、JVM碎片回收堆、JVM存储区(常量缓冲池和方法区)。还可以有如序列化存储的方式。
注:Java的编译方式有两种,一种是和C++等语言一样的,把源代码编译成和本地机器平台相关的机器语言,叫即时编译。另一种是编译成一种中间的字节码,与机器平台无关的,这种也是常用的,叫解释型的。
javac 编译器,用于将java源代码文件编译成字节码.
java 解释器,用于执行java字节码
JVM的体系结构(如图)
JAVA虚拟机的运行过程(如图)
概念:在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
目的:多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
线程的4个状态:
New(新建)线程对象仅仅是创建,并没有调用start()方法。
runnable(就绪)只要调度程序将时间片分配给线程,它便可以立刻运行
Blocked(阻塞)线程可以运行,但是由于某个条件阻止了它的运行。当线程为阻塞状态时,调度程序将不会将时间片分给它。
Dead(死亡)
注:线程进入阻塞的某些原因:1)sleep()方法,使线程进入休眠状态。2)wait()方法,使线程挂起。3)线程等待某个输入/输出的完成。4)线程试图调用某个对象上的同步控制方法,但是该对象锁不可用。5)suspend(),但是Java 2 中被废弃了。通常有3种可以恢复:sleep自动恢复、对于suspend调用resume恢复、对于wait可以用通知(notify或notiyA11)方法使其恢复。
实现方式:继承Thread类和实现Runnable接口重写run方法
线程的级别:
static int MAX_PRIORITY 线程可以具有的最高优先级。 static int MIN_PRIORITY 线程可以具有的最低优先级。 static int NORM_PRIORITY 分配给线程的默认优先级。
主要方法 void interrupt() //中断线程。 static boolean interrupted() //测试当前线程是否已经中断。 boolean isAlive()//测试线程是否处于活动状态。 boolean isDaemon() //测试该线程是否为守护线程。 boolean isInterrupted() //测试线程是否已经中断。 void join() //等待该线程终止。 run()//如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回 static void sleep(long millis)//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。 void start()//
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 void stop()// 过时 suspend()//已过时。 resume()// 已过时。 destroy()//已过时。 yield()//暂停当前正在执行的线程对象,并执行其他线程。
sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。可能给其他线程执行的机会(自私,睡着了,不释放锁,时间到了才放锁)
yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。不过yield()只能使同等级别的线程获取执行的机会(公平竞争,释放大家再次选举)。而sleep(1000)使同级别或不同级别的都有可能。
wait() 和 notify() 和notifyAll()方法是Object中定义的方法: 必须在synchronized代码块中使用,在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象的锁标志,进入等待的状态,并且可以调用notify()或者notifyAll()方法通知正在等待的其他线程。notify()通知的是等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有数量。 几个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。
wait()和sleep()方法的区别: wait()在object类里定义;sleep()在Thread类里定义。 wait()方法只能放在同步方法或同步块中,表示资源同步时,线程需要等待。 sleep()方法可放在任何位置,表示当前线程睡眠。 wait()方法会释放对象锁;sleep()不会释放对象锁。 wait()方法要等待唤醒之后,线程才会继续执行。 sleep()则是休眠一段时间,线程自动恢复执行. sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常
notify()和notifyAll()的区别 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。
join()是直到执行完(或强制执行一段时间)当前的线程后才往下执行主线程或其他的线程
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。 守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。 setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。
例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
在守护线程中创建非守护线程(前提是非守护线程执行语句要放在守护线程前),则不会因为其他所有非守护线程的结束而程序运行结束。总之一句话,如果当前还有一个非守护线程在执行,则程序不会结束(不管他是不是在守护线程中创建)。因为在守护线程中创建的默认都是守护线程,当然如果把守护线程创建的默认守护线程改成非守护线程,运行结果就不一样了。而在非守护线程中创建守护线程就很好理解了。
同步有两种方法。一种同步方法,一种同步代码!分别是synchronized,wait与notify
同步和异步有何异同,在什么情况下分别使用他们?。 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
synchronized 和 java.util.concurrent.locks.Lock 的异同 主要相同点: Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
关于创建多进程、线程组、线程池查看本博客的例子
重点:理解基本的概念和使用 ,以及经典的“生产者和消费者”
浏览: 388861 次
来自: 南京
ybzshizds 写道这种用工厂模式解决的办法其实还是有一个 ...
static class Queue
感谢楼主讲解、分享!
写了没什么用
大哥 能描述的跟详细点么?Java基础面试题与答案
1、抽象类(abstract class)和接口(interface)有什么区别?
&&答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。&
&&& 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义所有这种接口的方法。然后可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
2、中的异常处理机制的简单原理和应用。
&&&答:当Java程序违反了Java的语义规则时,Java就会将发生的错误表示为一个异常。违反语义规则包括2种情况:一种是Java类库内置的语义检查。例如数组下标越界时会引发IndexOutOfBoundsException,访问null的对象时会引发NullPointerException。另一种情况是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是Java.lang.Thowable的子类。&
3、sleep()和wait()有什么区别?
&& 答:sleep()是线程类Thread的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep不会释放对象锁。
&& wait()是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。&
4、String是最基本的数据类型吗?
&& 答:String不是基本数据类型,基本数据类型包括byte、int、char、long、float、double、boolean和short。 Java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。&
5、String和StringBuffer的区别。
&&&答:Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当知道字符数据要改变的时候就可以使用StringBuffer。典型地,可以使用StringBuffers来动态构造字符数据。&
6、接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类?
&&& 答:接口可以继承接口。抽象类可以实现接口。抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
7、Java有没有goto?
&& 答:goto是Java中的保留关键字,但是现在没有在Java中使用。&
8、启动一个线程是用run()还是start()?
&& 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。&
9、说明一下类变量和实例变量的区别。
&& 答:类变量是所有对象共有的,所有的实例对象都共用一个类变量,内存中只有一处空间存放类变量的值。如果其中一个对象改变了类变量的值,其他对象得到的就是改变后的结果。当类被加载到内存时,类变量就会分配相应的内存空间。
10、运行时异常与一般异常有何异同?
&& 答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。&
11、说明实例方法和类方法的区别?&
&& 答:方法前面有static关键字修饰的为类方法,否则为实例方法。 实例方法可以调用该类中的其他方法;类方法只能调用其他类方法,不能调用实例方法;当类文件加载到内存时,实例方法不会被分配内存空间,只有在对象创建之后才会分配。而类方法在该类被加载到内存时就分配了相应的内存空间。
12、什么是哈希表?
&& 答:哈希表又称散列表,是一种能将关键字映射成存储地址的记录存储技术。要存储数据,先设计一种算法(哈希函数),然后根据数据记录的关键字计算出各记录的哈希码,这个哈希码作为与关键字相关的记录数据的索引。要取出记录,只需要根据哈希函数重新计算,得到哈希码后,便可直接到相应位置去存取。&
13、是否可以从一个static方法内部发出对非static方法的调用?
&&&答:不可以。如果其中包含对象的method(),不能保证对象初始化。
14、在Java转义字符中,&\uxxxx&代表什么?
&& 答:\uxxxx是Java中的字符编码方式,其中前缀 \u就表示该字符是unicode字符,xxxx表示1到4位16进制数,用这种转义字符形式可以表示unicode字符集中的任意字符。
15、switch语句中的表达式可以是什么类型数据?
&& 答:表达式的值可以是byte、short、int和char类型的数据,但不能是float和double类型的数据。&
16、插入数据时,ArrayList、LinkedList、Vector谁速度较快?
&& 答:ArrayList、Vector以数组方式存储数据,插入数据时要进行元素移动操作,因而插入数据慢。LinkedList是一种链表结构,在插入数据时只需要修改链表的前后项指向即可,因此插入速度较快。
17、final, finally, finalize的区别。
&&&答:final&修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
&&& finally是异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
&&& finalize是方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
18、说出一些常用的类,包,接口,请各举5个。&
&& 答:常用的类:BufferedReader,BufferedWriter,FileReader,FileWirter和String等。
&&&常用的包:Java.lang ,Java.awt,Java.io,Java.util和Java.sql等。
&& 常用的接口:Remote,List,Map,Document和NodeList等。
19、多线程的实现方法分别是什么?同步的实现方法分别是什么?&
&& 答:多线程有两种实现方法,分别是继承Thread类与实现Runnable。
接口同步的实现方面有两种,分别是synchronized、wait与notify。
20、当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少?&
&& 答:当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数有n+2个,即除输入的n个字符后,还存储了回车和换行字符。
21、如何实现字符串的分割?
&& 答:第一种方法是采用split()方法,将分割后的内容保存在指定的字符串数组中;第二种方法是采用StringTokenizer,利用StringTokenizer的nextToken()、hasMoreTokens()等方法进行分割。&
22、描述一下JVM加载class文件的原理机制?
&& 答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统。它负责在运行时查找和装入类文件的类。
23、在什么情况下,finally语句不会执行?
&& 答:如果在try内部执行一条System.exit(0)语句终止应用程序的执行,则finally中的语句不会被执行。
24、作用域public,private,protected,以及不写时的区别。
&&&答:具体区别如下:
25、说出重写和重载的区别,重写方法是否可以改变返回值的类型?
&& 答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
&& 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。子类的对象使用 这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被&屏蔽&了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载。
&& 重载的方法是可以改变返回值的类型。&
26、throw和throws有什么区别?
&& 答:throw关键字一般用于方法内部,用于抛出一个异常类对象,一旦异常被抛出后,throw语句后的程序代码将不会被执行。
&&& throws关键字通常出现在方法声明中,用来指定该方法可能抛出的异常。如果可能有多个异常抛出,可以使用逗号将它们分隔开。
27、字符串的compareTo方法结果是什么?
&& 答:使用compareTo()方法可以比较字符串与字符串之间的大小关系。如果当前字符串小于指定字符串,则返回一个小于0的数值;否则返回一个大于0的数值;如果两个字符串相等,则返回0。
28、字符串的连接操作有几种实现方法?&
&& 答:字符串与字符串的连接操作可以通过&+&运算符和concat()方法来实现。另外&+&运算符还可以实现字符串与其他类型数据之间的连接操作,可以与字符串连接的数据类型有:int、long、float、double、boolean、char等。&
29、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?&
&& 答:是值传递,因为在Java语言中只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
30、Class MyClass等价于 Class MyClass extends Object是否正确?&
&& 答:正确。因为Object类是Java中最高层次的类,是所有类的超类。所有的类,都可以说是由Object继承而来,只是我们不需要显式地指明extends Object。
31、数组有没有length()方法? String有没有length()方法?
&& 答:数组没有length()方法,只有length的属性。String有length()方法。
32、面向对象的特征有哪些方面
&& 答:(1)抽象:抽象就是忽略一个主题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:一个是过程抽象,另外一个是数据抽象。
&& (2)继承:继承是一种联结类的层次模型,并且允许类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
&& (3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
&&&(4)多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,同时很好地解决了应用程序函数同名问题。&
33、Java中实现多态的机制是什么?
&& 答:方法的重写和重载是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
34、通过JDBC连接有哪几种方式?
&& 答:JDBC-ODBC bridge driver方式可以访问一个ODBC数据源,但每台客户端计算机需要安装并配置ODBC驱动程序。
&&&Native-API partly Java driver方式将JDBC调用转换成特定数据库API的调用,该方式要求每台客户端计算机安装特定数据库的驱动程序。
&& JDBC-Net pure Java driver方式将JDBC调用转换为独立于数据库的中间件厂商的专有数据库访问协议,然后由其负责与数据库的连接活动。
&& Native-protocol pure Java driver方式将JDBC调用转换为数据库直接使用的标准网络协议(例如HTTP等)。这种方式不需要安装客户端软件,客户端计算机可以直接与数据库服务器进行数据&交流&活动。&
35、List、Map、Set三个接口,存取元素时,各有什么特点?
&& 答:List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。&
36、在比较对象时,&==&运算符和equals运算有何区别?
&& 答:&==&运算符表示两个对象引用的地址是否相等,equals运算符则表示两个对象引用的内容是否相等。&
37、什么是循环嵌套?其特点是什么?
&& 答:循环的嵌套,是指在一个循环语句的循环体中又包含另一个完整的循环语句。多重循环语句的特点是:外层循环变量相对稳定,内层循环变量逐一变化,即:&多层循环,内(层)外(层)有别,外(层)变一次,内(层)变一遍。&
38、char型变量中能不能存贮一个中文汉字?为什么?&
&& 答:能够定义成为一个中文的,因为Java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的。&
39、error和exception有什么区别
&& 答:error&表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。
&& exception&表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况
40、如何实现Java序列化?
&& 答:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,它只是为了标注该对象是可被序列化的,然后需要使用一个输出流来构造一个ObjectOutputStream对象,接着使用ObjectOutput
Stream对象的writeObject()方法就可以将参数为obj的对象写出,要恢复的话则需要使用输入流。
41、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
&& 答:字节流和字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在Java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
42、String s=new String(&a&);共创建了几个String对象?
&& 答:两个。其中包括一个字符对象和一个字符对象引用对象。}

我要回帖

更多关于 boolean类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信