**
java基础
**
一、java编程基础**
Java标识符:字母,数字,下划线,$.不能以数字开头,不能是关键字
变量的数据类型:
基本数据类型:
数值型:整数类型:byte。short,int,long
浮点类型:float,double
字符型:char
布尔型:boolean
引用数据类型:类,接口,数组,枚举,注解(annotation)
方法重载:与返回类型无关,直须满足两个条件一是方法名相同,二是参数个数和参数类型不同,返回类型可同可不同。
方法重写:子类中重写的方法需要和父类中的方法具有相同的方法名,参数列表以及返回值类型。
注意:子类重写父类的方法时,不能使用比父类中被重写的方法更严格的访问权限。例子:父类的方法用public修饰,则被子类重写不能使用private修饰。
super关键字:
子类重写父类的方法后,子类对象将无法访问父类被重写的方法
注意:super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
二、面向对象
封装:面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体的实现细节,这就是封装思想。
继承:主要描述类与类之间的关系,通过继承可以无须重新编写原有类的情况下,对原有类的功能进行扩展。优点:增强代码的复用性,提高开发效率,而且为程序的修改和补充提供了便利。
类的继承是指在现有类的基础上构建新的类,新建的类为子类,现有的类为父类。需要用extends关键字。
注意:1.类只支持单继承,不允许多重继承。例子;C类不能同时继承A类和B类。2.多个类可以继承一个父类。例子;类B和类C可以继承类A。
3.Java中多层承是可以的,一个父类可以再去继承另外的父类。
多态:多态性指的是程序中允许出现重名现象,它旨在一个类中定义的属性和方法被其它类继承后,他们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同类的中具有不同的语义。
在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态。
优点:多态不仅解决了方法同名的问题,而且还是代码变得更加灵活,从而提高程序的可扩展性和可维护性。
类的构造方法:特点;1.没有返回值;2.构造方法的名称要与本类名相同;3.在方法中不能使用return语句返回一个值;4.若类不含构造方法系统会自动提供一个默认的构造方法。
this关键字:this调用构造方法注意事项
1.只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。
2.在构造方法中,使用this构造方法的语句必须位于第一行,且只能出现一次。
3.不能在一个类的两个构造方法中使用this相互调用。
static关键字:静态变量:static修饰的成员变量,该变量被称为静态变量,可以被所有实例共享,可以调用“类名.变量名”来访问。例子,当一个学校名称可以被所有学生共享,那这个学校名可以被static修饰。可以减少对象对内存的占用。
片· 静态方法:在不创建对象的情况下可以调用某个方法,方法不需要和对象绑在一起。我们只需要在类中定义的方法前加上static即可满足。可以调用“类名.方法名”来访问。
注意;一个静态方法中只能访问用static修饰的成员,没有被修饰的成员需要先创建对象才能够被访问,而静态方法在被调用时可以不创建任何对象。
静态代码块:用static修饰的并且使用一对大括号围起来的若干行代码被叫做静态代码块。类加载时,静态代码块会执行,由于类加载一次,因此静态代码块也只执行一次。
静态内部类:static修饰的成员内部类。它可以在不创建外部类的情况下被实例化。创建静态内部类对象的具体语法:外部类名.内部类名 变量名=new 外部类名.内部类名();
单例模式:java中的一种设计模式,它是指设计一个类时,需要保证在整个程序运行期间只针对该类只存在一个实例对象。例子:世界只有一个月亮,我们设计一个类表示月亮,那么这个类只能有一个实例对象,不能违背事实存在的。
final关键字:被final修饰的类无法被继承,修饰的方法不能够被子类重写,修饰的变量是常量。只能赋值一次,不能被修改。
抽象类:定义一个类时,常常需要定义一些方法来描述该类的行为特征,但是有时这些方法的实现是无法确定的。例子:动物发出叫声但是每个动物的叫声是不同的。shout()方法无法准确描述动物叫声。所以Java允许定义方法时不写方法体,
不包含方法体的的方法为抽象方法,且抽象方法必须使用abstract关键字来修饰。 abstra void shout();
注意:1.包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需要用abstr修饰即可。
2.抽象类是不可以被实例化的,因为抽象类中可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。
接口:如果一个抽象类中的所有方法都是抽象的那可以用将这个类用另一种方式定义,就是接口。定义接口需要使用interfa关键字来声明。
注意:接口中的方法不需要用abstract来修饰。因为接口中定义的方法默认使用“public abstract”来修饰,即抽象方法。接口中的变量默认使用“public static final”来修饰,即全局常量。
接口中的方法都是抽象方法,不能通过实例化对象的方式来调用接口中的方法。那我们需要定义一个类,并且使用implements关键字实现接口中所有方法。
当一个类实现接口时,如果这个类是抽象类则可以实现接口中的部分方法,否则就要实现接口中的所有方法。
一个类通过implements关键字实现接口时,可以实现多个接口。多个接口名用逗号隔开。
一个接口可以通过extends关键字继承多个接口,接口之间用逗号隔开。
一个类继承另一个类的同时还可以实现接口,此时extends关键字必须位于implements关键字前面。
异常:Java中提供了大量的异常,这些类都是继承自java.lang.Throwable类。直接子类Error和Exception。
Error类:称为错误类,他表示Java运行时产生的系统内部错误或资源耗尽的错误是比较严重的,仅靠程序本身是不能恢复执行的。例子;盖楼偷工减料,最后大楼坍塌就是一个Error。
Exception类:称为异常类,他表示程序本身可以处理的错误。Exception类中有个特殊的RuntimeException类,表示运行时异常,其他的叫做编译时异常。
try…catch和finally
因为发生了异常程序就无法继续向下执行。Java提供了对异常进行处理的方式——捕获异常。通常使用try…catch语句。try代码块中编写可能发生的异常的Java语句,catch代码块中编写针对异常进行处理的代码。若try代码中发生异常则系统
会将这个异常的信息封装成一个异常对象,传递给catch代码块。catch代码块需要一个参数指明它所能接收的异常类型,这个类型必须是Exception类或其子类。
finally;当catch代码块中增加return语句,结束当前方法,然而finally中的代码仍然会执行,不会被return影响。需要注意的是,finally有一种情况下不会执行,就是在try…catch中执行了System.exit()语句。表示退出当前的java虚拟机,Java虚拟机停止了,
任何代码都不能再执行了。
throws关键字:Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常,这样调用者在调用方法时,就明确的知道该方法有异常,并且必须在程序中对异常进行处理,否则编译无法通过。
throw关键字:自定义异常,throw关键字抛出异常对象时,需要使用try…catch语句对抛出异常进行处理,或者使用throws关键字声明抛出异常,由该方法的调用者负责处理。
三、多线程
进程:在一个操作系统中,每一个独立执行的程序都可以称为一个进程,也就是“正在运行的程序“
线程:在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。
/当一个Java程序启动时,就会产生一个进程,每一个进程至少存在一个线程。
多线程的创建:Java提供了两种多线程实现方式,一种是继承java.lang包下的Thread类,覆写了Thread类的run()方法,在run()方法中实现运行在线程上的代码;
另一种是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
实现接口比较继承thread类的好处:1.多个相同程序代码的线程去处理同一个资源得情况,把线程同程序代码,数据有效的分离,很好的体现了面向对象的设计思想。
2.因为java类的单继承,无法使用一个已经继承某一个类的子类创建线程,即一个类不能拥有两个父类,所以就不能继承Thread类的方式,所以只能采用实现Runable
接口的方式。
线程的生命周期:当Thread对象创建完成时,线程的生命周期便开始了。当run()方法中代码正常执行完毕或者线程抛出一个未捕获的异常或者错误时,线程的生命周期便会结束。
线程整个生命周期可以分为五个阶段:新建,就绪,运行,阻塞,死亡。
线程休眠:静态的sleep()方法,休眠结束后线程重新返回到就绪状态,而不是立即开始运行。
线程让步:yield()方法,可以使当前正在运行的线程暂停。与sleep()方法有点相似,区别在于yeild()方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次。
提示:当某线程调用yeild()方法时,只有与他线程优先级相同或者优先级更高的线程才能获得执行机会。
补充(线程的优先级);线程的优先级越高获得CPU执行的机会就越大。线程的优先级用1-10之间的整数表示。数字越大,优先级越高。
还可以用Thread类中提供的三个静态常量表示线程的优先级。
static int MAX_PRIORITY 相当于数字10;
static int MIN_PRIORITY 相当于数字1
static int NORM_PRIORITY 相当于数字5
线程插队:当某个线程调用其他线程的join()方法时,调用的线程将被阻塞,直到被join()方法加入的线程执行完成后他才会继续运行。
同步代码块:为了保证多线程的安全,可以将共享资源的代码放在同一个代码块中,使用synchronized关键字来修饰。
同步方法;被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后。其他线程才会有机会执行方法。
同步优点:解决了多个线程访问的共享数据时的线程安全问题。缺点;线程在执行同步代码时都会判断锁的状态,非常消耗资源,效率较低。
死锁问题:两个线程在运行时都在等待对方的锁。造成了程序的停滞,这种现象称为死锁。
多线程通信:在多线程的程序中,多个线程之间需要协同完成工作,就需要线程之间进行通信。
如果希望多线程按照一定的顺序轮流执行,就需要让线程间进行通信。Object类提供了wait(),notify()和notifyAll()方法来解决线程通信问题。
void wait():功能描述:使当前线程放弃同步锁进入等待,直到其他线程进入此同步锁,并调用notify()方法,或notifyAll()方法唤醒该线程为止。
void notify():唤醒此同步锁上等待的第一个调用wait()方法的线程。
void notifyAll(): 唤醒此同步锁上调用wait()方法的所有线程。
注意:三个方法的调用者都应该是同步锁对象,如果这三个方法的调用者不是同步锁对象,Java虚拟机就会抛出异常。
四、Java API:
java API:指的是应用程序编程接口,就是JDK中提供的各种功能的Java类。
String类和StringBuffer类(字符串缓冲区)
区别:字符串是一个常量一旦创建内容和长度是不可修改的。而stringbuffer类他的内容和长度是可以修改的。类似于一个字符容器,当对字符增加或者删除时不会产生新的stringbuffer对象。
==和equals()比较:equals()方法用域比较两个字符串中的字符是否相等,==方法用于比较两个字符串对象的地址是否相同。
注意;string类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法,所以在比较时,打印结果为false;
string类对象,字符与字符可以使用“+”打印输出,而stringbuffer类则会编译出错。
五、集合
集合类:按照存储结构可以分为两大类,即单列集合Collection和双列集合Map。
Collection:集合类的根接口。两个重要的子接Llist和Set。
List:存储元素是有序,元素可重复。主要实现类有ArryList(线程不安全,查询快增删慢,底层原理基于数组)和LinkedList(增删快,底层原理双向链表)和Vector(线程是安全的,该类提供了elements()方法用于返回Enumeration对象,
可通过该对象遍历集合中元素)。
Set:元素无序且不可重复。主要实现类有HashSet和TreeSet。
HashSet:根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。(存储元素是不可重复的,并且元素都是无序的)
TreeSet:以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。特点:存储的元素会按照大小排序,并能去除重复的元素。
Map:双列集合类的根接口,用于存储键值映射关系的元素。每一个元素都包含一对键值,使用集合时通过指定的Key找到对应的Value。主要实现类HashMap和TreeMap。
HashMap:它用于存储键映射的关系,但必须要保证不出现重复的键。
TreeMap:用来存储键值映射关系的,其中不允许出现重复的键。TreeMap是通过二叉树的原理来保证键的唯一性,与TreeSet的原理一样。TreeMap中的所有键是按照某种顺序排列的。
附:Map'接口中还有一个实现类Hashtable,它与HashMap十分相似,区别在于Hashtable是线程安全的,但是存取元素的速度很慢,目前基本上被HashMap取代,但Hashtable类有个子类Properties再实际运用中很重要,主要yonglai存储字符串类型的键和值。
注意:Map中的键必须是唯一的,不能重复,如果存储了相同的键后存储的值会覆盖原有的值。即键相同,值覆盖
Collections工具类:它是工具类用来操作集合位于java.util包中。它提供了大量的方法用于对集合中的元素进行排序,查找和修改等操作。(Collection和Collections区别)
Arrays工具类:专门用于操作数组的工具类该类提供了大量的静态方法。
Iterator接口:主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。提供hasNext()方法和next()方法。迭代的方向是正向方向,从集合中第一个元素向最后一个元素迭代。
ListIterator接口:Iterator的子类提供了hasPrevious()方法和previous()方法可以实现反向迭代元素。
foreach循环:用于遍历数组或集合中的元素。foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素,但它会自动遍历容器中的每个元素。
注意:使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。
泛型:集合可以存储任何类型的对象,但是当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就变成了Object类型。解决这一问题java引入了“参数化类型”即泛型。
ArrayLis<参数化类型> list = new ArrayList<参数化类型> () ;
IO(输入输出):
按操作数据的不同可以分为字节流和字符流。
按照传输方向不同可以分为输入流和输出流,程序从输入流中读取数据,从输出流中写入数据。
六、网络通信:
TCP协议与UDP协议
TCP协议称为传输控制协议;面向连接的通信协议。发送端和接收端建立逻辑连接,然后再传输数据。每次连接的创建都需要经过“三次握手”。
第一次握手,客户端向服务端发出连接请求,等待服务器确认;
第二次握手,服务器向客户端回送一个响应,通知客户端收到了连接请求;
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
UDP协议为数据报协议;它是无连接通信协议,当存在数据传输时,发送端和接收端不建立逻辑连接。即不确认是否有接收端接收数据,接收端也不反馈是否收到数据。
优点:消耗资源少,通信效率高,常用于音频,视频和普通数据。缺点:不能保证数据的完整性。