父类引用指向子类对象:
从对象的内存角度来理解试试.
假设现在有一个父类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()中的线程。
分享到:
相关推荐
java从基础到深入教程很实在很实用的!都是搜集来的经典案例!
本文将深入探讨Java基础练习代码中的关键概念,帮助初学者巩固基础,提高编程技能。 首先,Java是一种面向对象的编程语言,它的核心特性包括封装、继承和多态。在练习代码中,你会看到如何定义类(class)并创建...
《深入体验Java_Web开发内幕—核心基础》是一本针对Java Web开发的深度解析书籍,旨在帮助读者全面理解和掌握Java Web开发的核心技术。这本书涵盖了从基础到高级的多个主题,旨在提供一个完整的Java Web开发学习路径...
Java基础学习课件PPT是一套全面覆盖Java SE(标准版)基础知识的教育资源,适合初学者和希望巩固Java技能的开发者。这套课件旨在在一个月内帮助学习者掌握Java编程的核心概念,为深入学习和应用Java技术打下坚实的...
JAVA基础资料大全涉及的详细知识点如下: 1. Java开发环境搭建:介绍Java的开发环境,包括JDK的下载、安装、校验,以及JDK与JRE的区别和作用。 2. Java基础语法:包括程序的基本结构,如数据类型、变量、常量的...
《Java基础入门(第3版)》是一本针对Java初学者的教材,其课后答案文档提供了对书中习题的解答,旨在帮助读者巩固所学知识。Java是一种面向对象的编程语言,具备跨平台性,由Java虚拟机(JVM)负责解释执行。Java...
深入了解Java语言基础,掌握其核心概念与应用技巧 Java,作为一种全球范围内广泛应用的编程语言,其强大之处在于它不仅是一种编程语言,同时也提供了一个开发环境和运行环境,具备跨平台、面向对象、分布式处理等...
《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其教学设计旨在通过实例引导学生深入理解Java语言的核心概念。本教程覆盖了从环境搭建到程序设计的各个环节,旨在帮助学生建立起坚实的...
这份“Java基础教程PPT”是为初学者设计的,旨在帮助他们掌握Java编程的基础概念和技能。 首先,PPT可能会从Java的历史和特性开始讲解。Java由James Gosling在1995年推出,目标是“一次编写,到处运行”。它的主要...
3. 输入/输出(IO)流:Java的15IO流.md文件深入解析了IO流的使用,包括文件流、字符流、字节流以及缓冲流的处理。IO流是数据传输的桥梁,允许程序与外部设备进行数据交换。 4. 多线程:在10多线程.md中,介绍了...
这份"Java基础知识精讲"的资料深入浅出地介绍了Java的核心概念,是初学者理想的入门指南。以下将详细介绍其中可能涵盖的知识点。 1. **Java简介**:讲解Java的发展历史,其跨平台的特性(Write Once, Run Anywhere...
Java是一种广泛使用的...总的来说,这份"Java基础PPT"将带领学习者深入理解Java语言的基本概念和用法,为进一步的Java开发打下坚实的基础。通过细致的学习和实践,开发者可以熟练掌握这些知识,并运用到实际项目中去。
【Java基础知识点】 1. **Java的起源与特性** - Java是由SUN Microsystems公司(后被Oracle收购)开发的一种面向对象的编程语言。 - Java有三个主要版本:Java Standard Edition (JavaSE),用于桌面应用;Java ...
【清华大学JAVA基础教程】是一份专为初学者设计的JAVA编程入门资料,旨在帮助学习者快速掌握JAVA语言的基础知识和核心概念。这份教程全面而详细地介绍了JAVA这门广泛应用于软件开发、移动应用、大数据处理等多个领域...
Java基础教程是初学者入门编程世界的一把钥匙,它涵盖了编程的基本概念以及Java语言的核心特性。这份PDF教程旨在提供一个全面而深入的学习路径,让你能够快速掌握Java编程的基础。 首先,我们从第1章“Java语言基础...
本套Java基础教学课件旨在全面介绍Java的核心概念和技术,帮助初学者建立起坚实的基础,逐步掌握编程技能。 首先,Java语言的基础部分涵盖了变量、数据类型、运算符和控制流程。在Java中,变量是用来存储数据的容器...
张孝祥 老师的经典力作!!! 清晰的PDF电子书《深入体验Java_Web开发内幕-核心基础》——地球人都知道,呵呵。。
动力节点的《Java基础301集》是一个全面且深入的Java入门教程,涵盖了从基础知识到高级特性的广泛内容,适合Java初学者和寻求巩固基础的学习者。以下是一些主要的知识点详解: 1. **数据结构**:教程详细介绍了单项...
"黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...