Java知识点回顾一

本文深入讲解Java中的核心概念,如引用类型的转型、封装、继承、多态等,并详细阐述构造函数的特点及使用方法。此外,还对比分析了HashMap与Hashtable、ArrayList与Vector的区别。
摘要由CSDN通过智能技术生成

Java基础

 

引用类型的造型是指多态的应用,是引用类型的转型,即将父类的引用指向子类的对象。

具体转换规则:

1.非final类可以被造型为非final类、final类、接口或数组。

2.final类可以被造型为非final类、final类或接口,但不能造型为数组。

3.接口可以被造型为非final类、final类或接口,但不能造型为数组。

4.数组可以被造型为final类或数组,但不能造型为final类和接口。

 

对象和类(封装、继承、多态)

封装:就是对属性和方法的载体类,只能通过其提供的接口(方法)来访问,而把实现的细节隐藏起来。

代码重用:有两种方式,即组合(has  a关系)和继承(is a 关系)Has a 关系通过定义类属性的方式来实现,而is a关系通过类继承来实现。

 

当一个类实现了一个接口时,如果没有实现接口中定义的所有方法,则该类应声明为一个抽象类,否则会产生编译错误。

 

多态指子类和父类 均具有同名的方法,并且允许父类引用指向子类的对象,即允许把一个子类对象赋予一个父类的引用型变量。在运行期间,由系统自动判定应该调用子类的方法还是父类的方法。

 

this 关键字代表当前对象,即this引用的是当前创建的类实例对象的句柄。

 

构造器(构造函数)只能由修饰符publicprivateprotected修饰。

 

new 语句执行以下操作:

(1)为新对象分配内存空间并将其成员变量根据声明类型初始化为默认值。

(2)执行类体中的初识化。

(3)执行构造函数。

(4)变量被分配为一个到内存堆中的新对象的引用。

 

构造函数不能被继承,它和每个类紧密相连,且每个类都必须定义自己的构造函数。

若未显示声明构造函数,则系统将创建一个缺省的默认构造函数。

 

在同一个类的不同构造函数中调用该类的其它构造函数需要使用this(..)的形式,而且必须是在构造函数的第一行调用。

 

在子类中直接调用父类的构造函数,必须使用super(...)语句。如果调用super(..)语句,其必须放在调用其构造函数的第一行。

 

不能在构造函数中同时调用this()super()语句,因为它们都要求位于第一行。

