面向对象复习笔记

抽象类和接口
相同点--代表系统的抽象层;都不能被实例化;都能包含抽象方法(用于描述系统提供的服务,不必提供具体方法);
不同点-- 在抽象类中可以为部分方法提供默认实现,而接口只能包含抽象方法(抽象类便于服用;接口便于代码维护)

java使用类的构造方法(构造器)来创建该类的对象,还可以用反射来创建对象。

类是面向对象的重要内容,可以把类当成一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量。就是说类是引用类型。类(class)和对象(Object或是实例(instance))是面向对象的核心.

类中通常包含三个成员:构造方法,成员变量,成员方法。三种成员都可以定义零个或多个,类中各成员的定义顺序没有影响,成员之间可以调用,但是,static修饰的成员不能访问没有static修饰的成员。

在面向对象的变成思想中,把对象的静态特征和动态特征分别称为对象的属性和方法。对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相成不可分割。

骆驼命名法:方法或变量名的第一个单词的首写字母小写,后面每个单词的首字母大写;
帕斯卡命名法:每个单词的首字母大写。类的命名就是用帕斯卡命名法。

main()方法是程序的入口,可以出现在任何一个类中,但是每个类中仅且只能有一个main()主方法,

面向对象的优点:
1,与人类的思维一致;
2,信息隐藏,提高了程序的可维护性和安全性,封装实现了模块化和信息隐藏,即将类的属性和行为封装在类中,这保证了对它们的修改不会影响到其他对象,有利于维护。同时,封装使得在对象外部不能随意访问对象的属性和方法,避免了外部错误对他的影响,提高了安全性。
3,提高了程序的可重用性,一个类可以创建多个对象实例,增加了重用性。

类的使用步骤:
1,定义类:使用关键字class。
2,创建类的对象,使用关键字new。
3,使用类的属性和方法,使用“.”操作符。

涉及类的方法调用,均使用下面两种方式:
1,在同一个类中,直接使用方法名调用该方法;
2,不同类的方法,首先创建对象,再使用“对象名.方法名()”来调用。

编写方法和调用方法时常用错误:
1,方法的返回值时void,方法中不能有return语句;
2,方法不能返回多个值;
3,多个方法不能相互嵌套定义,一个方法中不能再定义另一个方法;
4,不能在方法外部直接写程序逻辑代码。

变量的作用域:
1,类中定义的变量称之为成员变量,如果定义是时没给它赋值,java会给它赋一个默认的值,它的作用域是整个类内部,可以

直接调用,如果访问修饰符允许,其他类在创建该类对象后也可以调用。
2,方法中定义的变量称之为局部变量。在方法中定义时一定要先赋值在使用,不然会报错。他的作用域仅限于方法内部,在同一个方法中,不允许有同名的局部变量,在不同的方法中可以有同名的变量。
3,局部变量和全成员量可以同名,并且可以同时使用,但是局部变量具有更高的优先级,如果同时使用,成员变量前加“this.”this关键字是对一个对象的默认引用,在每个实例方法内部,都有一个this引用变量,指向调用这个方法的对象。因为this在对象内部指代自身的引用,所以this只能调用实例变量,实例方法和构造方法。this不能调用类变量和类方法,也不能调用局部变量。

生成JavaDoc文档有两种方式 1-使用命令行方式生成; 2-使用MyEclipse工具生成(File-->Export--“导出”对话框-->java菜单-->JavaDoc提交即可)。

形参是在定义方法时对参数的称呼,目的时定义方法需要传入的参数个数和类型。实参是在调用方法时传给传给方法处理的实际值。
注意两点:
1,先实例化对象,在调用方法,
2,实参的类型,数量,顺序都要和形参一致。


JAVA提供包来管理类,类似于文件存储在文件夹中。包的作用主要有以下三个方面:(package cn,q,q...包的声明必须是java源文件中的第一条非注释性的语句,而且包源文件有且只能有一条包声明语句。)
1,包允许将类组合成较小的单元(可以视为文件夹),容易找到和使用相应的类文件,
2,防止命名冲突
3,包允许在更广的范围内保护类,数据和方法,都可以在包内定义,根据规则,包外的的代码有可能不能访问该类。

