`

java 基础深入

阅读更多

父类引用指向子类对象:

 从对象的内存角度来理解试试.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
Father f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
Son s1 = s;//s1指向那1.5M的内存.
Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

 

多态:

多态性是指统一的接口,不同的表现形式。

总结:多态--》父类或者接口类型的引用指向子类或者实现该接口的类的对象..(多态是个运行时的行为..体现父与子的关系)

Java根据动态绑定决定执行“更具体”的方法,即子类方法。

http://liyanhui.iteye.com/blog/167853

 

2.对final类型的成员变量的初始化方式

   1.生明变量时直接赋值

   2.在生构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作

   3.对于final类型的引用变量来说,所谓的不能改变指的是该引用不能改变,但该应用所指向的对象的类容就可以该变的

 

三,一个类的声明可否既是abstract 又是final类型的呢?

    abstract 要求当前类被继承。而final不能被继承。。矛盾。了。。

四,pubic final类型的变量为什么一般都加上static呢?

  public class Test

{

   public static final str='aa';

}

   这样写的好处是节省内存。不加static的话。。如果Test有个100个变量的话就会在内存中有100个str的拷贝。加上了static只会有一个。。。

五。 ==  和equals的区别

   不要简单的说。。==比较内存地址。。equals比较的是内容。---》这是对String

  而对Object来说equals 其实还是比较的内存地址。。这是因为String 和Object的equals的实现是不一样的。。

六。HashSet ...

     当向集合set中增加对象时。首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为对象在集合不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。。

  对于于Object类型来说。。hashCode就是该对象的内存地址。。

 通常重写equals方法时,必须重写hashCode方法,如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象必须具有相同的hashcode

七。Arraylist linkedlist vector的区别?

      Arraylist底层是用数组来实现的。,底层会生成一个长度为10的数组来存放对象。。

     Vector 底层也是用数组来实现的。

    Arraylist的所有方法都不是同步的,,对于Vector。。大部分的public方法是同步的。。

   对于Arraylist ,查找速度非常快,增加和删除操作非常慢。(本质上是由数组的特点来决定的)

   LinkedList底层是用双向链表业实现的。。查找速度非常的慢..,增加和册除是非常的快的(本质是由双向链表业实现的)

八。关于匿名内部类:该类一定是继承了某个父类或实现了某个接口

九。泛形中。。的 ?等价于 ? extnds Object

十。简单的单态的实现:

     pubic class Singleton

{

     private static Singleton sigleton =new Singleton();

 

     private Singleton(){}  //防止外面NEW

 

     public static Singleton getInstance()  

     {

       return  sigleton;

     }

十一。关于wait,notify,notifyAll以及sleep方法的关系

        1.如果一个线程调用了某个对象的wait方法,那么该线程首先必须要拥有该对象的锁(换句话说,一个线程如果调用了某个对象的wait方法,那么该wait 方法必须要在synchronized中)

       2.如果一个线程调用了某个对象的wait方法,那么该线程就会释放对象的锁

       3.在java对象中,有两种池(锁池,等待池)

       4.如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁),如果未来某一时刻,另外一个线程调用了相同的对象的notify或者notifyAll方法,那么在该等待池中的等待的线程就会起来进入该对象的锁池中,去等待获得该对象的锁,如果获得锁成功后,那么线程将沿着wait方法之后的路径去执行。

       5.sleep(long time),如果一个线程调用了sleep方法睡眠,那么在睡眠的同时,它不会失去对象的锁的拥有权。

十二。关于synchronized关键字的作用

     1.在某个对象的所有synchronized方法中,在某一时刻,只能有一个唯一的一个线程去访问这些synchronized方法

     2.如果一个方法是synchronzied方法,那么该synchronized关键字表示给当前对象上锁(即this)

     3.如果一个synchronized方法是静态(static),那么该synchronized关键字表示给当前对象所对应的Class对象上锁.(每个类,不管生成多少对象,其对应的Class对象只有一个)

十三。关于初始化阶段:servlet 有几种初始化方式呢?

     1.客户端第一次访问该servlet,那么该servlet将被实例化

      2.可以通过在web.xml文件中,配置servlet的启动参数,让服务器启动后,该servlet自动完成实例化.

 

 十四。Iterator 的删除问题?

 

  eg:  list<String> list=new ArrayList<String>();

         list.add("aa");

         list.add(''bb');

         list.add("aabb");

 

        for(Iterator it=list.itrator();it.hasNest();)

         {

            it.remove();// 这样可以正常删除的

            list.remove()//会报异常  (注要与itrator的内部实现有关的)

         }

  十四。Socket编程总结

     使用ServerSocket 和Socket实现服务器端和客户端的Socket通信

    总结:1)建立Socket连接2)获得输入/输出流3)读/写数据4)关闭输入/输出流5)关闭Socket

 十五.数组的定义

       String [] arr = null;//表示定义数组。
 String [] arr = new String[10];//表示创建数组。
 Integer [] a = new Integer[]{1,2,3};//创建数组并赋值
 String [][] two = new String[4][5]; //二维数组创建。
 String [][] two = {{"A","b"},{"c","d"}};//二维数组初始化
 int[][][] b = {
          {{1,2,3},{1,2,3}},
            {{3,4,1},{2,3,4}}
               };
 //多维数组

16.runtimeException 和checked Excepton的理解:

从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。

checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。MalformedURLException就是一种checked exception。设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。

ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。对于这个异常,调用方无法处理/纠正。

runtime exception用来指示一种调用方本身无法处理/恢复的程序错误。而程序错误通常是无法在运行过程中处理的,必须改正程序代码

 

17.线程:http://java.chinaitlab.com/line/768283_4.html

18. io   http://edu.codepub.com/2010/0623/23718.php

 

 

Java IO 的一般使用原则 : 

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

 

 

wait() 必须在synchronized 函数或者代码块里面
// wait()会让已经获得synchronized 函数或者代码块控制权的Thread暂时休息,并且丧失控制权
// 这个时候,由于该线程丧失控制权并且进入等待,其他线程就能取得控制权,并且在适当情况下调用notifyAll()来唤醒wait()的线程。
// 需要注意的是,被唤醒的线程由于已经丧失了控制权,所以需要等待唤醒它的线程结束操作,从而才能重新获得控制权。
//
// 所以wait()的确是马上让当前线程丧失控制权,其他的线程可以乘虚而入。
//
// 所以wait()的使用,必须存在2个以上线程,而且必须在不同的条件下唤醒wait()中的线程。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics