JAVA——(2)OOP面向对象、封装、继承、多态、this、构造方法

时间:2022-01-13 21:56:40
OOP
JAVA是一种面向对象的语言,面向对象三大特性就是封装,继承,多态。
一、类和对象
1、OOP:Object Oriented Programming(面向对象编程):
2、类:具有一定特征的功能的集合,是对一类事物的描述
特征==>属性 /成员变量 / 成员属性
功能==>方法 / 成员方法
对象:一个类的具体存在
如何创建一个对象: //声明变量:类名 变量名;
//赋值:给变量名赋一个对象: 变量名= new 类名( );
访问成员:成员访问运算符: .  ——对象名 . 成员名;
调用方法: 对象名 . 方法( );
访问权限(属性和方法):
public:在它类中可以访问
private:只能在本类中访问
3、类之间的三种关系:依赖关系(uses-a)聚集关系(has-a)继承关系(is-a)
二、构造方法:
用于给对象进行初始化。特点:
1 :该函数的名称和所在类的名称相同。 
2:不需要定义返回值类型。 
3:该函数没有具体的返回值。
在一个类中,如果没有任何构造方法存在,那么默认存在一个无参的构造方法,不需要调用显示;但如果类中存在一个或多个带参数的构造方法,那么默认的构造方法将被覆盖,那么就要使用无参的构造方法就必须在类中声明显示;每个对象在生成的时候,都需要调用构造方法,并且仅能执行一次
//构造方法不能显式的直接调用构造方法
同样的,一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。
构造函数和一般函数有什么区别呢?
1 :两个函数定义格式不同。 
2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。一般函数,是对象创建后,需要调用才执行,可以被调用多次。
什么时候使用构造函数呢?
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

三、面向对象之 封装
封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将数据与操作数据的源代码进行有机的结合,形成 类 ,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过 外部口,一特定的访问权限来使用类的成员。

封装的大致原则: 把尽可能多的东*起来 对外提供简捷的接 、把所有的属性藏起来 封装好处:将变化隔离;便于使用;提高重用性;安全性。


四、面向对象之 继承
对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。私有成员能继承,但是由于访问权限的控制,在子类中不能直接使用父类的私有成员。并且java中是单继承,一个子类只能有一个父类继承中的构造方法
当生成子类对象时,java 默认首先调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象。接下来,再去调用子类的构造方法,生成子类的对象。如果子类使用super() 显式调用父类的某个构造方法,那么在执行的时候就会寻找与 super()所对应的构造方法而不会再去寻找父类的不带参数的构造方法。与 一样, 也必须要作为构造方法的第一条执行语句,前面不能有其他可执行语句。
方法的重写

重写的要求:子类覆盖方法和父类被覆盖方法的方法返回类型,方法名称,参数列表必须相同;子类覆盖方法的访问权限必须大于等于父类的方法的访问权限;方法覆盖只能存在于子类和父类之间;子类覆盖方法不能比父类被覆盖方法抛出更多异常


五、面向对象之 封装多态
多态(Polymorphism ):用我们通俗易懂的话来说就是子类就是父类,因此多态的意思就是:父类型的引用可以指向子类的对象。
Java 只允许单继承,派生类与基类间有is-a的关系(即 猫 is a动物 )。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,java引入了多态性的概念以弥补这点的不足,此外,抽象类和接 口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
多态性是面向对象的重要特征。方法重载和方法覆写实际上属于多态性的一种体现,真正的多态性还包括对象多态性的概念。
对象多态性主要是指子类和父类对象的相互转换关系。 
向上类型转换(upcast ):比如说将Cat 类型转换为animal 类型,即将
子类型转换为父类型。对于向上类型转换,不需要显式指定。
向下类型转换(downcast ):比如将 animal类型转换为cat 类型。即将
父类型转换为子类型。对于向下类型转换,必须要显式指定(必须要使用强

制类型转换)。Animal a=new Animal();Cat c=(Cat)a;

多态的问题理解:
class 孔子爹 {
public int age = 40;

public void teach() {
System.out.println("讲解JavaSE");
}
}

class 孔子 extends 孔子爹 {
public int age = 20;

public void teach() {
System.out.println("讲解论语");
}

public void playGame() {
System.out.println("英雄联盟");
}
}

//论语特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
//向上转型
孔子爹 k爹 = new 孔子();
//到人家那里去了
System.out.println(k爹.age); //40
k爹.teach(); //讲解论语
//k爹.playGame(); //这是儿子才能做的


//讲完了,下班回家了
//脱下爹的装备,换上自己的装备
//向下转型
孔子 k = (孔子) k爹; 
System.out.println(k.age); //20
k.teach(); //讲解论语
k.playGame(); //英雄联盟

六:this
 this代表对象。就是所在函数所属对象的引用。this 到底代表什么呢?哪个对象调用了this  所在的函数。this  就代表哪个对
象。就是哪个对象的引用。
开发时,什么时候使用 this 呢?
在定义功能时,如果该功能内部使用到了调用该功能的对象。这时就用this 
来表示这个对象。
 还可以用于构造函数间的调用。
调用格式: 实际参数 ; 对象后面跟上 调用的是成员属性和成员方法 一般方法 ; 对象后面跟上 调用的是本类中的对应参数的构造函数。
注意:用 调用构造函数,必须定义在构造函数的第一行。因为构造函数
是用于初始化的,所以初始化动作一定要执行。否则编译失败。

补充:
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗?
方法重写:
在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:
同一个类中,出现的方法名相同,参数列表不同的现象。
方法重载能改变返回值类型,因为它和返回值类型无关。
Override:方法重写
Overload:方法重载


2:this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。
this:代表当前类的对象引用
super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)


场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
this(...)
super(...)
成员方法:
this.成员方法

super.成员方法


3、抽象类和接口的区别:
A:成员区别
抽象类:
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以常量
成员方法:只可以抽象

B:关系区别
类与类
继承,单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承

C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。