使用Java实现面向对象编程

使用Java实现面向对象编程
使用Java实现面向对象编程

使用Java实现面向对象编程

第一章抽象和封装

1.1 用面向对象设计电子宠物

面向对象设计的过程就是抽象的过程:

第一步:发现类。

第二步:发现类的属性。

第三步:发现类的方法。

软件出现的目的是为了:

用计算机的言语描述现实世界。

用计算机解决现实世界的问题。

抽象是遵循的原则:

属性、方法的设置是为了解决业务的问题。

关注主要属性、方法

如没有必要、勿增加额外的类、属性与方法。

类的基本结构:

其主要由属性和行为组成,成为类的成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包括构造方法、代码块等)。

类与对象:

通过构造方法来创建对象,例如”Penguin p = new Penguin(;”。

通过对象名.属性名的方式调用属性,例如”https://www.360docs.net/doc/9e5115820.html,=”pp”;”。

通过对象名.方法名的方式调用属性,例如”p.print(;”。

类(Class和对象(Object是面向对象中的两个核心概念。类是对某一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该事物的个体、是具体的、现实的。

类的规范:

类名、属性名、方法名以及常量名的命名规范如下:

类名由一个或几个单词组成,每个单词的第一个字母大写。

属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写。

常量名由一个或几个单词组成,所有字母大写。

Static可以用来修饰属性、方法和代码块。Static修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。通常把static修饰的属性和方法称为类属性(类变量)、类方法。不使用static修饰的属性和方法,属于单个对象,通常称为实例属性(实例变量、实例方法。

类属性、类方法可以通过类名和对象名访问,实例属性、实例方法只能通过对象名访问。Final可以用来修饰属性、方法和类。用final修饰的变量成为常量,其值固定不变。

1.2 构造方法及其重载

构造方法

构造方法(Constructor是一个特殊方法,它用于创建类的对象,因此一类必须包含至少一个构造方法,否则就无法创建对象。

构造方法的名字和类名相同,没有返回值类型。构造方法的作用主要就是在创建对象时执行一些初始化操作。

在没有给类提供任何构造方法时,系统会提供一个无参的方法体为空的默认构造方法。一旦提供了自定义构造方法,系统将不会在提供这个默认构造方法。如果要使用它就必须手动添加。

方法重载

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

方法重载的判断依据如下:

1. 必须是在同一个类里。

2. 方法名相同。

3. 方法参数个数或参数类型不同。

4. 与方法返回值和方法修饰符没有任何关系。

封装

封装(Encapsulation是类的三大特性之一,就是将类的状

态信息隐藏在类内部,不允许外部程序直接访问,而是

通过该类提供的方法来实现对隐藏信息的操作和访问。

封装的具体步骤:

1. 修改属性的可见性来限制对属性的访问。

2. 为每个属性创建一对赋值(setter方法和取值(getter方法,用于对这些属性的存取。

3. 在赋值方法中,加入对属性的存取控制语句。

封装的好处:

1. 隐藏类的实现细节 .

2. 让使用者只能通过程序员规定的方法来访问数据。

3. 可以方便地加入存取控制语句,限制不合理操作。

访问修饰符:

Private:成员变量和方法只能在类内被访问,具有类可见性。

默认:成员变量和方法只能被同一个包里的类访问,具有包可见性。

Protected:可以被同一个包中类访问,被同一个项目中不同包中的子类访问。

Public:可以被同一个项目中所有类访问,具有项目可见性,这是最大的访问权限。

This关键字

1. 使用this调用成员变量,解决成员变量和局部变量同名冲

突。

Public void setName(String name{

https://www.360docs.net/doc/9e5115820.html, = name;//成员变量和局部变量同名必

须使用this

}

Public void setName(String xm{

Name = xm ; //成员变量和局部变量不同名,this可以省略

}

2. 使用this调用成员方法

Public void play(int n{

Health = health – n;

This.print(;//this可以省略,直接调用print(;

}

3. 使用this调用重载的构造方法,只能在构造方法中

使用,必须是构造方法的第一条语句。

Public Penguin(String name,String sex{

https://www.360docs.net/doc/9e5115820.html, = name;

This.sex = sex;

}

Public Penguin(String name,int health,int love,String sex{

This(name,sex; //调用重载的构造方法

This.health = health;

This.love = love;

}

因为this是在对象内部指代自身的引用,所以this只能调用实例变量、实例方法和构造方法。

This不能调用类变量和类方法。

This也不能调用局部变量。

第二章继承

继承的概念

继承(InHeritance通过extends关键字来实现,其中SubClass称为子类、SuperClass称为父类、基类或超类。修饰符如果是public,该类在整个项目中可见;不写public修饰符则该类只在当前包可见;不可以使用private和protected修饰符。

子类可以从父类中继承的有:

继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里。

继承默认权限修饰符的属性和方法,但子类和父类必须在同一个包里。

无法继承private修饰的属性和方法。

无法继承父类的构造方法。

方法的重写

在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖(overriding。

1. 重写方法和被重写方法必须具有相同的方法名。

2. 重写方法和被重写方法必须具有相同的参数列表。

3. 重写方法的返回值类型必须和被重写方法的返回值类型相

同或者是其子类。

4. 重写方法的不能缩小被重写方法的访问权限。

Super关键字

Super代表对当前对象的直接父类对象的默认引用。

Super必须是出现在子类中(子类的方法和构造方法中),而不是其他的位置。

可以访问父类的成员,例如父类的属性、方法、构造方法。

注意访问权限的限制,例如无法通过super访问private成员。

继承条件下构造方法的调用规则如下

1. 如果子类的构造方法中没有通过super 显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。

2. 如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。

3. 如果子类的构造方法中通过this显式调用自身的其他的构造方法,有相应构造方法中应用以上两条规则。

4. 特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。

在构造方法中如果有this语句或super语句出现,只能是第一条语句。

在一个构造方法中不允许同时出现this和super语句(否则就有两条第一条语句)。

在类方法中不允许出现this或super 关键字。

在实例方法中this和super语句不要求是第一条语句,可以共存。

抽象类和抽象方法

抽象类和抽象方法都通过abstract关键字来修饰.

抽象类不能实例化。抽象类中可以没有,可以有一个或多个抽象方

法,甚至可以全部方法都是抽象方

法。

抽象方法只有方法声明,没有方法

实现。有抽象方法的类必须声明为

抽象类。子类必须重写所有的抽象

方法才能实例化,否则子类还是一

个抽象类。

Abstract可以用来修饰类和方法,但

不能用来修饰属性和构造方法。Final修饰符

1. 用final修饰的类,不能再被继承。

2. 用final修饰的方法,不能被子类重写。

3. 用final修饰的变量(包括成员变量和局部变量将变成

常量,只能赋值一次。

4. 使用final修饰引用型变量,变量的值是固定不变

的,而变量所指向的对象的属性值是可变的。

Final和abstract比较

Abstract可以用修饰类和方法,不能用来修饰属性和方法。

Final可以用来修饰类、方法和属性,不能修饰构造方法。

Abstract不能和private同时修饰一个方法。

Abstract不能和static同时修饰一个方法。

Abstract不能和final同时修饰一个方法和类。

第三章多态

多态的概念

多态(Polymorphism是具有表现多种形态的能力的特征。

同一个实现接口,使用不同的实例而执行不同的操作。

子类转换父类时的规则

1. 将一个父类的引用指向一个子类的对象,称为向上转型(upcasting,自动进行类型转换。

2. 此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。

3. 此时通过父类引用变量无法调用子类特有的方法。

实现多态的三个条件

1. 继承的存在。(继承是多态的基础,没有继承就没有多

态。

2. 子类重写父类的方法(多态下调用子类重写后的方

法)。

3. 父类引用变量指向子类对象(子类到父类的类型转

换)。

父类到子类的转换

将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型。

向下转型后可以访问子类特有的方法。必须转换父类指向的真实子类类型,否则将出现类型转换异常ClassCastException。

Instanceof运算符

对象 instanceof 类或接口

该运算符用来判断一个对象是否属于一个类或者实现一个接口,结果为true或false。在强制类型转换之前通过instanceof运算符检查对象的真实类型,然后再进行相应的强制转换,这样就可以避免类型转换异常,从而提高代码健壮性。

使用instanceof时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现编译错误。

Public class TestPoly2{

Public static void main(String [] args}{

Pet pet = new Penguin(“楠楠”,”Q妹”;

Pet.eat(;

If(pet instanceof Dog{

Dog dog = (Dog pet;

dog.catchingFlyDisc(;

}else if(pet instanceof Penguin{

Penguin pgn = new Penguin(;

pgn.swimming(;

}

}

}

第四章接口

接口的实现和继承

1. 接口和类、抽象类是一个层次的概念,命名规则相

同。如果修饰符是public,则该接口在整个项目中可

见。如果省略修饰符,则该接口只在当前包可见。

2. 接口中可以定义常量、不能定义变量。接口中属性都

会自动用public static final修饰,即接口中属性

都是全局静态常量。接口中的常量必须在定义时指定初

始值。

3. 接口中所有方法都是抽象方法。接口中方法都会自动

用public abstract 修饰,即接口中只有全局抽象方

法。

4. 和抽象类一样,接口同样不能实例化,接口中不能有

构造方法。

5. 接口之间可以通过extends 实现继承关系,一个接

口可以继承多个接口,但接口不能继承类。

6. 一个类只能有一个直接父类,但可以通过

implements实现多个接口。类必须实现接口的全部方

法,否则必须定义抽象类。类在继承父类的同时又实现

了多个接口时,extends必须位于implements之前。

接口体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护

性。面向接口编程意味着:开发系统时,主体构架使用接

口,接口构成系统的骨架,这样就可以通过更换实现接口的类来实现更换系统。

在C#中使用接口

1. 接口之间可以通过冒号”:”实现继承关系,一个接口可以继承多个接口,但接口不能继承类。类只能继承一个类,但可以实现多个接口,使用冒号”:”来继承类和实现接口。

2. 接口定义零个或多个成员,成员主要是方法,属性和索

引器。接口中不能包含常量、变量或构造方法,也不能包

含任何静态成员。

3. 接口中成员访问权限是public,定义接口时显示指定任

何修饰符都是非法的。

4. 按照惯例,C#中接口的名字以大写字母“I”开头。

C#中接口中成员主要是方法、属性和索引器。接口中不能包含常量、变量、构造方法和任何静态成员。定义接口时显示指定任何修饰符是非法的。

第八章异常

异常的概念

异常就是在程序的运行过程中所发生的不正常的事件。

常见的异常类型

异常说明

Exception异常层次结构的根类

ArithmeticException算数错误情形,如以零作除

数ArrayIndexOutOfBoundsException数组下标越界NullPointerException尝试访问null对象成员ClassNotFoundException不能加载所需的类

InputMismatchException欲得到的数据类型与实际输

入的类型不匹配IllegalArgumentException方法接收到非法参数ClassCastException对象强制类型转换出错NumberFormatException数字格式转换异常

Throw和throws的区别表现在以下三个方面

1. 作用不同:throw用于程序员自行产生并抛出异常,

throws用于声明在该方法内抛出了异常。

2. 使用的位置不同:throw位于方法体内部,可以作为单

独语句使用。Throws必须跟在方法参数列表的后面,不能

单独使用。

3. 内容不同:throw抛出一个异常对象,而且只能是一

个。Throws后面跟异常类,而且可以跟多个异常类。

异常分类

Throwable类:所有异常类型都是Throwable类的子类,它派生两个子类:Error和Exception。

Error类:表示仅靠程序本身无法恢复的严重错误,比如说内存溢出动态链接失败,虚拟机错误。应用程序不应该抛出这种这种类型的对象(一般是由虚拟机抛出)。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行程序设计时,应该更关注Exception类。

Exception类:由java应用程序抛出和处理的非严重错误,比如所需文件找不到、网络连接不通或中断、算术运算出错(如被零除、数组下标越界、转载了一个不存在的类,对null对象操作、类型转换异常等。它的各种不同的子类分别对应不同类型的异常。

运行时异常:包括RuntimeException及其所有子类。不要求程序必须对它们做出处理。

Checked异常(非运行时异常:除了运行时异常外的其他由Exception继承来的异常类。程序必须捕获或者声明抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:通过try-catch在当前位置捕获并处理异常,通过throws声明抛出异常交给上一级调用方法处理。

日志及分类

SQL日志:记录系统执行的SQL语句。

异常日志:记录系统运行中发生的异常事件。

业务日志;用于记录系统运行过程,例如用户登录,操作记录。Log4j配置文件

1. 输出级别

Log4j.rootLogger = debug、stdout、logfile

Fatal:指出每个严重的错误事件将会导致应用程序的退出。

Error:指出虽然发生错误事件,但仍然不影响系统的继续

运行。

Warn:表明会出现潜在错误的情形。

Info:在粗粒度级别上指明消息,强调应用程序的运行过

程。

Debug:指出细粒度信息事件,对调式应用程序是非常有帮助的。

各个输出级别优先级为:

Fatal > error > warn > info > debug

2. 日志输出目的地Appender

Log4j.rootLogger = debug、stdout、logfile

其中、stdout、logfile指的是日志输出目的地名字。

ConsoleAppender:输出日志事件到控制台。

FileAppender:输出日志事件到一个文件。

3. 日志布局类型Layout

HTMLLayout:格式化日志输出为HTML表格。

SimpleLayout:以一种非常简单的方式格式化日志输出,它打印级别level,然后跟着一个破折号”-----“,最后是日志消息。

PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。需要配置

layout.ConversionPattern属性,如果没有配置该属性,则使用默认的转换模式。

4. 转换模式ConversionPattern

%d:用来设置输出日志的日期和时间,默认格式为

ISO8601。也可以在其后指定格式,比如%d{yyyy-MM-dd HH:mm:ss},输出格式类似于2010-03-09 17:51:08。

%m:用来输出代码中指定的消息。

%n:用来输出一个回车换行符。

%I:用来输出日志事件的发生位置,包括类名、发生的线程,以及在代码中的行数。

%p:用来输出优先级。

%F:用来输出文件名。

%M:用来输出方法名。

相关主题
相关文档
最新文档