JAVA OO(面向对象)
面向对象:万物皆对象,对象因我关注而产生.
数据的封装形成对象
对象是存在的具体实体,具有明确定义的特征和行为
面向对象:一种认识事物的方式,注重对事物整体的认知,最符合人类自然的思维习惯
OOP:面向对象编程
OOA:面向对象分析
OOD:面向对象设计
面向对象的三个特征:继承、封装、多态
一、 结构化和OO的区别
在结构化编程中,程序围绕着要解决的任务来设计;
面向对象编程中,程序围绕着问题域中的对象来设计。
面向过程:优点 性能比面向对象高,因为类
属性是名词 , 行为是动词
属性是指对象身上的特性,行为是指对象产生的一系列动作。
二、
类:是具有相同属性和行为的一组对象的集合
类是对象的抽象,对象是类的实例。
Java中数据类型分为基本数据类型和引用数据类型
基本数据类型的变量中存放的是具体的数据。而引用数据类型变量中存放的是对象引用(地址)
基本数据类型有8种:byte、short、int、long、float、double、char、Boolean;
整型和整型运算,至少是int类型。
+=(有+=包含了类型转换);x +=y(等于x =(int)(x+y))
引用数据类型有3种:类、数组、接口
成员变量和静态变量的区别:
1、 成员变量包含在对象值中,每一个对象都有独立的成员变量。一个对象成员变量的改变,不会影响别的对象。静态变量独立在对象之外,所有的对象共享静态变量。静态变量值的改变,会影响所有变量。
2、 成员变量跟随对象存放在堆空间中,静态变量存放在数据段中。
3、 静态变量在类加载时产生,产生在对象之前。成员变量随对象产生而产生,,随对象销毁而销毁。
4、 、静态变量可以通过对象.和类名.的方式访问。而成员变量只能通过对象.的方式访问。
垃圾回收机制:是内存中没有被变量引用,同时没有被使用的对象。
Null表示在引用类型变量中,没有存放任何对象的引用。对null值调用属性和方法,会抛出空指针异常。(java.lang.NullPoiinterException(出现这个表示))
堆中存放new出来的对象 特点:随着对象产生而产生,随对象销毁而销毁。
栈中存放的局部变量 特点:当方法和语句块一结束,空间马上释放 先进后出的释放
数据段中存放的是类变量、常量 特点:长驻内存,创建好以后,不会消失
代码段中存放的是方法的定义 特点:在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
在一个包(package)如果要使用另一个包中的类,那么需要通过import导入该类。本包中的类和java. Lang 包中的类无需导入就可使用。
包的作用:
1、 可以组织相关的类
2、 可以做到信息的隐藏
方法:
成员方法和静态方法的区别:
1、 成员方法可以通过对象.的方式调用,静态方法可以通过对象.和类名.的方式访问。
2、静态方法在类加载时加载,不能直接访问成员变量和成员方法。
成员方法在产生对象时加载,可以直接访问成员变量,成员方法,静态变量,静态方法。
在方法之间传递和返回对象,传递和返回的是对象的引用
方法重载:方法发生在同一个类中,两个方法的方法名相同,参数列表不同(类型、个数、顺序),根据调用方法的实参,来决定执行哪个重载方法。
构造方法(构造器):构造方法的方法名和类名相同,没有返回类型(包括void)。构造方法主要用于产生对象。(如果一个类声明为public,那么该类的类名与文件名必须一致)
构造方法的作用:
1、 为对象在堆空间中分配空间。 ((静态变量在类加载时,完成初始化)知道就好 ,)
2、 初始化成员变量。
3、 返回对象的引用。
如果一个类没有定义构造方法,虚拟机会默认分配一个共有的无参构造方法。如果该类中定义了构造方法,默认的无参构造方法就会消失。
构造方法不能继承,但是,子类需要在子类的构造方法中调用父类构造方法产生父类对象。
在方法中访问变量,会优先访问局部变量。如果局部变量不存在,那么,再访问成员变量或静态变量。 {this表示当前对象,this.访问的是当前对象的属性或方法。}
注释:
1、 单行注释和多行注释用于方法或语句块中,给某一行或某一段代码的说明。
2、 文档注释用于类、方法、属性前面。
JDK中bin下,有一个javadoc.exe文件,用于产生帮助文档
继承:
继承是一种代码重用的方式。
子类通过继承父类,可以重用父类中定义的属性和方法。
另外,在子类中,还可以定义子类特有的属性和方法。 继承采用关键字extends、
继承使用的原则:
1、 观察要使用的类,确定他们之间共同的和特有的特征和行为,将这些共性数据迁移到父类里。便于子类中进行方法和属性的重用。
2、 对于不同的特征和行为,在子类里可以重新定义。
在java,一个类只能有一个类,一个类不能继承两个父类。
所以的类都直间或间接都继承Object类 。
GUI(Graphics User Interface):是图形用户界面.
awt:awt是使用操作系统本身提供组件风格来构建java的gui组件。所以在跨平台时,显示风格不一致。
Swing:弥补了awt类包的不足,有自己的显示风格,这样在跨平台时,显示风格会保持一致。
GUI窗体中加入组件的步骤:
1、 设置布局管理器
2、 创建GUI组件对象
3、 将GUI组件对象加入窗体
JavaGUI组件遵循先进先出,后进后出的原则。
多态:允许使用父类变量指向子类对象,允许使用接口变量指向实现类对象。但反过来不行。
多态调用时,父类变量指向子类变量,只能调用父类中定义的属性和方法,不能调用子类特有的属性和方法。相同的行为,不同的实现。 多态具体体现为重载和重写。
多态主要应用于多态参数和多态集合。
多态总结:
1、 使用父类类型的引用指向子类的对象。
2、 该引用只能调用父类中定义的方法,不能调用子类中独有的方法。
3、 如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用父类中的所有方法。
4、 在多态中,子类可以调用父类中所有的方法。
5、 多态主要体现为重载和重写,相同的行为不同的实现方式。
6、 多态主要应用为多态参数和多态集合。
封装:按照信息隐藏的原则,将数据组织在一起。封装有两个特点:信息隐藏,信息集合。
子类对象构建时,会先调用父类的构造方法,产生父类对象。然后,在父类对象基础上,拓展子类特有的属性和方法。所以,子类对象中包含一个完整的父类对象,可以重用父类中定义的属性和方法。
Super表示父类对象,子类构造方法第一句,必须书写为super(),调用父类构造方法产生父类对象。如果没有写,虚拟机默认执行super()。但是如果父类中没有定义无参构造方法,子类构造方法必须显式调用。
重写:重写发生在父类和子类之间,子类方法名和父类相同,参数类型相同,返回类型也相同。在调用方法时,优先调用子类重写的方法。
子类重写父类的方法,要求访问修饰符要大于或等于父类方法。抛出的异常要小于或等于父类方法
@override叫(注解),可以强制检测子类方法是否重写了父类方法。如果该子类方法没有重写父类方法,那么编译错误。
Final 可以修饰类、方法、变量。
1、修饰类,该类不能被继承。
2、修饰方法,表示该方法不能被子类重写。
3、修饰变量,表示该变量的值不能改变。
基本数据类型变量声明为final,表示该变量的值不能改变。引用数据类型变量声明为final,表示该变量不能引用别的对象。
输入值调用2个方法 ,优先选择更小的类型。
访问修饰符:
1、 public (公开):本类、同包、不同包各个的子类和非子类均可访问。
2、 protected():本类和同包中子类和非子类可以访问和不同包中的子类。
3、 默认(无):本类和同包中子类和非子类均可访问。
4、 Private(私有):只有本类之中可以访问。默认会加上final修饰符, 不能被子类重写
访问修饰符 |
本类 |
本包 |
不同包 |
||
|
|
子类 |
非子类 |
子类 |
非子类 |
Public |
均可访问 |
||||
Protected |
这些可以访问 |
|
|||
默认 |
这些可以访问 |
|
|
||
Private |
仅此而已 |
|
|
|
|
私有属性·加get/set方法和共有属性的区别。
1、私有属性不能再在别的·类中直接访问。只能通过get方法进行访问,通过set方法进行设置。所以,可以通过删除set或get方法,将属性做出只读或只写属性。公有属性做不到。2、私有属性可以在set方法中,进行属性值合法性的验证。公有属性做不到。
静态初始化块static{ },只在类加载时执行一次。
·实例初始化块{ },在产生对象时执行,在super()之后执行。
内部类:在一个类中,再定义一个类,称为内部类。内部类相当于外部类的属性,内部类对象的产生需要依赖于外部对象。
局部变量存放在栈空间中,只能用final或默认修饰。不能用public、private、static、protected修饰。
内部类class文件的命名规则:外部类类名$内部类类名.class。
抽象类:如果一个方法只有定义,但是没有具体的内容,那么该方法称为抽象方法。拥有抽象方法的类,叫做抽象类。用关键字abstract定义。
抽象类不能直接实例化。抽象类变量只能指向子类对象。
如果一个类继承抽象类,那么必须重写抽象类中定义的所有抽象方法,否则该类只能是抽象类。 (抽象方法方便进行多态调用)
接口:(多态的实现方式之一)
1、 接口可以看作抽象类的特例。抽象类中可以定义抽象方法,可以定义具体方法。但在接口中,只能定义抽象方法。
2、 接口可以看作行为的抽象。
3、 定义接口用关键字interface,实现接口用关键字implements,一个类实现一个接口必须重写接口中定义的抽象方法。
4、 接口中定义的方法都是公共的、抽象的(public abstract)。Public abstract修饰符可以省去。不能用private protected修饰接口方法(私有的不能用)。、
5、 接口中定义的变量修饰符为public static final。
6、 接口可以继承接口,还可以多继承(继承多个)接口,一个类实现接口,不但要实现接口中定义的抽象方法,还有实现该接口的父接口中定义的抽象方法。
如果一个方法的参数为父类变量,那么可以传递任何一个子类对象。如果一个方法的参数为接口变量,那么可以传递任何一个实现类对象。
抽象类和接口的区别和联系:
1、 抽象类和接口都不能直接实例化。抽象类变量只能引用子类对象,接口变量只能引用实现类对象。
2、 接口中只能定义抽象方法,不能定义具体方法,但在抽象类中可以定义抽象方法,可以定义具体方法。
3、 接口中定义的变量是公共的静态的常量,而抽象类中定义的变量是普通属性。
4、 一个类只能继承一个类,但是可以实现多个接口。
事件添加的步骤:
1、 确定事件源
2、 确定监听器
3、 注册,建立事件源和监听器的联系。
异常(exception):异常是描述出错信息的对象。
异常的API结构:
Throwable是父类,有两个子类,Error和Exception。其中Error表示错误,崩溃级别的出错信息,可以捕获,但不能处理。Exception表示异常,是普通出错信息,可以捕获,可以处理。
Error是所有错误类的父类;exception是所有异常类的父类。
异常的执行顺序,先从try块开始执行,顺序执行。如果有异常发生转到catch块执行,同时中止try块中的其他代码。无论是否有异常发生,都会执行finally语句块·。 try……catch结束后,继续执行异常块之后的代码。
如果一个try块和多个catch块联用,在异常发生时,只会执行第一个和异常对象匹配的catch块,其余的catch块全部忽略。
如果有一段代码不管是否发生异常抛出都有被执行,我们使用关键字finally。
由于finally语句块,在无论是否有异常时都会执行。所以一般用于资源清理工作,比如:
流的关闭,数据库的关闭。
在try块或catch块中,有return语句,finally语句块也会在方法返回之前被执行。
虚拟机关闭时,System .exit(0); finally块不会执行。
异常的分类:
编译期异常(检查异常):开发者必须处理,否则无法通过编译。
运行期异常(非检查异常):开发者可以处理,也可以不处理,即使不处理也可以通过编译。
所有的运行期异常都是Runtime Exception的子类。
异常的抛出: 主动抛出一个异常。
Throw new Exception(); 创建异常对象,并抛出。
Throw和throws的区别:
Throw是语句,表示显示抛出异常对象。
Throws是方法修饰符,表示该方法可能会抛出某种异常。那么,在调用该方法时,必须处理该方法抛出的异常。
自定义异常:
1、 创建一个类继承与Exception
2、 添加构造方法和普通方法。
3、 在一个方法中抛出异常
4、 在另一个方法中捕获并处理异常。
正则表达式:
正则表达式是使用特定的符号来描述字符串的一种方法。是数据验证的主要手段。
正则表达式本身也是字符串,可以验证指定的字符串,是否匹配该正则表达式描述的格式。
正则表达式使用String的matches()进行匹配。
[ ]:匹配[ ]中描述的任意字符。
表达式 |
描述 |
[013] |
单个数字0,1,或3 |
[0-9][0-9] |
任意两位数00到99 |
A[0-4]b[0-5] |
由四个字符组成的字符串,第一个字符是A,第二个字符是一个之间的数字,第三字符是b。最后一个字符是0或者5之间 |
{ }:描述前一个规则可以出现的次数。
表达式 |
描述 |
X{N , M} |
规则X,最少出现N次,最多出现M次 |
X{N ,} |
规则X,最少出现N次,没有上限限制 |
X{N} |
规则X,只能出现N次,不能多不能少 |
匹配汉字:\u4e00-\u9fa5;
表达式 |
描述 |
+ |
等价于{1,},最少出现一次,没有上限限制 |
* |
等价于{0,},可以不出现,也可以出现多次 |
. |
匹配任意字符 |
? |
等价于{0,1},可以不出现,要出现只能出现一次 |
\d(\D) |
等价于[0-9]可匹配数字。\D非数字 |
\w(\W) |
等价于[a-zA-Z0-9].匹配合法标识符。\w为非法标识符 |
\s(\S) |
匹配空格或者回车。\S为非空格和回车 |
String a =”abc” 和String a = new String(“abc”)的区别:
String a =”abc”,a变量引用的是数据段中的字符串常量对象。
String a = new String(“abc”) ,a变量引用的是堆中的字符串对象。在堆中产生字符串对象,需要以常量池中的字符串常量对象作为模板,将内容拷贝到堆中。
字符串具有不可改变的特性,当对字符串进行添加、删除、替换时,不会更改字符串的内容,而是产生新的字符串对象。
Z字符串操作类StringBuffer,该类允许内容改变。
StringBuffer(缓冲区) :会在缓冲区中开辟一个空间,当对StringBuffer的内容作连接、替换、删除等操作时,不会产生新对象。
如果需要对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法即可。
StringBuilder是StringBuffer的轻量版,Buffer有的方法Builder基本都有
StringBuilder是线程不安全的,StringBuffer是线程安全的。
性能: StringBuilder >StringBuffer>String.
@Deprecated 标识使方法过时 但是方法还可以用的。
·用户可以通过调用System.gc(),通知虚拟机加快垃圾回收的速度。但不能控制垃圾回收。回收对象之前会调用finalize()方法做一些清理工作。
Final ,finally ,finalist的区别:
Final是修饰符。修饰类,表示该类不能继承,修饰方法,表示该方法不能被重写,修饰变量,表示该变量的值不能改变。
Finally是语句块,和try联用,表示无论是否有异常发生都会执行的语句块,通常用于流的关闭,数据库的关闭。
Finalist 是方法。在object中定义,表示垃圾回收该对象之前,调用该方法完成资源清理操作。
包装类的应用:
包装类允许在对象中描述基本数据类型的数据。由于包装类变量是引用数据类型,所以,可以给包装类变量赋值为null。
包装类对象中包含的数据,不能在允许期间改变。
包装类常用的方法:、
XXXXValue()方法 -----------》显示包装类中封装的数据
包装类类名.parseXXX()方法 ----------》将字符串转化为基本数据类型。
在java中,可以重复利用的组件称为JavaBean。
在开发中,经常需要对对象进行数据的封装,以及对象数据的传输。这一类对象,通常只有属性的定义,没有行为的定义。这一类对象就是狭义的JavaBean。
在java中 ,狭义JavaBean的规范:
1、 Javabean必须包含一个无参数的公有构造方法。
2、 属性全部为私有属性,通过get/set方法对属性进行访问和设置。
3、 需要实现序列化接口。
·集合:
集合的特点:元素类型不同、集合长度可变、空间不固定。
Java中对一些数据结构和算法进行了封装即集合,集合也是一种对象,用于存储、检索、操作和传输对象。
JCF (Java ………………………)集合框架。它提供了管理集合的接口和类。
集合框架包含三个部分:接口、实现类、算法
集合框架的接口:
Collextion分为两个子接口List和Set :List具有线性,元素可重复 Set的元素不重复
Map : 键值对,一个元素包含两个对象键对象不重复。
HashSet:指向set
实现类:ArrayList Vector LinkedList都指向List
算法:Iterator Arrays Collection
迭代算法接口 数组算法类 集合算法类
List接口实现类的选择: (三种集合的特点:)
ArrayList:底层采用数组实现,遍历元素、追加元素速度快,中间插入和删除元素速度快,线程不安全。ArrayList使用最广泛,集合元素增加或删除操作不频繁时使用。最适合查询。
Vector:与ArrayList类似,底层也用数组实现。但Vector是线程安全的,性能要低于ArrayList。
LinkedList:采用双向链表实现,元素空间不连续。遍历元素速度慢,中间插入和删除元素速度快。一般用于需要在集合的中间位置,频繁增加或删除元素时使用。
HashMap:按键的hash码排列元素,允许键对象或值对象为null值,线程不安全。
Hashtable:按键的hash码排列元素,不允许键对象或值对象为null值,线程安全。
Properties指向Hashtable
TreeMap: 按键的自然顺序排列元素,键对象需要重写hashCode和equals方法。
’JAVA IO流:
IO体系分为流式部分(IO的主体部分);
流的方向以内存作为参照物,当从数据源中将数据读取到内存中时,称为输入流,也叫读取流。
当从内存中将数据写入到数据源中,称为输出流,也叫写入流。
字节流有两个抽象父类
字符流有两个抽象父类
为什么这些的父类是抽象类?
不同的数据源读写数据的方式会有所不同,所以在字节流和字符流的父类中,预留了读写数据的抽象方法,不同的子类根据自己数据源的特点分别去实现。
输入流的使用步骤:
1、建立流。
2、操作流。
3、关闭流。
IO流操作的本质目的是,完成内存数据和数据源数据的转换。
按照传输内容分:
字节流 --------传输二进制字节数据
字符流---------传输字符数据
对象流 =======传输对象数据
写入流将数据写入数据源时,需要通过flush()刷新语句,才能将数据真正写入数据源。在流关闭时,会自动执行flush()刷新语句。所以,写入流在不关闭时,也不刷新的情况下,有可能写不进数据。
操作文件流时,如果文件不存在,会发生什么情况?
读取流会抛出文件未找到异常。而写入流会创建新文件(文件所在的目录必须存在)。
流操作完毕后,不关闭,会发生什么情况?
不关闭,不但浪费内存资源,而且写入流有可能写不进数据。
对象序列化:
在传输对象时,由于对象的数据庞大,无法直接传输。所以,在传输之前,先将对象打散成字节序列,以利于传输。这个过程,称为序列化过程。
在字节序列到达目的地以后,又需要将字节序列还原成对象。这个过程,称为反序列化过程。