生成随机数的方法:
1,可以使用Math.random()产生一个范围在0-1之间的double类型的随机数。
2,在java.util这个包里提供了一个Random的类,我们可以新建一个Random 的对象来产生随机数,他可以产生随机整数,随机float,随机double ,随机long。这也是常用的取随机数的方法。
3,在我们的system类中有一个currentTimeMillis()方法,这个方法是返回一个从1970年1月1号0时0分0秒到目前的一个毫秒数,返回类型时long,我们可以拿它作为一个随机数,拿它对一些数取模,就可以把它限制在一个范围内。

面向对象设计的过程就是抽象的过程,分三步来完成:
1.发现类;
2。发现属性;
3.发现方法。

构造方法的名称和类名相同,没有返回值类型(连void也没有),构造方法的主要作用就是在创建对象时执行一些初始化操作,如给成员属性赋值。

在没有给类提供构造方法时,系统会提供一个无参的方法体为空的默认构造方法,

一旦提供了自定义的构造方法,系统将不再提供这个默认构造方法,如果要使用,你丫的必须要自己去添加。
学会了如何创建对象,怎么销毁对象呢?在java中,对象的销毁不需要你丫的去做,而是通过java虚拟机的垃圾回收器在后台自动完成,

如果同一个类中包含了两个或两个以上的方法,他们的方法名相同,方法参数的个数或类型不同,则称该方法被重载了,这个过程被称为方法重载,成员方法和构造方法都可以被重载。

*********************************************************************************

static静态修饰符
static可以用来修饰属性,方法和代码块。static修饰的变量属于这个类所共有,即由这个类创建的对象共享这个变量,通常把由static修饰的属性和方法称为类属性(类变量)或类方法。不使用static修饰的属性和方法属于单个对象,称为实例属性(实例变量)和实例方法。
1,在加载类的过程中,完成静态变量的内存分配,再执行静态块,两者是在创建对象之前执行的。
2.类属性和类方法可以通过类名和对象名来访问,实例属性和实例方法只能通过对象名来调用。
3.类方法只能访问类属性和其他方法,其他方法无法调用类方法。

常见错误:
1,在方法里面不能定义static变量。类变量不可以是局部变量。
2,构造方法不能有返回值,如果有那么他就是一个普通的成员方法。