例如:public Test extends Tool{ 

Private String name;

Public Test(){}

Public Test(String name){

This();

Super();//不能同时出现

}

 

Java 中的构造函数同一般方法一样,可以抛出异常,如果父类默认构造函数抛出一个异常,子类的默认构造函数应该处理父类抛出的异常。

 

构造函数是一种很特殊的函数,因为他没有返回值。这和返回值为void’有极大的差别。返回void时,一般函数并不返回任何东西,但是一般的函数能 够选择是否要返回些什么东西。构造函数则绝对不返回任何东西,而且你也没有任何选择。如果它有一个返回值,而且你有权利选择你自己的返回型别 (return type),编译器势必得通过某种方式来知道如何处理那个返回值。

--摘自《Think in Java》第二版

 

 

 

重写(Override)与重载(Overload

重载的方法之间必须拥有不同的参数列表,即要求参数列表中参数的个数、排列顺序或类型不同。

重写的方法之间必须拥有相同的方法名和参数列表,即要求参数列表中参数的个数、排列顺序以及参数的类型要相同。

 

 

内部类

Java中,对内部类的嵌套层次没有限制。

 

内部类同一般类一样可以实现接口。

 

内部类如同类其它成员一样,对整个类具有访问权,所以可以访问其所在类的所有属性,包括私有属性。即使是定义在一个方法中的内部类,也可以访问这些类成员属性。

 

因为static的意义是属于类范畴的,而不是属于类实例范畴。静态类部类对变量的访问,如同一个静态方法只能访问被声明为静态的类属性一样,只能访问声明为静态的变量。

 

非静态内部类如同其他非静态属性一样是附属与类实例的,因此内部属性不应声明为静态的。

 

成员内部类其本身归根结底依然是类,而且也具有类成员的特性,因此可以被不同的访问修饰符修饰。

 

由于内部类如同类其它成员一样,所以可以被类中其它成员访问。由于其实质依然是类,所以对其定义的方法的掉用,还是需要通过类实例来获得。

 

一个定义在方法体中的内部类只能访问方法中定义的被声明为final的局部变量。原因在于,定义在方法体中的变量会随着方法的退出而消亡,通过定义其final变量,可以扩展其生命期,可与访问其他类实例的生命期相结合,因为类实例的生命期不同于方法和其所属变量,它是由系统自动控制回收时机的。

 

定义在方法体中的内部类,其前面不能添加任何访问修饰符,其如同一个方法中的而局部变量一样,完全属于方法,而且也更不能加静态(static)修饰符

 

匿名内部类

匿名内部类的定义形式为new Xxx*(){}

匿名内部类可以实现接口或继承其他类,但不能同时既实现接口又继承类。

匿名内部类不能有任何明确的构造器。

匿名内部类不能被abstract 和 static 修饰符修饰。

匿名内部类默认是final类。

 

定义匿名内部类的格式如下:

new 父类构造器(实参列表) | 实现接口()

{

     //匿名内部类的类体部分

}

从上面定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。

 

关于匿名内部类还有如下两条规则:

1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类。

2)匿名内部类不能定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情。

 

Java线程(运行、就绪、挂起、结束)

Java支持多线程,其生命周期共有5个状态

(1)创建状态   当一个线程实例被创建时,线程处于新建状态,此时的线程已经被初始化并分配了资源。

(2)就绪状态 线程已经具备运行条件,进入线程队列,排队等待CPU。一旦获得CPU使用权,就可以进入运行状态。

(3)运行状态 当就绪状态的线程被调度获得CPU资源时,便进入运行状态。定义在线程体中的run()方法被调用,从方法体第一条语句开始顺序执行。

(4)阻塞状态 处于运行状态的线程因事件的发生,而导致让CPU使用权,并终止当前执行,进入阻塞状态。处于阻塞状态的线程,只有当引起阻塞的原因被消除后,先必须转入就绪状态,才可在获取CPU使用权从原来中止处开始继续执行。

(5)死亡状态 线程死亡的原因有两个,一个是正常运行的线程执行完全部工作,即执行完了run()方法,并正常退出;另一个是线程被提前强制终止,例如调用destroy()方法。处于死亡状态的线程不能被重新启动,即不具有继续运行的能力。如果启动一个处于死亡状态的线程,则IllegalThreadStateException异常被抛出。

 

 

Java创建线程有两种方式

一种是实现Runnable接口,另一种是扩展Thread类。

 

通过start()方法启动线程,执行run()方法。调用start()方法只是启动线程,并不意味着线程可以立刻得到执行,这取决于线程获取资源的情况和CPU的占有情况。

 

通过调用setDacmon(boolean)方法可以将一个线程设置为后台线程,该方法应在线程启动前调用,否则会抛出IllegalThreadStateException异常.

 

Java语言中每个线程都有一个优先级。优先级是一个取值范围在1~10之间的一个整数,具有优先级高的线程优先执行。在Thread类上定义了3个静态整型常量,MAX_PRIGRITYMIN_PRIORITYNORM_PRIORITY代表最大优先级、最小优先级、默认优先级,3个常量分别对应的整型值为1015

 

Wait() 和 notify()方法是定义在Object类中的,用于实现线程的同步机制。Thread类本身并没有这两个方法的定义。

 

 

Synchronized 关键字用于修饰同步化代码。在两个线程同时试图访问某一数据时避免数据毁损。每个对象都包含了一把锁,它自动成为对象的一部分,不必为此写任何特殊的代码。调用任何被声明为同步的方法时,对象就会被锁定,不可再调用该对象上的其他任何同步方法,除非第一个方法完成结束,并解除锁定。

 

 

常用的集合类有一下几种:
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack
Map结构的集合类:HashMap类,Hashtable
Set结构的集合类:HashSet类,TreeSet
Queue结构的集合:Queue接口 

HashMapHashtable的区别:
HashMapHashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点
以下是他们的区别:
1.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMapjava 1.2引进的Map接口的一个现实。
2.同步性
Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的, 而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的结合那么使用 HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率,我们一般所编写的程序都是异步的,但如果是服务器端的代码 除外。
3.值:
HashMap可以让你将空值作为一个表的条目的keyvalue
Hashtable是不能放入空值(null)的

ArrayListVector的区别:
ArrayListVector都是java的集合类,都是用来存放java对象,这是他们的相同点,
区别:
1.同步性:
Vector 是同步的,这个类的一些方法保证了Vector中的对象的线程安全的,而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全 的,因为同步要求会影响执行的效率,所以你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开 销。
2.数据增长:
从内部实现的机制来讲,ArrayListVector都是使用数组(Array)来控制集合中的对象,当你向两种 类型中增加元素的时候,如果元素的数目超过了内部数组目前的长度他们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长 度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大,所以如果你要在集合中保存大量的数据,那么使用 Vector有一些优势,因为你可以通过设置集合的初始大小来避免不必要的资源开销。

总结:
1)如果要求线程安全,使用VectorHashtable
2)如果不要求线程安全,使用ArrayListLinkedListHashMap
3) 如果要求键值对,则使用HashMapHashtable
4)如果数据量很大,又要求线程安全考虑Vector

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值