一、类与实例
-
面向对象编程:Object-Oriented Programming(将数据放在第一位,再考虑操作方法[1])
-
对象:对象是一个自包含的实体,用一组可识别的特性和行为来标识。
-
类:具有相同属性和功能的对象的抽象的集合,用关键字class定义
- 类名称首字母要大写
- 对外公开的方法要用public 修饰符
- 实例:一个真实的对象,用关键字new创建,创建对象的过程就是“实例化”
二、构造方法
-
构造方法:又名“构造函数”,作用是对类进行初始化。
-
构造方法与类同名,无返回值,不需要void,在new时调用
- 每个类中至少有1个构造方法。
- 若用户没有明写,则系统默认生成空的构造方法,若有定义的构造方法,则默认的构造方法就失效了,即这个类没有默认的无参构造方法,若需要则显式地定义把!
public class Student { private int stuID; private String stuName; public Student(){} //显式定义一个无参构造 public Student(int stuID){ //定义一个单参构造 this.stuID=stuID; } public Student(int stuID, String stuName){ //定义一个两个参数的构造函数 this.stuID=stuID; this.stuName=stuName; } }
三、方法重载(Overload)
-
重载(overloading) 是在一个类里面,方法名字相同,而参数类型或个数不同。返回类型可以相同也可以不同。
-
意义:可以再不改变原方法的基础上,新增功能。
四、属性与修饰符
(这一部分可能和Java的说法不太一样)
-
属性:“属性是一个方法或一对方法,但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合”(有点懵)
-
属性有set和get方法
-
字段:字段是存储类要满足其设计所需要的数据,字段是与类相关的变量。
-
通常,字段都是private,是类中私有的变量;属性是public,公有的变量。
五、封装(encapsulation)
-
封装:每个对象都包含它能进行操作所需要的所有信息,这个称为封装,因此对象不需要依赖其他对象来完成自己的操作。
-
通俗:将数据和行为组合在一个包中,给对象赋予了“黑盒”的特征,提供重用性和可靠性。
-
意义
-
良好的封装可以减少耦合;
-
类内部的实现可以自由地修改;
-
类具有清晰的对外接口。
六、继承
-
‘is-a’表示继承,若对象B是对象A,则表示对象B可以继承A。
-
继承者可以理解是对继承者的特殊化,除被继承者的特性之外,还具备自己独有的个性。
- “has-a”:聚合关系,一个对象包含另一个对象,例如:手不能继承自一个人。
- “uses-a”:依赖关系,如果一个类的方法操作另一个类的对象,则说一个类依赖另一个类。[1,P94]
-
划重点
-
子类拥有父类的非private属性和功能(public、protected);
-
子类具有自己的属性和功能,父类可能没有;
-
子类可以以自己的方式实现父类的功能(方法重写/覆写(Override))
-
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
-
protected表示继承时子类可以对基类有完全的访问权,protected修饰的类成员对子类公开,对其他类不公开。
- Java中注意:
- Java不允许多重继承;
- 实例化子类时默认调用子类的构造方法,但会先对父类进行实例化。
- 若父类没有写午餐构造,则子类中必须用super调用相应参数,(所以还是习惯性写个无参构造把)
-
子类可以从父类中继承:方法、域、属性、事件、索引指示器;但构造方法不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。
public class SmallStudent extends Student { private int age; }
- 作用:继承定义了类如何相互关联、共享特性。
- 意义:使所有子类公共的部分都放在了父类,使得代码得到了共享,避免重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。
- 缺点:父类变,子类也得变;继承会泡坏包装,父类实现细节暴露给子类,增加了类之间的耦合性。
- 继承时一种类与类之间的强耦合关系
- 工作方式:定义父类(基类)和子类(派生类),子类继承父类的几乎所有特性,还可以定义新的特性。
七、多态
-
多态:多态表示不同的对象可以执行相同的操作,但是要通过他们自己的实现代码来执行。
-
子类以父类的身份出现
-
子类在工作时以自己的方式来实现。
-
子类以父类身份出现时,子类特有的属性和方法不可以使用
-
怎么做
-
父类要讲这些成员声明为虚拟的,返回值类型添加virtual关键字。
-
除了字段不能虚拟,属性时间和索引器都可以是虚拟的
-
子类使用override关键字覆写父类的这个抽象方法
-
原理:当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承连最末端的方法实现会被调用。“虚方法时按照其运行时类型而非编译时类型进行动态绑定调用的”
- 多态性形成主要有两方面的原因组成
- 方法的多样性:
- 方法重载:同一个方法,不同的参数个数、类型,实现不同的功能(名字相同而已);
- 方法覆写:不同子类根据同一个方法有不同的实现(固定模板);
- 对象的多样性:
- 对象的向上转型
- 对象的向下转型
- 方法的多样性:
八、重构
-
重构(Refactoring)就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
-
体现在把重复部分尽量写在父类中,子类中尽量少重复,只保留个性部分。
九、抽象类
-
把实例化没有任何意义的类,改成抽象类,例如:动物
-
用关键字abstract声明一个抽象的类或方法
-
注意:
-
抽象类不能实例化
-
抽象方法是必须被子类重写的方法
-
如果类中包含抽象,则这个类必须是抽象类
-
抽象类中可以有非抽象方法
-
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。
public abstract class People { }
十、接口
-
接口:接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合,一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。
-
声明接口语法上和声明抽象方法是一样的,但是接口不允许提供接口中任何成员的执行方法。
-
接口不能实例化,实现接口的类就必须实现接口中所有的接口和属性
-
一个类可以支持(继承)多个接口,不同的类也可以继承相同的接口。
-
命名:IName
-
抽象类和接口的区别
-
继承抽象类和实现接口不冲突。
-
抽象类可以给出一些成员的实现;接口不包含成员的实现。
-
抽象类的抽象成员可以被子类部分实现;接口要求成员需要实现类的完全实现。
-
一个类只能继承一个抽象类;一个类可以实现多个接口。
-
划重点
-
类是对对象的抽象;抽象是对类的抽象;接口是对行为的抽象。
-
如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。
-
从设计角度讲,抽象类时从子类中发现了公共的东西,泛化出父类(抽象类往往是重构来的),然后子类继承父类,但接口是根本不知道子类的存在
public interface IFly { }
十一、集合
-
数组
-
优点:在内存中连续存储,可快速且容易地从头到尾遍历元素,可以快速修改元素。
-
缺点:创建时必须要指定数组大小,两个元素之间插入元素困难
-
ArrayList
-
装箱:把值类型打包到Object引用类型的一个实例中
-
拆箱:从对象中提取值类型。
十二、泛型
-
泛型:泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符,泛型集合类可以将类型参数用作它所存储对象的类型的占位符,类型参数作为其字段的类型和其方法的参数类型的出现。
-
通常情况系啊,建议使用泛型集合,省事,例如
List<String> list=new ArrayList<String>();