****************************************
面向对象的三大特性:
1.封装:就是将类的状态信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的set(),get()方法来实现对隐藏信息的操作和访问。
2.继承:将一组类中的相同属性和方法抽取成为一个父类,而子类保留自己特有的属性和方法。相同的属性和方法从父类继承,避免了代码重复,也方便了日后的代码修改;{修饰符 SubClass(子类) extends SuperClass(父类){//类定义部分}}

子类中可以根据需求对从父类继承的方法进行重新编写,成为称为方法的重写(overwiring)或法方法的覆盖(overriding).它必须满足4点要求:
1.方法名必须相同
2.具有相同的参数
3.返回值相同或者重写方法是被重写方法的子类
4.重写方法不能缩小被重写方法的访问权限

重载(overloading)和重写(overriding)的区别和联系
1.重载涉及同一个类中的同名方法,要求方法名相同,参数列不同,与返回值类型,访问修饰符无关。
2.重写涉及的是子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或是其子类),访问修饰符不能严于父类。

在子类中想调用父类被重写的方法,在子类方法中通过“super.方法名”来实

现。
super代表对当前对象的直接父类对象的默认引用。在子类中可以通过super关键字来访问父类中的成员。

Object类是所有的类的父类,所有的java类都直接或间接地继承了https://www.360docs.net/doc/7116970227.html,ng.Object类,

抽象类和抽象方法的特点:
1.抽象类和抽象方法都是通过abstract关键字来修饰
2.抽象类不能实例化。抽象类中可以有零个或多个抽象方法
3。抽象方法只有方法声明,没有方法实现,有抽象方法的类必须声明为抽象类,子类必须重写所有的抽象方法才能实例化,否则自雷还是一个抽象类。
4.抽象类可以有构造方法。其构造方法可以被本类的其他的构造方法调用,若此构造方法不是由private修饰的,也可以被类的子类中的构造方法调用。


final修饰符
1.被final修饰的类,不能再被继承
2.被final修饰的方法不能被子类重写
3.用final修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次。

abstract不能和private同时修饰一个方法;
abstract不能和final同时修饰一个方法或类;
abstract不能和static同时修饰同一个方法(abstract是没有实现的方法,要由子类重写,而static修饰的方法是类方法不允许重写,两者矛盾,所以不能同时修饰一个方法)。

多态不仅可以减少代码量,还可以提高代码的可扩展性和可维护性。
多态的实现思路:编写具有继承关系的父类和子类;子类重写父类的方法,使用父类的引用类型指向子类的对象。
多态是具有表现多种形态能力的特征,更专业化的说法,同一个实现接口,使用不同的实例而执行不同的操作。多态和继承,方法重写有密切关系。

子类转换成父类的规则:
1,将一个父类的引用指向一个子类对象,称为向上转型(upcasting)自动进行类型转换;
2,此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法 。不是弗雷德方法。
3,此时通过父类引用变量无法调用子类特有的方法。/

实现多态的方式:
1,使用父类作为方法形参,使用父类作为方法的形参优势明显,或者说使用多态的优势明显,可以减少代码量,提高代码的可扩展性和可维护性,。
2,使用父类作为方法的返回值,将一个指向子类对象的父类引用赋给一个子类的引用,我们称之为向下转型,此时必须进行强制类型转换,使用转换符(instanceof)。
***
对象名 instaneof 类名或接口名
****
instanceof运算符用来判断一个对象是否属于一个类或者实现一个接口,结果为true或false.在强制转换之前通过instanceof运算符检查对象的真实类型,在进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
在进行引用类型转

换是,先通过instanceof运算符进行类型判断,在进行相应的强制类型转换,这样可以有效地避免出现类型转换异常。
使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现编译错误,例如:pet instanceof String 就会出现错误。
instanceof 通常和强制类型转换结合使用。

接口是抽象类的延伸,可以看成特许的抽象类,接口中的方法都是没有方法体的,接口的方法必须被定义为publi或abstract形式,不能被其他的修饰符修饰,即使不加public编译器也会给它加上public。
在接口中定义的任何字段都是static和final的。
接口是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但都是没有方法的实现。
抽象类利于代码复用,接口利于代码的扩展和维护。
java中定义接口的语法:
*********
修饰符 interface 接口名 extends 父类接口1,父类接口2,。。。。{
//定义常量
//定义方法
}

例如
public interface usb{//定义全局静态常量 //定义抽象方法}
*********
//类实现接口的方法
class 类名 extends 父类名 implements 接口1,接口2,。。。。{//类成员}
*******
注意
1,接口的命名规则与类相同,
2,接口中的可以定义常量,不能定义变量,接口中的变量都会自动用public static final修饰,即接口中的属性都是全局静态常量,接口中的常量必须在定义时指定初始值。
3,接口中的所有的方法都是抽象方法,接口中方法都会自动用public abstract修饰,即接口中只有全局抽象方法。
4,接口和抽象类一样,两者都不能被抽象化,接口中一定不能有构造方法。
5,接口之间可以通过xtends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
6,接口的实现类必须实现接口的全部方法,否者必须定义为抽象类。
******
接口表示一种能力,一个类实现了某个接口,就表示这个类具备了某种能力。程序中一个类可以实现多个接口。接口不仅弥补了java只支持单继承的缺点,还利与代码的扩展和维护,接口类似于一个组件,可以在需要时自由组装,从使用角度来讲,接口和抽象类的区别在于,抽象类利于代码复用,接口利于代码维护。
***
接口还表示一种约定,在面向对象编程中提倡面向接口编程,而不是面向实现编程。接口体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码之间的耦合性,提高代码的可扩展性,和可维护性。面向接口编程就意味着:开发系统时,主架构使用接口,接口构成系统的骨架,这样就可以通过更换实现接口的类来实现更换系统。
*******
异常处

理机制就是预先想好一些处理的方法,也就是说,在程序执行代码的时候,万一发生了异常,程序会按照预定的处理方法对异常进行处理,异常处理之后,程序继续执行。异常处理是通过五个关键字——try,catch,finally,throw和throws来实现。
1.如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略。
2.如果try语句块在执行过程中遇到异常,并且这个异常于catch中声明的异常类型相匹配,那么在try块中其余剩下的代码都会被忽略,而相应的catch块将会被执行。匹配是指catch所处里的异常类型于所生成的异常类型完全一致或是它的父类。
3.如果try语句块在执行过程中遇到异常,而抛出的异常在catch块中没有被声明,那么程序立即退出。也可以在catch中加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用方法:
(1)void printStackTrace():输出异常的堆栈信息,堆栈信息包括程序运行到当前类的执行流程,它将输出从方法调用处到异常抛出处的方法调用序列。
(2)String getMessage() 返回异常信息描述字符串,该字符串描述异常产生的原因,是printStackTrace()方法输出信息的一部分。
system.exit(0)——正常退出虚拟机;
system.exit(1)——强制退出虚拟机。
如果try块在在执行过程中遇到异常,那么try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,包括异常的类型,一场出现是程序的运行状态以及对该异常的详细描叙,如果想和个异常对象与catch中声明的异常类型相匹配,则会把该异常对象赋给catch后面的异常参数,相应的catch块将会被执行。
**********
以下是常见的异常及其用途:
*************************************************************************************************************
异常 说明
*************************************************************************************************************
Exception 异常层次结构的根类
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsAxception 数组下标越界
NullPointerException 尝试访问null对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲获得的数据类型与实际输入的类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把“abc”转换成数字
*************************************************************************************************************
在try-catch语句块后加入finally块,无论是否发生异常,finally块中的代码总能被执行。

try-catch-finally程序块执行的流

程大致分为两种情况:
1.如果try块种所有语句正常执行完毕,catch块中的语句将不会被执行,finally块就会被执行。
2.如果try语句块在执行过程中碰到异常,无论这种异常是否能被catch块扑捉到,都将执行finally块中的代码,try-catch-finally结构中try块是必须的,catch和finally块是可选的,但两者至少必须出现其中的一种,需要特别注意的是:
*********************
***********************
如果在try块和catch块中存在return语句,finally也会执行。发生异常的执行顺序是:先执行try块和catch块中的return之前的语句,然后跳到finally语句执行完毕后,再跳回try块和catch块中执行return,然后跳出。
只有一种情况finally块中的语句不执行,就是try块和catch块中有 system exit(1); 这条语句表示强制退出虚拟机!
***************************
一段代码可能会引发多种异常,这时,可以在一个try块后面跟多个catch语句块,分别处理不同的异常。但是排列顺序必须是从子类到父类,最后一般都是Exception类。因为所有的异常子类都继承自Exception类,所以如果将父类异常放到前面,那么所有的异常都将被捕获,后面catch块中子类异常将得不到被执行的机会。
当运行时,系统从上到下分别对每个catch语句块处理的异常类型进行检测,并执行第一个于异常类型匹配的catch语句。执行其中的一条catch语句之后,其后的catch语句都将被忽略。
声明异常——throws。。如果在一个方法体中抛出了异常,我们就希望调用者能够及时的捕获异常,那么如何通知调用者呢?Java语言中通过关键字throws声明某个方法可能抛出的各种异常,throws可以声明多个异常,之间用“,”隔开。
抛出异常——throw。。除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常的范围内,性别输入不是“男”或“女”等,此时需要程序员而不是系统来自动抛出异常,把问题提交给调用者去解决。

private ststic final Logger logger = Logger.getLogger(Calculator.class);

****************************
throws和throw的区别表现在以下三个方面:
1.作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出异常。
2.使用的位置不同:throw位于犯法体内部,可以作为单独语句使用,throws必须跟在方法参数列表的后面,不能单独使用。
3.内容不同:throw抛出一个对象,只能抛出一个;throws后面跟异常类,而且可以跟多个异常类。
************************************

异常的分类。Java的异常体系包括异常类,它们之间存在继承关系。
1.Throwsable类,所有的异常类型都是Throwsable类的子

类,它会派生处两个子类,即Error和Exception。
2.Error类:表示仅靠程序本身无法恢复的严重错误,

相关文档
最新文档