1、面向对象
面向对象(Object Oriented)是一种程序设计方法,或者可以理解为是一种设计规范,其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
2、对象
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即动态部分与静态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
3、类
类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。
Java中类声明的格式如下:
[类修饰符] class 类名 [extends 父类名称] [implements 接口名称列表]
{
变量定义及初始化;
方法定义及方法体;
}
成员变量限定词的含义:
· static: 静态变量(类变量)
· final: 常量;transient: 暂时性变量,用于对象存档,用于对象的串行化
· volatile: 贡献变量,用于并发线程的共享
方法的实现也包括两部分内容:方法声明和方法体。
方法声明
方法声明中的限定词的含义:
· static: 类方法,可通过类名直接调用
· abstract: 抽象方法,没有方法体
· final: 方法不能被重写
· native: 集成其它语言的代码
· synchronized: 控制多个并发线程的访问
方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
方法体
方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。若局部变量与类的成员变量同名,则类的成员变量被隐藏。
为了区别参数和类的成员变量,我们必须使用this。this用在一个方法中引用当前对象,它的值是调用该方法的对象。返回值须与返回类型一致,或者完全相同,或是其子类。当返回类型是接口时,返回值必须实现该接口。
构造方法
· 构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。
· 构造方法具有和类名相同的名称,而且不返回任何数据类型。
· 重载经常用于构造方法。
· 构造方法只能由new运算符调用
封装
封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
· 1. private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
· 2. default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
· 3.protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
· 4.public:类中限定为public的成员,可以被所有的类访问。
继承
继承的作用在于代码的复用。由于继承意味着父类的所有方法亦可在子类中使用,所以发给父类的消息亦可发给衍生类。如果Person类中有一个eat方法,那么Student类中也会有这个方法,这意味着Student对象也是Person的一种类型。
class Person {
public void eat() {
System.out.println("eat");
}
static void show(Person p) {
p.eat();
}
}
public class Student extends Person{
public static void main(String[] args) {
Student s = new Student();
Person.show(s); // ①
}
}
在Person中定义的show方法是用来接收Person句柄的,但是在①处接收的却是Student对象的引用。这是因为Student对象也是Person对象。在show方法中,传入的句柄(对象的引用)可以是Person对象以及Person的衍生类对象。这种将Student句柄转换成Person句柄的行为成为上溯造型。
继承有什么好处?
提高代码的复用性。
让类与类之间产生了关系,是多态的前提。
super和this有什么区别?
super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
super和this的用法相似。
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。
使用场景:
当子父类出现同名成员时,可以用super进行区分;
子类要调用父类构造函数时,可以使用super语句。
final(最后)
可以修饰类:被final修饰的类不可被继承
可以修饰方法:被final修饰的方法不能被重写 复写前提,子类的访问权限大于父类的,
比如父类里的方法修饰是private,子类写出同样的方法也不叫复写
可以修饰变量:被final修饰的变量不能被改值(只初始化一次)
只能在构造方法里或者成员变量部分初始化
static所谓的不能改变是指下面name创建一次,然后在内存中不变了,但是他的值是改变的,final修饰的话,则name不能改变
for (int i = 0; i <10 ; i++) {
static String name = "haha";
}
单继承和多继承各自的优缺点:
1.多继承复用性更高,单继承复用性低;
2.多继承继承关系复杂且有菱形缺陷,单继承没有;
ps:菱形缺陷:B,C两个类同时继承于A;D继承于B和C;如果B和C存在同名方法,
不知道该执行从哪个类之中继承过来