Java面向对象
面向对象的设计思想在考虑问题时,以具体的事物(对象)为单位,考虑它的属性(特征)及动作(行为),关注整体。
一.面向对象概念
对象:对象就是某个具体的事物,比如一个苹果、一台计算机都是一个对象。每个对象都是唯一的。对象可以是一个实物,也可以是一个概念;比如一个苹果、一项政策。现实生活中万事万物皆对象,面向对象的设计思想(OOP)主要是模拟现实生活中的一个个对象来编程的。对象具有属性和行为。
抽象:所谓的抽象,即抽取,也叫提炼或归纳总结等。主要用来把客观世界中真实存在的事物用编程语言描述出来。这也是理解面向对象编程思想的第一步。通过抽象将现实生活中的对象模拟或映射到计算机中。
类:现实生活中任何实实在在的具体物体都叫对象,通过面向对象的抽取思想,根据很多实体的行为特征可以抽取出很多的对象,然后再通过归纳总结,将这些对象分门别类;类可以理解为对事物的分类。类是构成Java面向对象编程的最小封装单元。在Java中通过关键字class定义自定义的数据类型。Java中通过类来封装现实生活中对象的各个信息。类可以封装数据。
类和对象的关系:类是对象的类型,要创建对象就要先创建它的数据类型,即类。类描述了对象的属性和行为。类是对象的模板和图纸。对象是类的一个实例,是一个实实在在的的个体。由对象可以抽取出类,类可以实例化成对象。
二,面向对象的特征
1.封装
所谓封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装有两层含义,其一是隐藏内部行为,即隐藏内部方法,调用者只能看到对外提供的公共方法。其二是隐藏内部信息,即隐藏内部数据成员。现在都建议不要对外公开任何数据成员,即使是外部需要知道的数据成员,也只能通过函数获取。
封装的好处:封装可以隔离变化、提高易用性、提高安全性、提高重用性。
封装的原则:
将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问
2.继承
继承的概述:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类。
子类可以直接访问父类中的非私有的属性和行为。
通过 extends 关键字让类与类之间产生继承关系。
class SubDemo extends Demo{}
继承的好处:
继承的出现提高了代码的复用性。
继承的出现让类与类之间产生了关系,提供了多态的前提。
继承的特点:
Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2...//error
Java支持多层继承(继承体系)
•class A{}
•class B extends A{}
•class C extends B{}
定义继承需要注意:
•不要仅为了获取其他类中某个功能而去继承
•类与类之间要有所属( " is a " )关系,xx1是xx2的一种。
继承中的相关概念:
a.覆写:
子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。
父类中的私有方法不可以被覆盖。
在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
覆盖注意事项:
• 覆盖时,子类方法权限一定要大于等于父类方法权限
• 静态只能覆盖静态。
覆盖的应用:
• 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复 写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
b.子类的实例化过程:
子类中所有的构造函数默认都会访问父类中空参数的构造函数
因为每一个构造函数的第一行都有一条默认的语句super();
子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。
当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。
3.多态
程序中体现:父类或者接口的引用指向或者接收自己的子类对象。
好处和作用:多态的存在提高了程序的扩展性和后期可维护性
前提:需要存在继承或者实现关系
要有覆盖操作
多态的特点:
a. 成员方法:
编译时:要查看引用变量所属的类中是否有所调用的成员。
在运行时:要查看对象所属的类中是否有所调用的成员。
b. 成员变量
只看引用变量所属的类。
三,面向对象的优点
将一类客观存在的事物抽象成一个类,其中包含了事物的特征与行为,然后根据类创建不同方法、属性的对象,可以操作对象完成相应的工作,调用者只需调用它的方法,怎么实现的根本不需要去了解,从而程序员就成为了一个指挥者的角色,可以轻松的操作对象,需要哪类事物,就创建那种对象。
四,面向对象中的一些概念
1:)成员变量:在类中直接定义的变量叫做成员变量,也可以叫做类的属性!
2:)局部变量:在一个方法中声明的变量就是局部变量,它的生命周期是这个方法体内!
注意:如果在一个方法中的变量与类中的成员变量名相同时,默认先在此方法体中找,找到了就调用,找不到调用成员变量!
如果一定要调用类中的成员变量,可以是用this关键字进行调用!
3:)对象的建立以及初始化过程
Person p = newPerson()
(1)将Person.class文件加载进内存.
(2)在栈内存空间中开辟一个变量空间p。
(3)在堆内存中给对象分配空间。
(4)给对象中的属性进行默认初始化。
(5)给对象中的属性进行显示初始化。
(6)调用构造代码块对对象进行初始化。(执行类中的构造代码块,没有就不执行)
(7)调用对应的构造函数进行对象初始化。对象初始化完毕。
(8)将对象的内存地址赋值给p变量,让p变量指向该对象。
4:)对象的生命周期
对象的声明周期由关键字new开始,当没有任何引用指向对象时,对象的生命周期结束,被销毁!
5:)匿名对象
当一个对象我们只是是用一次的时候,可以把这个对象声明为匿名对象,它没有任何引用,通常作为一个实参传给方法!
6:) static 关键字
用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
• 随着类的加载而加载,生命周期最长。
• 优先于对象存在
• 被所有对象所共享
• 可以直接被类名调用
使用注意
• 静态方法只能访问静态成员
• 静态方法中不可以写this,super关键字
• 主函数是静态的
什么时候需要使用static修饰:
当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。
简单说:共性用static修饰,特性不用static修饰。
7:)final可以用来修饰什么呢?
(1)final可以用来修饰类:被fainl修饰的类不能被继承。
(2)final可以用来修饰成员方法:被final修饰的成员方法不能被重写。
(3)final可以用来修饰变量:被final修饰的变量为常量,值不能被修改。
常量的命名规范:要求大写。
final int PI = 3.14;
final难道必须声明的时候就赋值。
一般来说,是这样的。但是特殊情况:在构造方法可以给final修饰的变量赋值。
五,抽象类和接口
抽象类(abstract)
(1)只抽取了很多类的方法的声明,为了保证不出问题,方法声明用abstract修饰。
(2)抽象类的特点
A:一个类如果有了抽象方法,那么这个类必须是抽象类。抽象类里边可以没有抽象方法。
B:抽象类是不能够被实例化的。不能够创建对象的。
C:如果一个类继承抽象类,那么,它要么实现抽象类中的所有抽象方法,
要么本身也是抽象类。
(3)抽象类的成员特点:
A:成员变量:子类可以直接继承抽象类中的成员变量。(抽象类中的成员变量可以和以前是一样的)
B:成员方法:抽象类中分为两种方法,一种是抽象方法,这种方法在子类中必须要被实现。
一种是普通的方法。可以被子类直接继承使用。
C:构造方法:抽象类不能被实例化,那么它有构造方法吗?抽象类是class,那么它就有构造方法。
它的构造方法有用吗?有,为了让子类实例化的时候使用。
接口(interface)
(1)接口的由来:当一个类中的方法都是抽象的时候,你没必要定义为抽象类,
定义为接口就可以了。
(2)解决了java中只能单继承的问题。(对多继承进行了优化)
A:类与类:只能是单继承。
B:接口与接口:可以是单继承,也可以是多继承。
C:类与接口:可以是单实现,也可以是多实现。
(3)成员特点:
A:只有成员变量和成员方法。
B:成员变量默认修饰符 publicstatic final
**int x =20;
**其实是这样的 public static final int x = 20;
C:成员方法默认修饰符 publicabstract
**voidshow();
**其实是这样的 public abstract void show();
建议:自己手动加上修饰符。
(4)接口特点:
A:接口是对外暴露的规则
B:接口是功能的扩展
C:接口降低了程序的耦合性。
**内聚(自己实现功能的能力)
**高内聚,低耦合。
举例:主板和CPU,USB接口,电源插座。
D:扩展说了下接口的理解
**狭义的理解就是java中的接口。
**广义的理解就是:任何定义的规范都是接口。
(5)接口和抽象类的区别:
A:抽象类只能被单继承;接口可以被多实现。
B:抽象类中的成员:成员变量:可以是常量,也可以是变量。
成员方法:可以是抽象的,也可以是非抽象的。
构造方法:虽然不可以创建对象,但是可以给子类实例化用。
接口中的成员:成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象的。默认修饰符 public abstract
C:抽象类中定义的是体系结构中的共性的内容。
接口中定义的是对象的扩展功能。
D:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。
接口被实现表示的是: "like a"的关系。xx像yy中的一种。