JAVASE学习八——面向对象(1)
一.前言介绍
1.计算机语言发展的主线
计算机语言的发展总的来说就是越来越向方便人类思考问题的方向发展。从前,计算机语言只有基本变量(类似我们学习的基本数据类型),用来保持数据;后来发现数据越来越多,于是就有了数组的概念,通过数组将这同类型的数据用数组进行组织;再后来,数据不仅多了而且变的复杂了,数组的短处就是不能存放不同类型的数据,于是结构体(c,c++中的struct)出现了,它可以将不同类型的数据存放的同一个数据结构中;但是但是后来又发现,数据不仅多了,复杂了,而且对数据的操作也复杂多了,而结构体只包含了数据,没有包含对数据操作的方法,即数据和方法是分离的。于是类和对象的概念产生了,说白了,对象也是一种数据结构而已。包含了:不同的数据类型(属性field)和相关的操作处理(方法method)。
面向过程:数据和方法是分离的
面向对象:数据和方法集成到一起,方便扩展。
2.面向对象与面向过程
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言 。
面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。
面向对象:注重找“参与者”,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
二.类和对象的概念
我们人认识世界,其实就是面向对象。打个比方,我们是人,小狗是动物,而我们之所以能区分我们是人,因为我们一出生看见很多具体的人之后就对人有了一个具体总结。我们发现人有以下特征,有具体的社会身份,会说话,能直立行走等等。。。,我们抽象出人的特征后,就可以将这些属性归纳成一个叫人的类。这个过程就是类对对象的抽象。而对象就是具体的事务,比如我们看见的某个具体的人。
对象:是具体的事务 (比如 小红 小明)
类:是对对象的抽象(比如Person)
总结:先有具体的对象,然后抽象各个对象之间象的部分,归纳出类通过类再认识其他对象。
生活案例:
类是一个图纸 对象是根据该图纸制造多个实物。
类是一个模具 对象是使用模具制造的多个铸件(月饼模子)
对象和类的关系:
特殊到一般,具体到抽象
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属 性。
JDK提供了很多类供编程人员使用,编程人员也可以自定义自己的类。
1.自定义类与对象
定义类:属性 方法 构造方法 (代码块,静态代码块,内部类)其他
**属性:属性用于定义该类或者该类对象包含的数据或者说静态特征。**属性作用范围是整个类体。在 定义成员变量时可以对其初始化,如果不对其初始化,java使用默认的值对其初始化。具体 默认值如下表所示:
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
字符型 | ‘\u0000’ |
布尔型 | false |
引用类型 | null |
定义格式: [修饰符] 属性类型 属性名 = [默认值];
public class Person{
String name = "张三";
}
**功能:方法用于定义该类或该类实例的行为特征和功能实现。**方法是类和对象行为特征的抽象。方法 很类似于面向过程中的函数。面向过程中,函数是最基本的单位,整个程序由一个个函数调用 组成。面向对象中,整个程序的基本单位是类,方法是从属类和对象的。
定义格式:
[修饰符] 方法返回值类型 方法名(形参列表) {
// n条语句
}
public class Person{
//成员变量
String name;
//成员方法
public void study(){
System.out.println("一个程序猿正在努力工作...");
}
}
使用:
创建对象:
类名 对象名 = new 类名();
Person p1=new Person();
调用类的属性和方法:
对象名.成员变量
对象名.成员方法
类的实例:
一般类中三种常见的成员:属性field,方法method,构造器constructor。这三种成员都可 以定义零个或多个。
2.成员变量与局部变量的区别
成员变量 | 局部变量 | |
---|---|---|
声明位置 | 类中方法外 | 方法中(块中) |
作用范围 | 当前类中 | 当前方法中 |
内存存放位置 | 堆内存中 | 栈内存中 |
默认值情况 | 有默认值 | 没有默认值 |
3.类与类之间的关系
类之间大体分为6种关系:依赖,关联,聚合,组合,继承,实现,耦合度依次增加
继承关系:继承指的是一个类(称为子类,子接口)继承另外的一个类(称为父类,父接口)的功 能,并可以增加它自己的新功能的能力。在java中继承关系通过关键字extends明确标识。
public class Person {
String name;
int age;
void move(){}
}
//继承
class Student extends Person{
void study(){}
}
class Teacher extends Person{
void teach(){}
}
**实现关系:**实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常 见的关系。在Java中此类关系通过关键字implements明确标识。
interface Vehicle{
void move();
}
class Ship implements Vehicle{
void move(){
System.out.println("水里移动..");
}
}
class Car implements Vehicle{
void move(){
System.out.println("陆地跑..");
}
}
**依赖关系:**简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的,临时 性的,非常弱的,但是类B的变化会影响到A。比如某人要过河,需要借用一条船,此时人与 船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中用。
public class Person {
public void drive(Car car){} //方法参数
}
class car{}
**关联关系:**关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更 强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般 是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关 联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
public class Person {
public Address address; //关联关系
public void setAddress (Address address){
this.address= address;
}
public Address getAddress (){
return address;
}
}
class Address{}
**聚合关系:**单向,关联关系的一种,与关联关系之间的区别是语义上的,关联的两个对象通常是平等 的,聚合则一般不平等,有一种整体和局部的感觉,实现上区别不大。表现在代码层面,和 关联关系是一致的,只能从语义级别来区分。
public class Team {
public Person person;
public Team(Person person){
this.person = person;
}
}
Class由Student组成,其生命周期不同,整体不存在了,部分依然存在,当前Team解散了,人还 在,还可以加入别的组。
**组合关系:**单向是一种强依赖的特殊聚合关系
public class Person {
public Head head;
public Body body;
public Person(){
head = new Head();
body = new Body();
}
}
Head,Body,Arm和Leg组合成People,其生命周期相同,如果整体不存在了,部分也将消亡。
三.构造方法(构造器)
构造器也叫构造方法,用来对象的初始化。构造方法是一个创建对象时被自动调用的特殊方法,目的是对对象的初始化。构造器的名称应与类的名称一致。java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
1.声明格式
[修饰符] 类名(形参列表){
//n条语句
}
public Dog(){}
构造器4个要点:
①.构造器的方法必须和类名一致!
②.构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能在构造器里调 用return.
③.通过new关键字调用!
④.如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义则编译器不会 添加无参构造方法!
⑤.与普通方法一样,构造方法也可以重载。
⑥.修饰符final abstract static不能用来修饰构造器。
2.作用
构造器的主要作用就是用来初始化对象信息用的,不是用于创建对象的。
3.空构造器
没有参数的构造器就是空构造器,一个类中如果没有构造器,javac编译后会自动加一个无参构造器。 如果有构造器,就不会加入无参构造器。
4.重载
一个类中可以存在多个构造器
方法一样,构造方法也可以重载。**
⑥.修饰符final abstract static不能用来修饰构造器。
2.作用
构造器的主要作用就是用来初始化对象信息用的,不是用于创建对象的。
3.空构造器
没有参数的构造器就是空构造器,一个类中如果没有构造器,javac编译后会自动加一个无参构造器。 如果有构造器,就不会加入无参构造器。
4.重载
一个类中可以存在多个构造器
构造器重载:只看形参即可形参类型个数顺序不同,调用时按”就近最优原则“。