1.字符串类
(字符数据类型表示单个字符,char类型)(字符串是一个字符序列(String Type)String类型不是基本类型,是引用类型reference type )
构造字符串:可以用字符串直接量或字符数组创建一个字符串对象 String message=new String("Welcome to java!");或者 char[] charArray={'G','o'};\
不可变字符串与限定字符串:String对象是不可变的。Java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串直接量使用同一个实例。这样的实力成为限定的interned字符串。
字符串的比较:
两个字符串比较的代码可以为:
(string1==string2)
但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false
Java中必须使用string1.equals(string2)来进行判断
string s1="Hello";
string s2="Hello";
则(s1==s2)=true;
因为他们指向的同一个对象。
String s1=new String("Hello");
String s2=new String("Hello");
则(s1==s2)=false
如果比较字符串的大小使用:str1.compareTo(String str2);如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
2.文件类File 类(java.io.File)
File类包含了获得一个文件/目录的属性,以及对文件/目录进行改名和删除的方法(但不包含读写文件内容的方法)
绝对文件名absolute file name 是有文件名和它的完整路径以及驱动器字母组成。绝对文件名=目录路径directory path+相对文件名。绝对文件名是依赖机器的(操作系统)
File(pathname: String) //为一个指定的路径名创建一个File对象。路径名可能是一个目录或文件
exists(): boolean //File对象代表的文件和目录存在,返回true
canRead(): boolean //File对象代表的文件存在且可读,返回true
canWrite(): boolean //File对象代表的文件存在且可写,返回true
isDirectory(): boolean //File对象代表的是一个目录,返回true
isFile(): boolean //File对象代表的是一个文件,返回true
isAbsolute(): boolean //File对象是采用绝对路径名创建,返回true
isHidden(): boolean //如果File对象代表的文件是隐藏的,返回true。隐藏的确切定义是系统相关的。
getAbsolutePath(): String //返回File对象代表的文件和目录的完整绝对路径名
lastModified(): long //返回文件最后修改时间
在Windows中目录的分隔符是\,但在Java中,\是一个特殊字符,分隔符应写成\\。
构建一个File实力并不会在机器上创建一个文件,可以调用File实例上的exists()方法来判断这个文件是否存在。
在程序中,不要使用绝对文件名,否则平台不通用。/是Java的目录分隔符。如new File("image/us.gif");
3.文件输入和输出
使用Scanner类从文件中读取文本数据,使用PrintWriter类向文本文件写入数据。
①写数据
PringWriter output=new PrintWriter(filename); //为指定的文件名字符串创建一个PrintWriter对象
print(s: String): void //将字符串写入文件中
pring(i: int): void //将一个int值写入文件中
close(): void //关闭文件,如果不调用,数据就不能正确的保存在文件中
使用try-with-resources自动关闭资源:避免错误,简化代码
try(声明和创建资源){ //资源必须是AutoCloseable的子类型,比如PringWriter,具有一个close()方法
使用资源来处理文件; //块结束后,资源的close()方法自动调用以关闭资源
}
②读数据
Scanner input=new Scanner(file); //创建一个Scanner,从指定的文件中扫描标记
hasNext() : boolean //如果Scanner还有更多数据读取,返回true
next(): String //从该Scanner中毒去下一个(空白)标记作为字符串返回
nextInt(): int //从该Scanner中读取下一个标记作为int值返回
必须先创建File的一个实例,然后再为这个实例创建一个Scanner;调用构造方法new Scanner(File)可能会抛出一个I/O异常,因此声明main(String[] args)throws Exception{
③scanner如何工作
方法nextByte(),nextShort(),next()等都成为标记读取方法token-reading method,因为他们会读取用分隔符分隔开的标记。默认情况下,分隔符是空格。
next()方法读取一个有分隔符分隔的字符串;nextLine()读取一个以换行符结束的行
4.不可变对象和类Immutable Objects and Classes
可以定义不可变类immutable class来产生不可变对象immutable object,不可变对象的内容不能被改变.例如,String类就是不可变的,或者删除set方法
一个类的所有数据都是私有的且没有修改器并不意味着他一定是不可变类。通过引用可以改变:java.util.Date date=student.getdate(); date.setTime(2000);
不可变类的要求:①所有的数据与都是私有的②没有修改器方法③没有一个返回指向可变数据与的引用的访问器方法。
5.变量的作用域
实例变量和静态变量的作用域是整个类。一个类的实例变量和静态变量称为类变量class's variables 或数据域data field。在方法内部定义的变量成为局部变量。
如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,同名的类变量被隐藏hidden
6.this引用
关键字this引用对象自身,也可以在构造方法内部用于调用同一个类的其他构造方法。可以用this引用对象的实例成员。
①使用this引用隐藏数据域 public void f1.setI(int i){this.i=i;}this给出一种引用调用实例方法的对象的方法
②使用this调用构造方法 通常,无参数或者参数少的构造方法可以用this(参数列表)调用参数多的构造方法。
7.类的抽象和封装
类抽象class abstraction是将类的实现和使用分离(类的合约class‘s contract)。
实现的细节经过封装,对用户隐藏起来,这成为类的封装class encapsulation。(类也成为抽象数据类型Abstract Data Type,ADT)
8.面向对象的思考
面向过程的范式重点在于设计方法。面向对象的范式将数据和方法耦合在一起构成对象。使用面向对象范式的软件设计重点在对线以及对对象的操作上。
面向对象程序设计方法以一种反映真实世界的方式组织程序,所有的对象和属性及动作都相关联。一个Java程序可以看作是一个相互操作的对象集合。
9.类的关系(通常是关联,聚合,组合,继承)
①关联 一种常见的二元关系,面熟两个类之间的活动
②聚集 关联的一种特殊形式,带便了两个对象之间的归属关系。聚集建模has-a关系。所有者对象成为聚集对象,它的类称为聚集类。从属对象称为被聚集对象,被聚集类。
一个对象可以被多个其他的聚集对象所拥有。
③组合 如果一个对象只归属于一个聚集类,关系称为组合composition。
10.类的设计原则
①内聚性。类描述一个单一的实体,所有的类操作应该在逻辑上相互配合,支持一个一致的目的。
②一致性。遵循标准Java程序设计风格和命名习惯。为类,数据域和方法选取具有信息的名字。
③封装性。一个雷应该使用private修饰符隐藏起数据,一面用户直接访问它。
④清晰性。在设计一个类时,这个类不应该限制用户如何以及何时使用该类;以一种方式设计属性,以容许用户按值的任何顺序和任何组合来设置;设计方法应该是的实现的功能与他们出现的顺序无关。
⑤完整性。通过属性和方法提供多种方案以适应客户的不同需求。
⑥实例和静态。依赖于类的具体实例的变量或方法必须是一个实例变量或方法。如果一个变量被类的所有实例所共享,那就应该将它声明为静态的。如果方法不依赖于某个具体的事例,就应该声明为静态方法。
11.继承和多态
面向对象的编程允许你从已经存在的类中定义新的类,这称为继承inheritance
父类和子类:继承使得你可以定义一个通用的类(父类parent class 超类superclass 基类base class),之后扩充该类为一个更加特定的类(子类child class 次类subclass 扩展类extended class 派生类derived class)。子类从它的父类中继承可访问的数据域和方法,还可以添加新的数据域和方法。pubic class Circle extends GeometricObject{};
继承是用来为“是一种”(is-a)关系建模的。多重继承(multiple inheritance) 是允许从几个类派生出一个子类,Java中只允许单一继承(single inheritance)
使用super关键字:关键字super只带父类,可以用于调用父类中的普通方法和构造方法。构造方法:super()或super(parameters);构造方法链(constructor chaining):构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。普通方法:super.方法名(参数);
方法重写(覆盖):method overriding子类修改父类中定义的方法的实现,使用一样的签名和返回值类型。仅当实例方法是可访问的,它才能被覆盖(重写);静态方法可以被继承,但是不能被覆盖(重写)
方法重写和重载(overriding and overloading):重写意味着在子类中提供一个对方法的新的实现;重载意味着使用同样的名字但是不同的签名来定义多个方法。方法重写发生在继承关系中;方法重载可以发生在同一个类中,也可以继承关系中。重写标注(overriding annotation)在子类的方法前面放一个@Override,如果之后没有重写,编译器会报告一个错误。
Object类及其toString()方法:Java中所有的类都继承自java.lang.Object类。方法签名:public String toString() 一般要重写
多态(polymorphism):多态意味着父类的变量可以指向子类对象。面向对象程序设计的三大支柱是封装继承和多态。子类定义的类型称为子类型subtype。父类定义的类型称为父类型supertype。使用父类对象的地方都可以使用子类的对象。
动态绑定:dynamic binding一个变量必须声明为某种类型,称为声明类型(declared type);变量的实际类型(actual type)是被变量引用的对象的实际类变量调用哪个toString()方法由变量的实际类型决定,这成为动态绑定dynamic binding
对象转换和instanceof运算符:对象的引用可以类型转换为对另一种对象的引用,这成为对象转换(casting object)子类对象赋值给父类对象,有隐式转换(implicit casting)。父类对象赋值给子类对象,Student b=(Student)o;显式转换(explicit casting)。总是可以将一个子类的实例转换为一个父类的变量,成为向上转换(upcasting),当把一个父类的实例装换为它的子类变量(成为向下转换downcasting),必须使用转换记号“(子类名)”进行显式转换;if(myObject instanceof Circle) 判断一个对象是否为一个类的实例。对象成员访问运算符(.)优先于类型转换运算符,所以使用圆括号保证在点运算符之前进行转换((Circle)object).getArea();
Object类的equals方法:public boolean equals(Object o){ return (this==o);(默认实现)}方法是定义在Object类中,测试两个对象是否相等,object1.equals(object2);==运算符比equals方法强大,还可以检测两个引用变量是否指向同一个对象。
ArrayList类:ArrayList对象可以用于存储一个对象列表。Java提供ArrayList类来存储不限定个数的对象。ArrayList是一种泛型类,具有一个泛型类型E。创建:ArrayList
示例学习:自定义栈类
protected数据和方法:一个类中的受保护成员可以从子类中访问。修饰符private、protected、public都称为可见性修饰符(visibility modifier)或可访问性修饰符(accessibility modifier)它们指定如何访问类和类的成员。可见性递增:私有、默认、受保护、公共。protected允许任何包中的子类或同一包中的类访问类的成员,只能用于类的成员,子类不能削弱父类中定义的方法的可访问性。
防止扩展和重写:一个被final修饰的类和方法都不能被扩展(继承,重写)。被final修饰的数据与是一个常数。还可以用在方法中的局部变量上.
12.异常处理(exception handling)
运行时错误runtime error。异常就是一种对象,表示组织正常进行程序执行的错误或者情况。异常是从方法抛出的。方法的调用者可以捕获以及处理该异常。
throe new ArithmeticException("Division cannot be zero.");try{......}catch(ArithmeticException ex){......}.
抛出的值为↑,称为一个异常exception,throw语句的执行成为抛出一个异常(throwing an exception),异常就是从一个异常类创建对象。异常处理的最根本优势,将检测错误(由被调用的方法完成)从处理错误(由调用方法完成)中分离出来。
异常类型(throwable type):异常的根类是java.lang.Throwable;。可以通过继承Exception或者它的子类来创建自己的异常类。这些异常类可以分成三种主要类型:系统错误,异常和运行时异常。系统错误(system error)是由Java虚拟机抛出的,用Error类表示,秒时内部系统错误。异常(exception)用Exception类表示,描述的是有程序和外部环境所引起的错误,这些错误能被程序捕获和处理。运行时异常(runtime exception)使用RuntimeException类表示的描述程序设计错误,由JVM抛出。这些及他们的子类都称为免检异常(unchecked exception);其他异常都称为必检异常(checked exception),意思是指编译器会强制程序员检查并通过try-catch块处理他们,或者在方法头进行声明。
Java的异常处理模型基于三种基本操作:声明一个异常(declaring an exception)、抛出一个异常(throwing an exception)、捕获一个异常(catching an exception)。每个方法都必须声明它可能抛出的必检异常的类型 public void myMethod() throws IOException .检测到错误的程序可以创建一个合适的异常类型的实例并抛出他。声明异常的关键字是throws,抛出异常的关键字是throw。当抛出一个异常时,可以再try-catch块中捕获和处理它。异常处理器exception handler,寻找处理器的过程
从异常中获取信息:示例学习:
finally子句:无论异常是否产生,finally子句总是会被执行。try{.....}catch{......}finally{......}.即使在到达finally子句块前有一个return子句,还是会执行。使用子句时可以省略掉catch块。
何时使用异常:当错误需要被方法的调用者处理的时候,方法应该抛出一个异常。try块包含正常情况下执行的代码。catch块包含异常情况下执行的代码。
重新抛出异常:在catch块中throw ex;如果异常处理器不能处理一个异常,或者只是简单希望它的调用着注意到该异常,Java允许该异常处理其重新跑出异常。
链式异常:和其他异常一起抛出一个异常,构成了链式异常(chained exception)
创建自定义的异常类:public class InvalidRadiusException extends Exception{}
13.抽象类和接口Abstract class and interfaces
抽象类:没有任何具体的事例的类称为抽象类。包含抽象方法,在具体的子类中实现。public abstract class GeometricObject{ public abstract double getArea();}抽象类只有定义没有实现。一个包含抽象方法的类必须声明为抽象类。抽象类的构造方法定义为protected,因为它只被子类使用。
为何要使用抽象方法:JVM在运行时根据对象的类型动态的决定调用哪一个方法。
抽象类的几点说明:抽象方法不能包含在非抽象类中,是非静态的。抽象类不能使用new操作符来初始化。可以定义一个不包含抽象方法的抽象类。子类可以覆盖父类中的方法并将它定义为abstract。即使父类是具体的,子类也可以是抽象的。抽象类可以用作一种数据类型。类和接口之间的关系称为接口继承(interface inheritance)
示例学习:日历he公历
接口Interface:接口是一种与类相似的结构,只包含常量和抽象方法。 public interface Animal{}。使用implements关键字让对象的类实现这个接口。
Comparable接口:定义了compareTo方法,用于比较对象。compareTo方法判断这个对象相对于给定对象的顺序,并且当这个对象小于、等于、大于给定对象时,分别反悔负整数、0和正整数。package java.lang; public interface Comparable
Cloneable接口:给出了一个可克隆的对象。这个接口是空的。 package java.lang; public interface Cloneable{}.一个带空体的接口称为标记接口(marker interface)
接口与抽象类:一个类可以实现多个接口,但是只能继承一个父类。publc class New Class extends BaseClass implements Interface1,...,InterfaceN{}
利用关键字extends,接口可以继承其他接口,这样的接口称为子接口(subinterface)。public interface NewInterface extends Interface1,...,InterfaceN{}。类名是一个名词,接口名可以是一个名词或形容词。
14.事件驱动编程和动画Event Driven Programming and Animation
编写代码以处理诸如单击按钮、鼠标移动以及按键盘之类的事件。按钮是一个事件源对象(event source object ),即动作起源的地方。该对象成为一个事件处理器(Event Handler)。成为一个动作事件的处理器必须满足两个要求:该队线必须是EventHandler
事件和事件源:事件是从一个事件源上产生的对象。触发一个事件意味着产生一个事件并委派处理器处理该事件。当运行一个Java GUI程序的时候,程序和用户进行交互,并且事件驱动它的执行,这称为事件驱动编程。一个事件可以被定义为一个告知程序某件事发生的信号。产生一个事件并且触发它的组件称为事件源对象,或者简称为源对象或者源组件。一个事件对象包含与事件相关的任何属性。
注册处理器和处理时间:处理器是一个对象,它必须通过一个事件源对象进行注册,并且它必须是一个恰当的事件处理接口的实例。Java采用一个基于委派的模型来进行事件处理:一个源对象触发一个事件,然后一个对改时间感兴趣的对象处理它,后者称为一个事件处理器或者事件监听者。成为一个处理器的条件两个:处理器对象必须是一个对应的事件处理接口的实例;处理器对象必须通过源对象进行注册 ,注册方法依赖于事件类型。
内部类(inner class):或称为嵌套类(nested class),是一个定义在另外一个类范围中的类。可以如常规类一般使用。有以下特征:一个内部类被编译成一个名为(OuterClassName)$(InnerClassName)的类;一个内部类可以引用定义在它所在的外部类中的数据和方法;可以使用可见性修饰符定义;可以被定义为static;通常在外部类对象中所创建(OuterClass.InnerClass innerObject=outerObject.new InnerClass(););如果内部类是静态的这样创建:OuterClass.InnerClass innerObject=new OuterClass.InnerClass();
匿名内部处理器(Anonymous internal processors):匿名内部类是没有名字的内部类,一步实现定义一个内部类以及创建一个内部类实例。语法:new SuperClassName/InterClassName(){}特征:必须总是从一个父类继承或者实现一个接口,但是不能
有显式的extends或implements子句;必须实现父类或者接口中的所有抽象方法;总是使用它父类的无参构造方法来创建一个实例;被编译成一个名为OuterClassName$n.class的类。
鼠标事件(mouse event ):当一个鼠标按键在一个节点或者一个场景上被按下、释放、单击、移动或者拖动时,一个MouseEvent事件被触发。四个常数----Primary、Secondary、Middle、None在MouseEvent中被定义,表示鼠标左、右、中、无按钮。
键盘事件(keyboard events):在一个节点或者一个场景上面只要按下、释放或者敲击键盘按键,就会触发一个KeyEvent事件。键的编码是定义在KeyCode中的常量。
动画(Animation):JavaFX中的Animation类为所有的动画只做了核心功能。PathTransition类只做一个在给定时间内,节点沿着一条路径从一个端点到另一个端点的移动动画。FadeTransition类在一个给定的时间内,通过改变一个节点的透明度来产生动画。Timeline类可以用于通过使用一个或者更多的KeyFrame(关键帧)来编写任意动画。
15.二进制IO
文件可以分为文本或二进制的。记事本处理的文件称为文本文件,其他都是二进制文件。不能使用文本编辑器来读取二进制文件。
在Java中如何处理文本IO:使用Scanner类读取文本数据,使用PrintWriter类写文本数据。
文本IO与二进制IO:二进制IO不涉及编码和解码,因此比文本IO更加高效。.txt文本文件,.dat二进制文件
二进制IO类:抽象类InputStream是读取二进制数据的根类,抽象类OutputStream是写入二进制数据的根类。
①FileInputStream类和FileOutputStream 类用于从/向文件读取/写入字节。
②FilterInputStream类和FilterOutputStream类:过滤器数据流(filter stream)视为某种目的过滤字节的数据流。
DataInputStream类和DataOutputStream类:datainputStream从数据流中读取字节,并且将他们转换为合适的基本类型值或字符串。dataoutputstream将基本类型的值或字符串转换为字节,并且将字节输出到数据流。
④BufferedInputStream和BufferedOutputSream:可以通过减少磁盘读写次数来提高输入和输出的速度。
示例学习:复制文件
对象IO:ObjectInputStream类和ObjectOutputStream类可以用于读写可序列化对象。