前言
看大话设计模式的时候,发现自己的基础不是很扎实,重新回顾一些存在有点点不确定的内容,并从书中截取下来,做成笔记快速复习。
1、字段和属性
- 字段:用
private
修饰,也叫私有变量。 - 属性:字段的类中,具有
set
和get
方法时,该字段称为属性。
2、三大特性
2.1、封装
每个对象都包含它能进行操作所需要的所有信息
优点:
1、良好的封装能够减少耦合
2、类内部的实现可以自由地修改
3、类具有清晰的对外接口
2.2、继承
对象的继承是一种 ‘is-a’ 的关系,“B是A”(二哈是狗),表示B可以继承A。
B是A的特殊化,除了A(狗)的特性外,还具有自己独有的个性(🐶)
A:父类(基类);B:子类(派生类)
注意:两个类之间是 ‘has-a’ 的关系时,表示某个角色具有某一项责任,不适合继承
重点:
1、子类拥有父类
非private
的属性和功能
2、子类具有自己的属性和功能,即子类可以加入父类没有的属性和功能
3、子类还可以 以自己的方式 实现父类的功能(重写Override)
4、对于构造方法,它不能被继承,只能被调用。例子如下
// 父类
public class Dog{
protected String name = "";
public Dog(){
this.name = "dog";
}
}
// 子类
public class eha extends Dog{
public eha(){
super();
}
}
补充:
protected
表示继承时,子类可以对父类有完全的访问权
优点:
继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展更为容易。
缺点:
父类变,子类也得变;继承会破坏包装,父类实现细节暴露给子类;父类与子类强耦合。
2.3、多态✨
多态:不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行
注意:
1、子类以父类的身份出现
2、子类在工作时,以自己的方式来实现
3、子类以父类的身份出现时,子类特有的属性和方法不可以使用
对象的声明:父类(狗)
实例化的对象:子类(二哈,柯基)
狗 dog = new 二哈();
狗 dog = new 柯基();
PS:这里还没有看的很具体,后面有内容再补充
3、抽象类
实例化没有任何意义的父类,可以改成抽象类。
类和方法用abstract声明,为抽象类和抽象方法
public abstract class 抽象类名{
...
// protected表示继承时,子类可以对父类有完全的访问权
protected abstract String 抽象方法名();
}
注意:
1、抽象类不能实例化(不能new的;‘动物’是抽象的,没有具体对象与之对应,实例化没有意义)
2、抽象方法是必须被子类重写的方法(本来就啥也没有,不重写就没意义了)
3、如果类中包含抽象方法,那类必须定义为抽象类,无论是否包含其他一般方法。
4、抽象类拥有尽可能多的共同代码,拥有尽可能少的数据。
- 问题:什么时候用抽象类?
抽象类代表一个抽象的概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定时用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当时具体类,而树枝节点均应当时抽象类。
4、接口
接口:把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。
抽象类和接口的异同:
- 相同:声明接口语法和抽象类一样,在类上,class前面加上关键字(interface;abstract)
- 区别1:
1、类是对对像的抽象,抽象类是对类的抽象,接口是对行为的抽象。
2、如果行为跨越不同类对象,可以使用接口;对于一些相似的类对象,用继承抽象类。
3、从设计角度,抽象类是从子类中发现公共的东西,泛化出父类,然后子类继承父类;而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义(CRUD久了,一点就通🤔)
【抽象类是自底向上抽象,接口是自顶向下设计】
- 区别2:如下表
接口 | 抽象类 |
---|---|
不包含任何成员的实现方法(含有具体实现的方法) | 可以包含 |
成员(接口中的方法)需要实现类实现 | 抽象成员可以被子类部分实现 |
一个类可以实现多个接口 | 一个类只能继承一个抽象类 |
-
规范:
在类名需要前加上一个大写的I
-
理解:
5、装箱和拆箱
装箱:把值类型打包到Object引用类型的一个实例中
拆箱:从对象中提取值类型
// 装箱 boxing
int i = 1;
Object o = (Object)i;
// 拆箱 unboxing
o = 2;
i = (int)o;