1 面向对象的设计思想
1.1 什么是面向对象
面向对象是一种思维方式
面向对象是一种编程方式
面向对象并不只针对某一种编程语言
面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
2 面向对象和面向过程的区别
2.1 面向过程
面向过程过程侧重整个问题的解决步骤,着眼局部或者具体
优缺点
优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;
效率高,面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。
流程明确,具体步骤清楚,便于节点分析。
缺点:
需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高;
对复杂业务来说,面向过程的模块话难度较高,耦合度也比较高。
2.2 面向对象
面向对象侧重具体的功能,让某个对象具有这样的功能。更加侧重于整体。
优缺点
优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式;
封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省;
容易扩展,代码重用率高,可继承,可覆盖;
实现简单,可有效地减少程序的维护工作量,软件开发效率高。
缺点:
效率较低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少,从而不适合底层开发和游戏开发,甚至是多媒体开发;
复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。
3 类与对象的关系
3.1 类
3.1.1 什么是类
高度概括:类是一组相似事物的统称!类可以看成一组相似对象的模板。
首先:请看“一组”,思考一下为什么是“一组”,不是“一个”?其次:请看“相似”,思考一下为什么是“相似”,不是“相同”?最后:请看“统称”,思考一下为什么是“统称”,不是“名称”?
一组:一组的玄机在于“多个“,单个事物无法成为类。一个很简单的例子:“狗“可以是一类,但“你家2哈”就不是一个类(那又是什么呢,请看后文分解?)
相似:相似的玄机在于“比较像,但不完全相同”。还是“狗”这个例子:“你家2哈”和“路边的土狗”都是狗,有很多相似的地方,但它们两个绝对不是完全相同的。
统称:统称的玄机在于“统”,也可以叫做“通称”,统称要能够概括这一组“多个”事物。如:“车”、“人”等。
3.1.2类的组成
类由三部分组成:
属性
方法
构造函数(构造器)
3.1.3 类的定义,以及属性的定义、方法的定义
定义一个类的步骤
定义类名
编写类的属性
编写类的方法
[访问修饰符(public)] class 类名 {
//定义属性部分
属性1的类型 属性1;
属性2的类型 属性2;
……
属性n的类型 属性n;
//定义方法部分
方法1;
方法2;
……
方法m;
}
代码示例:
public class Dog {
//定义属性
String name;
int age;
double height;
//定义方法
public void eat(){
System.out.println("吃的方法...");
}
public void run(){
System.out.println("跑的方法...");
}
}
3.2 对象
3.2.1 什么是对象 ——(万物皆对象)
高度概括:对象是描述客观事物的一个实体!对象可以看成类的一个具体实例(事物)。
课堂练习:
说一说教室里的对象
描述他们的属性和方法
3.2.1 对象的创建
//创建对象
new 类();
3.3 变量的分类(变量一定要初始化才能使用)
3.3.1 成员变量(若没有指定初始化则会默认初始化)
定义:直接定义在类中的变量
作用域:在整个类的内部都可以访问
3.3.2 局部变量(必须指定初始化,不会被默认初始化)
定义:定义在方法中的变量
作用域:只在定义该局部变量的方法内部可以访问
示例代码:
public class HelloWorld {
String name="张三"; //成员变量
public void test(){
int age=18; //局部变量
}
}
课堂练习:
创建一个名为Book的类,用来代表一本书。类中有3个属性,分别是String类型的bookName, int类型的pageCount和double类型的price。
使用第1题中的Book类,首先创建一个Book类的对象,然后给类中的三个属性赋值,最后将Book类对象的三个属性值输出到控制台。
理解对象和引用之间的关系:编写一个程序,使用第1题中的Book类。首先创建一个Book类的对象,然后创建book1利book2两个Book类的引用,让它们都指向创建出的Book对象。通过这两个引用修改Book对象的属性值,最后将Book对象的属性值输出到控制台。
(使用: 对象的引用名.(属性和方法))
(引用:1、赋值 = :表示地址的传递
2、一个对象可以有多个引用,一个引用只能指向一个对象)
public class Main2
/**
* 对象与引用的关系
*
* @param args
*/
public static void main(String[] args) {
// 一个对象可以拥有多个引用
// 一个引用只能指向一个对象
int[] as = new int[] { 1, 2, 3, 4, 5 };
int[] bs = as;// 地址的传递
bs[2] = 999;
as = new int[] { 7, 8, 9 };//将新对象地址传递给as。as会断开旧的对象引用
as[0] = 888;
System.out.println(bs[0]);
}
}
5 构造器
构造器又称构造函数,也叫构造方法。但它并不是一个“方法”。
5.1 构造器的定义
1、构造器的名字和类名相同。
2、构造器的作用在于构造并初始化对象。
public class HelloWorld {
String name="张三";//成员变量
//1、参数化构造器 带有形参
public HelloWorld(String name) {
this.name = name;
}
//2、默认(隐式)构造器 也叫无参构造器。
// public HelloWorld() {
// }
public void test(){
int age=18;//局部变量
}
}
注意:
如果一个类中没有显示的定义任何一个构造器,则这个类会有一个默认的隐式的无参构造器。
如果一个类中定义了任意一个构造器,则默认的隐式的无参构造器就不存在了。如果需要用到无参构造器,则必须再显示的声明。
5.2 构造器的调用
在使用关键字new来创建对象的时候,根据传入的参数一定会调用相应的构造器
5.3 构造器(构造方法)重载
和普通方法重载一样(讲方法的时候再讲解...)
6 this关键字
每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象。
当在方法中使用本类的属性时,都会隐含地使用this名称,当然也可以明确指定。
this可以看作是一个变量,它的值就是当前对象的引用。
6.1 this.属性:访问本类的成员属性
public class Employee {
String name; //姓名
int age; //年龄
double salary; //薪水
public Employee(String name, int age, double salary){ //构造方法
this.name = name; //左边的name是成员变量name,右边的name是局部变量
this.age = age;
this.salary = salary;
}
}
6.2 this.方法:访问本类的成员方法
//如果某个构造方法的第一条语句具有形式this(...),那么这个构造方法将调用本类中的其他方法。
public class Employee {
private String name;//姓名
private int age;//年龄
private double salary;//薪水
public Employee(String name, int age, double salary){//构造方法1
this.name = name;//使用this,访问成员属性
this.age = age;
this.salary = salary;
this.test();//使用 this访问成员方法
}
public void test(){
System.out.println("成员方法");
}
}
6.3 this():访问本类中的构造器
方法重载的时候细讲 ...