面向对象基础知识
此内容仅用于自己学习,查漏补缺
面向对象:
1.封装(Encapsulation):封装是把数据和行为结合在一个包中,并对对象的使用着隐藏数据的实现过程,数据叫做instance field,方法叫做method,封装起作用的关键时绝对不允许方法直接访问除他自己的字段之外的类中其他的实例字段(instance field),即:程序只能通过对象的方法来与对象的数据发生作用(修改属性的可见性),这也是封装的意义,不让用户直接访问数据,只能通过方法访问数据。
构造函数(structure):名字与类名一致,没有返回类型,目的是在创建实例对象的时候及完成一些方法,以及接收输入的参数;
2.抽象(Abstrction):抽象方法是在抽象类中,是对子类方法的一个声明,抽象方法不含方法体,没有实现的具体功能,具体功能在子类中实现,如果子类也是抽象类,则具体功能在下一级实现。如果一个类含有抽象方法,则这个类一定是抽象类。由于并不是所有的类都是用来描述对象的,所以,如歌一个类中没有足够的信息去描述对象,这个类称为抽象类。一个类只能继承一个抽象类,但是可以实现多个接口。
抽象类特性:
-
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
Interface与Abstraction的区别:Interface中绝不能有方法的具体实现过程(尽管语法上可以),Abstraction中会使用很多的继承,而Interface只是个接口,不会用很多的继承。
3.继承(Extend):继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类可以调用超类的方法。
继承的特性:
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
super关键字与this关键字:
super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。指示编译器调用超类方法的关键字。(覆盖方法)
this:指向自己的引用。
子类构造器:子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
多态:可以将一个子类的对象赋给超类变量。原因:子类对象一定属于超类对象的范畴之内。
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
// SubClass 类继承
class SubClass extends SuperClass{
private int n;
SubClass(){ // 自动调用父类的无参数构造器
System.out.println("SubClass");
}
public SubClass(int n){
super(300); // 调用父类中带有参数的构造器
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
修饰符
访问修饰符:
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- public : 对所有类可见。使用对象:类、接口、变量、方法
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。(用于继承类中修饰变量,方法)
- 无修饰符:对本包可见。
非访问修饰符:
- static 修饰符,用来修饰类方法和类变量。独立于特定对象。并不使用任何一个对象来执行任务,没有隐式参数;没有this参数的方法,不需要本类中的数据,静态方法不操作对象,不能在一个静态方法访问实例字段;静态字段只能访问其他静态字段,调用时不需要构造对象
- **静态变量:**static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
- 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
- final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被重写,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。一旦被赋值,不能被修改,final方法中子类可以继承父类,但不能重写方法。Final实例字段:定义一些不会改变的常量;使用方法private final int var;
- abstract 修饰符,用来创建抽象类和抽象方法。抽象类的唯一目的是为了将来对该类进行扩充。含有抽象方法的类一定为抽象类,抽象方法只含有方法(要去做什么),不含有操作的具体过程(怎么做)。应该区别于interface
- synchronized 和 volatile 修饰符,主要用于线程的编程。
注意各类之间要降低依赖程度;
类与类之间的关系:引自https://www.cnblogs.com/nwnu-daizh/p/10135581.html
依赖(use a):一个类使用到了另一个类,但这种使用关系是偶然的、临时的、脆弱的。面向对象思想应尽量减少两个类之间的依赖。
聚合(has a):关联关系:关联体现的是两个类之间语义级别的一种强依赖关系,如:一个类使用了另一个类作为其参数来传递。
聚合关系:关联关系的一种特殊情况。具有从属性质,聚合关系也是强依赖关系,整体与部分可分如:公司与员工,公司类使用员工类作为参数。
组合关系:聚合关系的一种特殊情况。整体与部分不可分割,是强聚合关系。
继承(is a):继承关系(类与子类,关键字为extends)。
实现关系(类与接口,关键字为interface)。