对象和类:对象是类的一个实例,类是对象的模板
类也是一种数据类型,可以声明对象引用变量,即对该对象的引用;
程序只有一个包含main方法的主类:使用该类的程序是类的客户;
public static void main(String[] args) { }
UML类图
+表示public -表示private #表示protected 下划线表示静态变量和静态方法 斜体表示抽象类和抽象方法
斜体还表示接口和方法,虚线和空心三角形指向接口
父类方法在子类uml中被省略
- 类名
- 数据域:引用型(string,arry[])赋默认值null,数值型默认0,boolean默认false,char型默认'\u0000'
dataFileName:dataFiledType
- 构造方法:无返回类型;用new操作符来创建初始化对象 new ClassName(arguments);可以重载
ClassName(parameterName:parameterType)
- 方法:
methodName(paramaterName:parameterType):returnType
静态变量、常量、方法 ——static:
如果一个变量和方法不依赖于某个类的具体实例,应该定义为静态变量和方法。
- 不要从构造方法中传参数来初始化静态数据域,使用静态set方法
- 一个类的所有实例共享数据,存储在公共内存地址,某一个对象修改其值,同一个类的所有对象都会受到影响;
- 无需创建类的实例就可以调用静态方法;
- 常量final static;
- 类的静态变量和方法可以在类的实例和静态方法中使用,类的实例变量和方法只能在实例方法中使用
- 调用方法:类名.静态方法名(参数)包括main方法 类名.静态变量
抽象类和抽象方法——abstract
父类类型 object = new 子类构造方法;
- 子类的共同方法在父类中只有定义没有实现,依赖于子类对象的具体类型,由子类实现,称为抽象方法;
- 抽象类不能使用new操作符创建实例,构造方法定义为protected,构造方法在子类的构造方法中调用;
- 抽象类可以用作一种数据类型,如抽象类数组;
- 包含抽象方法的一定是抽象类,但是抽象类可以不包含抽象方法;
- 抽象类除常量和抽象方法,可以包括变量和具体方法;
- 由抽象类扩展的非抽象子类中必须实现所有的抽象方法;
- 父类是具体的,子类也可以是抽象的;
接口:只包含常量和抽象方法,目的是指明多个对象的共同行为
定义:无构造方法,不能使用new操作符创建实例;接口中所有数据域都是public final static,方法都是public,可以忽略修饰符;接口名.常量名;接口可以扩展其它接口;
接口类型 object = new 子类构造方法;
修饰符 interface 接口名{
}
//NewInterface称为子接口,必须实现Interface1,Interface2,...,InterfaceN中定义的抽象方法
修饰符 interface NewInterface extends Interface1,Interface2,...,InterfaceN{
}
类、接口继承:当一个类实现接口时,该类实现了定义在接口中的所有带确切签名和返回类型的方法,若不实现这些方法,应将其定义为抽象类;一个类可以扩展它的父类同时实现多个接口;一个接口类型的变量可以引用任何实现该接口的类的实例;
修饰符 class 类名 implements 接口名(可以有多个接口,多重扩展){
}
修饰符 class 类名 extends 类名 implements Interface1,Interface2,...,InterfaceN{
}
java.lang.Cloneable接口:是一个标记接口,实现Cloneable接口的类的对象是可克隆的
java.lang.Comparable接口:定义了compareTo方法
ActionListener接口:点击按钮触发一个事件,一个事件就是一个对象,监听器对象处理这个时间
创建一个对象能够处理按钮上的动作事件,这个对象称为监听器——
对象必须是ActionListener接口的一个实例;
ActionListener对象listener必须使用方法source.addActionListener(listener)注册给源对象;
详细描述父子关系的strong is a relationship 用类建模;表面对象有某种属性的类属关系weak is a relationship用接口关系;
接口是一种特殊的类,可以定义为不相关类共有的父类型,更加灵活
可见性修饰符:数据域和方法能否被该类之外访问,类内无限制
- public和默认(无)修饰符:
- private:方法和数据域只能在自己的类中被访问;仅用于修饰类的成员(数据和方法);
为了防止数据被修改以及使类更易于维护,将数据域声明为私有的。
数据域封装——避免对数据的直接修改,将数据域声明为私有的
返回值get方法public returnType getPropertyName()或public boolean isPropertyName()
更新值set方法public void setPropertyName(dataType propertyValue)
防止用户创建类的对象——定义一个私有的无参构造方法;
如果类的所有方法都是静态的无需创建对象通过类名调用;
- protected:允许子类访问定义在父类中的数据域或方法但不允许非子类访问;仅用于修饰类的成员(数据和方法)
子类可以覆盖父类 的protected方法,并把可见性改为public,但是子类不能削弱父类方法的可见性
同一类内可访问 | 同一包中可访问 | 子类内可访问 | 不同包内可访问 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
none | √ | √ | ||
private | √ |
final:表明一个类是终极的,不能作为父类;一个方法是终极的,不能被子类覆盖;表面一个方法内的变量是常量 防止扩展和覆盖
字符串
文件类File
创建对象:File file = new File("image/us.gif") 并不是在机器上创建文件; 不要直接使用绝对文件名 ;
PrintWriter写数据:
PrintWriter output = new PrintWriter(file);//若文件不存在创建新文件,存在当前内容废弃,Java强制要求编写代码处理异常
output .print();
.....
output .close();//必须关闭文件
Scanner读数据:令牌读取方法,分隔符默认是空格,可通过useDelimiter(String regex)自定义,不读取令牌后面的分隔符,然后返回分隔符之前的字符串
Scanner input = new Scanner(System.in);
Scanner input = new Scanner(new File(filename));
input.next()不转换/nextInt()转换为int型值/nextLine()/hasNext();
input.close();//不强制,但可以释放被占用资源
GUI:JFileChooser
关于对象:
防止用户修改对象定义不可变类:所有数据域私有;无set修改器方法;无访问器方法可以返回一个指向可变数据域的引用
this引用:指向调用对象本身
- 引用类的隐藏数据域(数据域名被用作参数名);实例变量用this.i = i,静态变量用classname.i = i
- 构造方法中通过this(参数表)调用参数多的构造方法,必须在任何语句前出现
类的抽象和封装: 将类的使用和实现分离
对象的组合:一个对象包含同类不同类的多个对象
类的设计原则:内聚性;一致性;封装性;清晰性;完整性
继承:从原有的类派生出新类,子类从父类中继承可访问的数据域和方法(不包括构造方法),可以添加新的数据域和方法
public class childclass extends parentclass
- Java只允许单一继承,多重继承通过接口实现;
- 父类的私有数据域只能通过公共的set/get 方法来访问修改;
- 子类要比父类包含过多的信息;
- 不是所有的is-a 是关系 都用继承建模,eg.没有如何东西可以从矩形扩展到正方形;
关键字super:
- 调用父类的构造方法 必须在子类构造方法的第一行 super()/super(parameters)
构造方法可以调用重载的构造方法或父类的构造方法,如果他们没有被显示调用会自动将super()作为第一行语句;
构造一个类的实例时,将会调用沿着及继承链的所有父类的构造方法,子类调用父类,父类调用父类的父类....;
最好为每一个类提供无参构造方法,便于扩展
- 调用父类的方法 super.方法名(参数) 适用于父类方法被覆盖时
方法覆盖:子类需要修改父类中方法的实现
必须使用相同的签名以及相同的返回值类型;
仅当是实例方法并且可访问时才能被覆盖;
对象类Object:
java中的每一个类都源于java.lang.Object类
toString()方法:System.out.println(object)/(object.toString())
equals()方法:public boolean equals(Object obj) { return this == obj} 子类覆盖应该使用equals(Object obj)
多态:使用父类对象的地方都可以使用子类对象,父类型的变量可以引用子类型的对象;每个子类的实例都是其父类的实例,总可以将子类的实例传给需要父类类型的参数
当访问数据域或静态方法时,变量的声明类型决定在编译时匹配哪个方法;
当引用变量调用实例方法时,变量的实际类型(被变量引用的对象的实际类)决定运行时使用方法的哪个实现;
动态绑定(实际类型): 假设对象o是类c1,c2,c3.....cn的实例,ci-1是ci的子类,cn是最通用的父类,c1是最特殊的子类,对象o调用一个方法,Java虚拟机会在依次类c1,c2,c3.....cn中查找方法的实现,调用第一次查找到的实现.
对象转换:总是可以把子类的实例转换为父类的变量;父类的实例转换为子类变量需要通过(子类名)进行显示转换
eg. ((Circle)object).getArea() 加圆括号
instanceof关键字:判断对象是否是类的实例 object instanceof classname
为了进行通用程序设计,把变量定义为父类型,这样可以接收任何类型的子类型的值
异常处理:将检测错误从处理错误中分离出来
try {
Code to try;
Throw an exception with a throw statement or from method if necessary;
More code to try;
}
catch(type ex){
Code to process the exception;
}
throw语句直接抛出异常或者调用一个可能会抛出异常的方法,调用catch块处理异常,然后执行catch块后的语句,任何情况下finally中的代码都会被执行。
异常类型:Throwable类是所有异常类的根 ex.getMessage()/toString()/printStackTrace()/getStackTrace()获取异常信息
- 系统错误:由Error类表示,内部系统错误,由java虚拟机抛出;若发生,仅能通知用户以及尽量稳妥的终止程序
eg.LinkageError,VirtualMachError
- 异常:Exception类表示,由程序和外部环境引起,能被程序捕获和处理.
eg.ClassNotFoundException,IOException,RuntimeException
- 运行时异常:RuntimeException类表示,程序设计错误,由java虚拟机抛出
eg.ArithmeticException当出现异常的运算条件时,抛出此异常
NullPointerException通过 null
引用变量访问一个对象,抛出该异常
IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出
IllegalArgumentException向方法传递了一个不合法或不正确的参数
声明异常:异常Exception类需在方法中显示声明;如果方法没有在父类中声明异常,就不能在子类中对其进行覆盖声明异常.
public void method() throws Exception1,Exception2,...,Exceptionn
抛出异常:创建一个正常异常类型的实例并抛出 throw new ex;
异常类有两种构造方法:无参构造方法和带异常描述String参数的构造方法
捕获异常:如果异常没有在当前方法中被捕获,就被传给调用该方法的调用者,直到异常被捕获或被传给main方法;
如果一个catch块可以捕获一个父类异常对象,就能捕获那个父类的所有子类异常对象,catch块中异常类型顺序子类出现在父类前;
如果方法声明了一个必检异常,调用该方法时就必须在try-catch块中捕获异常,或者声明中要抛出异常
包装类:Boolean,Character,Integer,Double,Float,Byte,Short,Long
基本数据类型不作为对象使用,可以将基本数据类型并入对象或包装成对象;
Integer intObject = new Integer (5)/("5");等价于 Integer intObject = 5;
(需要对象自动装箱)(需要基本数据类型自动开箱)
包装类没有无参构造方法,可以用基本数据类型值或表示数值的字符串来构造包装类,所有包装类的实例都不可变;
数值包装类:Integer,Double,Float,Byte,Short,Long
- 常量MAX_VALUE,MIN_VALUE;
- 都覆盖了在Object类中定义的toString和equals方法;
- 都实现了Number类中定义的抽象方法doubleValue(),intValue(),floatValue(),longValue(),shortValue();
- 都有一个静态方法valueOf(String s),该方法创建一个新对象,将其初始化为指定字符串表示的值,如Double.valueOf("12.14");
- 都有两个重载的方法将数值字符串转换为以各种进制表示的数值,如parseInt(String s),parseInt(String s,int radix)
字符串,数组是对象;
对任意对象类型的数组进行排序:sort(int/double/char/stringArray)
BigInterger和BigDecimal类:大数和高精度浮点数计算
new BigInteger/BigDecimal(String s)
用obj1.add/subtract/multiple/divide/remainder(obj2)进行运算,使用compareTo进行比较