一~四章总结
一、对象和封装
一、为什么使用面向对象
面向对象就是采用"现实模拟"的方法设计和开发程序。面向对象技术利用“面向对象的思想”去描述“面向对象的世界”,实现了虚拟世界和现实世界的一致行,符合人们的思维习惯,是客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅,同时有代码重用性高、可靠性高等优点,大大提高了软件尤其是大型软件的设计和开发效率。
二、使用面向对象进行程序设计
面向对象设计的过程就是抽象的过程,分以下三步来完成。
第一步:发现类
第二步:发现类的属性
第三步:发现类的方法
抽象时遵循的原则如下。
1、属性和方法的设置是为了解决业务问题
2、关注主要属性和方法
3、如没有必要,勿增加额外的类、属性与方法
三、创建类和对象
使用了this关键字,this通常指当前对象的引用,它可以调用当前对象的成员。
类的基本结构,类主要由属性和行为组成,属性和行为又称为成员变量(或者成员属性)和成员方法,统称为类的成员(除此之外,类的成员还包含构造方法、代码块等)。
Java中创建对象、调用属性及方法的语法和C#中是相同的。
1、通过构造方法来创建对象。
2、通过对象名.属性名的方式调用属性
3、通过对象名.方法名的方式调用方法
类名、属性名、方法名及常量名的命名规范如下。
1、类名由一个或几个单词组成,每个单词的第一个字母大写。
2、属性名和方法名由一个或几个单词组成,第一个单词首字母小写,其他单词首字母大写。
3、常量名由一个或几个单词组成,所有字母大写。
四、构造方法及其重载
构造方法的名称和类名相同,没有返回值类型。
方法名相同,参数列表不同,这称为构造方法的重载。
1、static修饰符
static可以用来修饰属性、方法和代码块。static修饰的变量属于这个类所有,即由这个类创建的对象共用同一个static变量。通常把static修饰的属性和方法称为类属性(类变量)和类方法。不使用static修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)和实例方法。
2、常见错误
1、在方法里不可以定义static变量,也就是说,类变量不能是局部变量
2、构造方法没有返回值类型。如果有,则不是构造方法,而是和构造方法同名的成员方法。
封装是面向对象的三大特征之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的具体步骤:修改属性的可见性来限制对属性的访问:为每个属性创建一对赋值方法和取值方法,用于对这些属性的存取;在赋值方法中,加入对属性的存取控制语句。
封装的好处:隐藏类的实现细节;让使用者只能通过程序规定的方法来访问数据;可以方便地加入存取控制语句,限制不合理操作。
封装时会用到多个权限控制符来修饰成员变量和方法,区别如下。
private:成员变量和方法只能在其定义的类中被访问,具有类可见性。
默认:成员变量和方法只能被同一个包里的类访问,具有包可见性。
protected:可以被同一个包中的类访问,被同一个项目中不同包中子类访问。
public:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限
二、继承
一、继承
Java中继承的语法
修饰符 SubClass extends SuperClass{
//类定义部分
}
继承通过extends关键字来实现,其中的SubClass称为子类,SuperClass称为父类/基类或超类。修饰符如果是public,则该类整个项目中可见;若无public修饰符,则该类只在当前包可见;不可以使用private和protected修饰类。
在Java中,所有的Java类都直接或间接地继承了java.lang.Object类。Object类是所有Java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。
在Java中,子类可以从父类中继承到哪些“财产”呢?
1、继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里
2、继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
3、无法继承private修饰的属性和方法
4、无法继承父类的构造方法
访问修饰符的访问权限,如下所示
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
二、重写和继承关系中的构造方法
1、子类重写父类方法
在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖。方法重写必须满足如下要求。
1、重写方法和被重写方法必须具有相同的方法名
2、重写方法和被重写方法必须具有相同的参数列表
3、重写方法的返回值类型必须和被重写方法的返回值类型相同或是子类
4、重写方法不能缩小被重写方法的访问权限
super代表当前对象的直接父类对象的默认引用。在子类中可以通过super关键字来访问父类的成员。
1、super必须出现在子类(子类的方法和构造函数)中,而不是其他位置
2、可以访问父类的成员,如父类的属性、方法、构造方法
3、注意访问权限的限制,如无法通过super访问private成员
2、继承关系中的构造方法
继承条件下构造方法的调用规则如下。
1、如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法则系统会默认先调用父类的无参构造方法。在这种情况下,有没有“super();”语句,效果都是一样的
2、如果子类的构造方法中通过super显示调用父类的有参构造方法,则将执行父类相应的构造方法,而不执行父类无参构造方法
3、如果子类的构造方法中通过this显示调用自身的其他构造方法,则在相应构造方法中应用以上两条构造
4、特别注意的是,如果存在多级继承关系,则在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
三、抽象类
1、抽象类和抽象方法
抽象类和抽象方法的特点如下。
(1)、抽象类和抽象方法都通过abstract关键字来修饰
(2)、抽象类不能实例化。抽象类中可以没有,有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
(3)、抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类
2、final修饰符
1、final的应用
1、用final修饰的类,不能再被继承。如以下代码所示。
final class Penguin{
}
class SubPenguin extends Penguin{
}
2、用final修饰的方法不能被子类重写,如以下代码所示。
class Penguin{
public final void print(){}
}
class SubPenguin extends Penguin{
public void print(){}
}
3、用final修饰的变量(包含成员变量和局部变量)将变成常量,只能赋值一次,如以下代码所示。
public class Penguin{
final String home="南极";
public void setHome(String name){
this.home=home;
}
}
用final修饰的类,不能再被继承。用final修饰的方法,不能被子类重写。用final修饰的变量将变成常量,只能在初始化时进行赋值,不能在其他地方修改。
三、多态
一、什么是多态
多态是具有表现多种形态的能力的特征。更专业化的说法:同一个实现接口,使用不同的实现而执行不同的操作。
1、子类到父类的转换(向上转型)
子类转换成父类时的规则
1、将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换
2、此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
3、此时通过父类引用变量无法调用子类特有的方法
2、使用父类作为方法形参实现多态
使用父类作为形参优势明显,或者说使用多态的优势明显;可以减少代码量,提高代码的可扩展性和可维护性。
3、使用父类作为方法返回值实现多态
父类到子类的转换。同时,会使用instanceof运算符来判断对象的类型
4、父类到子类的转换(向下转换)
将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转换。此时必须进行强制类型转换。
5、instanceof运算符
Java提供了instanceof运算符来进行类型的判断
语法:
对象 instanceof 类或接口
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false。在强制类型转换之前通过instabnceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
使用父类作为方法形参和使用父类作为返回值类型是使用多态的常用方式。
四、接口
一、接口基础知识
1、什么是接口
接口是一套规范,只要是满足这个规范的设备,就可以将它们组装到一起,从而实现该设备的功能。
Java中接口的定义语法和类实现接口的语法如下。
[修饰符] interface 接口名 extends 父接口1,父接口2,····{
//常量定义
//方法定义
}
class 类名 extends 父类名 implements 接口1,接口2,···{
//类成员
}
一个类只能有一个直接父类,但可以通过implements实现多个接口。当类在继承父类的同时又实现了多个接口时,extends关键字必须位于implements关键字之前。
二、接口表示一种能力
接口不仅弥补了Java只支持单继承的缺点,还利于代码的扩展和维护。接口类似于一个组件,需要时可以自由组装。从使用角度来讲,接口和抽象类的区别在于:抽象类利于代码复用,接口利于代码维护。
三、接口表示一种约定
接口体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。
四、在C#中使用接口
C#中定义接口的语法如下。
[修饰符] interface 接口名:父接口1,父接口2,···{
属性定义
方法定义
}
class 类名:父类名,父接口1,父接口2,···{}
C#中接口的成员主要是方法和属性。接口中不能包含常量、变量、构造方法和任何静态成员。定义接口时显示指定任何修饰符是非法的。