java面向对象(推荐看一本书java编程思想)

本文详细介绍面向对象编程的基本概念,包括面向对象与面向过程的区别、类和对象的定义、构造方法及this关键字的使用等,帮助初学者理解面向对象的思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象

回顾

今天任务

1. 面向对象
2. 面向过程
3. 类的创建
4. 对象的创建
5. 对象创建内存分析
6. 构造方法
7. this关键字

教学目标

1. 掌握面向对象思想
2. 掌握类和对象的创建
3. 掌握对象创建内存分析
4. 掌握构造方法
5. 掌握this关键字

第一节 : 面向对象的设计思想

1.1 什么是面向对象

一种看待问题的思维方式,着眼于找到一个具有特殊功能的具体个体,然后委托这个个体去做某件事情,我们把这个个体就叫做对象
是一种更符合人类思考习惯的思想【懒人思想】,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者
使用面向对象进行开发,先要去找具有所需功能的对象来用,如果该对象不存在,那么创建一个具有所需功能的对象

1.2 面向过程

一种看待问题的思维方式,在思考问题的时候,着眼于问题是怎样一步一步解决的,然后亲力亲为的去解决问题

1.3 面向对象和面向过程的对比

面向对象是基于万物皆对象这个哲学观点

​ 举例说明:

​ 案例一:我想要吃大盘鸡​ 面向过程 面向对象​ 1.自己去买菜 1.委托一个会砍价的人帮忙去买菜​ 2.自己择菜 2.委托一个临时工帮忙择菜​ 3.自己做菜 3.委托一个厨师帮忙做菜​ 4.自己开始吃 4.自己开始吃

​ 案例二:小明是一个电脑小白,想要配一台电脑,买完零件后需要运到家里,组装完成后打开电脑玩游戏​ 面向过程 面向对象​ 1.小明补充电脑知识 1.委托一个懂电脑的朋友(老王)去帮忙买零件​ 2.小明去买零件 2.委托一个能跑腿的人去买零件​ 3.小明把零件带回家里 2.委托一个快递小哥帮小明送到家里​ 4.小明组装电脑 3.委托一个会组装电脑的人帮小明组装电脑​ 5.小明开机玩电脑 4.小明自己打开电脑,开始玩游戏

1.4 区别总结

a.都是看待问题的一种思维方式,都能解决问题
b.面向过程着眼于所有的事情亲力亲为
c.面向对象着眼于找到一个具有特殊功能的对象,委托这个对象帮忙去做某件事情
注意:面向对象时一种思想,并不是一门编程语言

1.5 类的定义

一个具有特殊功能的实体的集合【群体】,类是Java语言的最基本单位

1.6 对象的定义

在一个类中,一个具有特殊功能的实体,能够帮忙解决特定的问题,对象也被称为实例

1.7 类与对象之间的关系

a.类是对象的抽象,对象是类的具体体现
b.Java中描述事物通过类的形式体现,类是具体事物的抽象,对象即是该类事物实实在在的个体

1.8 类的声明

​ 语法:访问权限修饰符 class 类名 {

​ //类体​ }

​ 说明:a.访问权限修饰符:只能是public(可以被省略,省略后为default)​ b.类名只要是一个合法的标识符即可,但是要求:首字母必须大写,遵循驼峰命名法​ c.尽量使用单个或多个有意义的单词连接而成​ ​ public class FirstDemo {

​ }

​ 注意:a.一个Java文件中可以写多个类,如果写多个类,则编译后会生成多个.class文件​ b.一个Java文件中最多只能有一个被public修饰的类,这个类的类名必须和Java源文件名保持一致​ c.一个Java文件中如果只有一个类,并且这个类不用public修饰的话,类名和文件名可以不一样,但习惯上,我们都会写一样

1.9 类中成员变量的定义

​ 成员变量:

​ a.成员变量其实就是全局变量

​ b.成员变量也被称为属性​ c.分为静态变量和非静态变量​ d.在静态方法中只能访问静态成员变量,在非静态方法中可以访问非静态成员变量和静态成员变量

​ 成员变量【全局变量】和局部变量的区别:​ a.定义的位置不同

成员变量:定义于类中,作用于整个类 局部变量:定义于方法或者语句中,作用于该方法或者该语句。

​ b.内存中出现的时间和位置不同

成员变量:当对象被创建时,出现在堆内存当中。 局部变量:所属的区间被运算时,出现在栈内存当中。

​ c.生命周期不同

成员变量:随着对象的出现而出现,随着对象的消失而消失。 局部变量:随着所属区间运算结束,它就被释放。

​ d.初始化值不同

成员变量:成员变量因为在堆内存当中,所以他有默认的初始值 局部变量:没有默认的初始值

1.10 类中方法的定义

​ a.分为静态方法和非静态方法

​ b.在同一个类中,在静态方法中只能调用静态方法,在非静态方法中可以调用非静态方法和静态方法

class TextDemo01
{
    //定义非静态全局变量
    String str;
​
    //定义静态全局变量
    static int num;
​
    //main是静态函数
    public static void main(String[] args) 
    {
        show();
        //结论一:在同一个类中,在静态函数中不能调用非静态函数
        // 错误: 无法从静态上下文中引用非静态 方法 display()
        //display();
​
        //结论三:在同一个类中,在静态函数中只能访问静态全局变量
        // 错误: 无法从静态上下文中引用非静态 变量 str
        //System.out.println(str);
        System.out.println(num);//0
​
        //定义一个局部变量
        //当全局变量和局部变量重名的时候,访问的时候采用就近原则
        //尽量避免全局变量和局部变量重名
        int num = 10;
        System.out.println(num);
    }
​
    //静态函数
    public static void show() {
        System.out.println("show");
    }
​
    //非静态函数
    public void display() {
        System.out.println("display");
        //结论二:在同一个类中,非静态函数可以调用静态函数,也可以调用非静态函数
        show();
        display11();
​
        //结论四:在同一个类中,非静态函数可以访问静态全局变量以及非静态全局变量
        System.out.println(str);
        System.out.println(num);
    }
​
    //非静态函数
    public void display11() {
        System.out.println("display11");
    }
}

第二节:对象的创建以及内存分析

2.1 对象的创建

​ 对象的创建过程也被称为对象的实例化过程

​ 语法:类名 标识符 = new 类名();

//演示对象的创建,跨类进行调用成员方法以及访问成员变量
//测试类:含有main函数得类被称为测试类
public class TextDemo01 
{
    public static void main(String[] args) 
    {
        //1.创建对象
        //语法:类名 变量名称  = new  类名();
        Person xiaoMing = new Person();
​
        //2.调用其他类中的非静态方法和访问其他类中非静态成员变量
        //语法:对象.
        System.out.println(xiaoMing.name);
        //虽然是跨类进行访问,Person类中成员变量仍然是一个变量,值可以随时发生改变
        xiaoMing.name = "小明";
        System.out.println(xiaoMing.name);
        xiaoMing.age = 10;
        xiaoMing.gender = 'B';
​
        xiaoMing.eat();
​
        //3.调用其他类中的静态方法和访问其他类中静态成员变量
        //语法:对象.    类名.
        System.out.println(Person.country);
        Person.country = "中国";
        System.out.println(Person.country);
​
        Person.run();
​
        xiaoMing.country = "China";
        System.out.println(Person.country);
        System.out.println(xiaoMing.country);
​
        xiaoMing.run();
​
        //4.同一个类可以创建多个对象
        Person xiaoLi = new Person();
    }
}
​
//实体类:表示具有某些特征或者某些行为的类
//描述多个对象所具有的共同特征和共同行为
//需求:人类,具有姓名,年龄,性别等的特征,可以吃东西,可以奔跑,,,,
class Person
{
    //第一部分
    //成员变量:特征【名词】
    //非静态成员变量
    String name;//null
    int age;//0
    char gender;//\u0000
​
    //静态成员变量
    static String country;//null
​
    //第二部分
    //成员方法:行为【动词】
    //非静态成员方法
    public void eat() {
        System.out.println("eating~~~~");
    }
​
    //静态成员方法
    public static void run() {
        System.out.println("running~~~~");
    }
}

总结:a.静态方法和静态成员变量都是属于类的,需要访问的时候用: 类名. 的方式来访问

​ b.非静态方法和非静态成员变量是属于对象的,需要访问的时候用: 对象. 的方式来访问​ c.开辟空间的时机不同

2.2 内存分析

 

​ 说明:程序中定义的Person类型的变量实际上是一个引用,它被存放在栈内存中,他指向实际的Person对象,而真正的Person对象则存放于堆内存中

2.3 练习

//测试类
class PracticeDemo01 
{
    public static void main(String[] args) 
    {
        //需求:开学了,王老师让学生小明,小花,小丽做自我介绍
        //姓名,年龄,爱好,来一段才艺展示
        /*
        老师类
        特征:姓名
        行为:让学生做自我介绍
​
        学生类
        特征:姓名,年龄,爱好
        行为:才艺展示
        */
        //1.创建一个老师的对象
        Teacher wang  = new Teacher();
        wang.name = "王老师";
​
        //2.创建一个学生对象
        Student xiaoming = new Student();
        //赋值
        xiaoming.name = "小明";
        xiaoming.age = 10;
        xiaoming.hobby = "吹牛逼";
​
        //3.老师执行自己的行为
        wang.letStuIntroduce(xiaoming);
​
​
        Student xiaohua = new Student();
        //赋值
        xiaohua.name = "小花";
        xiaohua.age = 10;
        xiaohua.hobby = "唱歌";
        wang.letStuIntroduce(xiaohua);
    }
}
​
//实体类
//老师类
class Teacher
{
    String name;
​
    //参数:学生,Student类型
    public void letStuIntroduce(Student stu) {
        System.out.println(name + "让学生" + stu.name + "做自我介绍");
        
        stu.introduce();
​
        if(stu.name.equals("小丽")) {
            stu.dance();
        } else if(stu.name.equals("小花")) {
            stu.sing();
        } else {
            stu.lie();
        }
    }
}
​
//学生类
class Student
{
    String name;
    int age;
    String hobby;
​
    public void introduce() {
        System.out.println("我是" + name + "今年" +  age + "爱好:" + hobby);
    }
​
    public void dance() {
        System.out.println("跳一段广场舞");
    }
​
    public void sing() {
        System.out.println("来一段freeStyle");
    }
​
    public void lie() {
        System.out.println("吹个牛逼");
    }
}

第三节:构造方法的定义

3.1 构造方法的定义

​ 构造方法也叫构造器,是指当实例化一个对象(创建一个对象)的时候,第一个被调用的方法

​ 语法:访问权限修饰符 类名() {​ //方法体​ }

​ 普通方法:​ 访问权限修饰符 其他的修饰符 返回值类型 函数名(参数列表) {

​ }

​ 说明:a.构造方法是在实例化对象的过程中自动调用的

​ b.系统会默认为我们提供一个无参的构造方法​ c.构造方法没有返回值类型

3.2 构造方法的调用

//演示构造方法的使用
class TextDemo05 
{
    public static void main(String[] args) 
    {
        //1.系统会默认提供一个无参的构造方法
        Animal a = new Animal();
​
        Animal aa = new Animal("fadhbf");
        aa.show();
        aa.show();
        aa.show();
    }
}
​
class Animal
{
    //无参的构造方法
    //2.构造方法是在实例化对象的过程中被自动调用的,不需要手动调用
    
    public Animal(){
        System.out.println("无参的构造方法被调用");
    }
    
    //3.当手动添加一个有参的构造方法之后,系统将不再提供无参的构造方法
    //如果要使用无参的构造方法,只能手动添加
    public Animal(String str) {
        System.out.println("String构造方法被调用");
    }
​
    public void show() {
    }
}

3.3 构造方法和普通方法的区别

​ a.构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用​ b.构造方法没有返回值类型【注意区别返回值void】,普通方法的返回值类型要么是确定的类型,要么为void​ c.系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加​ d.构造方法的方法名称必须和对应的类名保持一致​ e.构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次

注意​ a.如果没有写有参的构造方法,系统会默认提供一个无参的构造方法​ b.如果手动写了有参的构造方法,系统将不再提供无参的构造方法,如果需要使用,则要手动添加(一般情况下,要求将无参的构造方法都写上,哪怕方法里面什么都不写)

3.4 构造方法重载

//演示构造方法的重载
//测试类
class TextDemo06 
{
    public static void main(String[] args) 
    {
        //直接赋值
        /*
        Dog maomao = new Dog();
        maomao.name = "毛毛";
        maomao.age = 3;
​
        maomao.lookHome();
        */
​
        //通过构造方法赋值
        Dog dahuang = new Dog("大黄",5);
        dahuang.lookHome();
    }
}
​
//实体类
class Dog
{
    //成员变量
    String name;
    int age;
​
    //构造方法
    public Dog() {}
    //有参的构造方法,参数一般设置为和成员变量有关的参数
    public Dog(String n,int a) {
        //给成员变量赋值
        name = n;
        age = a;
    }
    /*
    public Dog(String n) {
        name = n;
    }
    */
​
    //成员方法
    public void lookHome() {
        System.out.println(name + "看家");
    }
}

3.5 练习

//测试类
class PracticeDemo02 
{
    public static void main(String[] args) 
    {
        //场景:富二代王s聪开着新买的白色宝马在马路上奔跑,很自豪的向他的新女友炫耀
        /*
        富二代类
        特征:姓名  有钱
        行为:开车,炫耀
​
        汽车类
        特征:颜色,品牌
        行为:奔跑
​
        女友类
        特征:姓名
        */
        //1.创建一个富二代的对象
        RichMan wang = new RichMan("王思聪",true);
​
        //2.创建一个汽车的对象
        Car BMW = new Car("白色","兰博基尼");
​
        //3.创建一个女友的对象
        GirlFriend girl = new GirlFriend("凤姐");
​
        //4.让富二代执行自己的行为
        wang.drive(BMW);
        //wang.show(girl,BMW);
    }
}
​
/*
富二代类
        特征:姓名  有钱
        行为:开车,炫耀车
*/
class RichMan
{
    //成员变量
    String name;
    boolean hasMuchMoney;
    
    //构造方法
    public RichMan() {}
    public RichMan(String n,boolean is) {
        name = n;
        hasMuchMoney = is;
    }
​
    //成员方法
    public void drive(Car c) {
        System.out.println(name + "开着豪车" + c.brand);
    }
​
    public void show(GirlFriend gf,Car c) {
​
        System.out.println(name + "向" + gf.name + "炫耀豪车" + c.brand);
    }
}
​
/*
汽车类
        特征:颜色,品牌
        行为:奔跑
*/
class Car
{
    //成员变量
    String color;
    String brand;
​
    //构造方法
    public Car() {}
    public Car(String c,String b) {
        color = c;
        brand = b;
    }
​
    //成员方法
    public void run() {
        System.out.println("一辆" + color + "的" + brand + "在奔跑");
    }
}
​
/*
女友类
        特征:姓名
*/
class GirlFriend
{
    //成员变量
    String name;
​
    //构造方法
    public GirlFriend(){}
    public GirlFriend(String n) {
        name = n;
    }
}

第四节:this关键字

4.1 this.属性

访问本类的成员属性

​ 作用:为了区分成员变量和形参

4.2 this.方法

​ 访问本类的成员方法

4.3 练习

//演示this的使用
class ThisUsageDemo01 
{
    public static void main(String[] args) 
    {
        //
        Cat maomao = new Cat("毛毛",10);
        maomao.setName("fhsdg");
​
        Cat xiaohei = new Cat("小黑",5);
        xiaohei.setName("hello");
​
        /*
        无参的构造方法被调用
        String int构造方法被调用
        无参的构造方法被调用
        String int构造方法被调用
​
        说明:每创建一个对象,只能自动的调用其中的一个构造方法,通过this()可以手动的去调用其他的构造方法
        */
​
        //对象.
        xiaohei.show3();
    }
}
​
class Cat
{
    String name;
    int age;
    int num;
    int num1;
​
    //3.this()
    public Cat() {
        System.out.println("无参的构造方法被调用");
    }
    //1.this.属性
    public Cat(String name,int age) {
        //调用的是无参的构造方法
        this();
        this.name = name;
        this.age = age;
​
        System.out.println("String int构造方法被调用");
    }
    public Cat(String name,int age,int num,int num1) {
        //对this()的调用必须是构造方法中的第一个语句
        //this();
        //具体调用的是哪个构造方法,取决于所传的参数
        this(name,age);
        //可以简化代码
        //this.name = name;
        //this.age = age;
        this.num = num;
        this.num1 = num1;
​
        System.out.println("String int int int构造方法被调用");
    }
​
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
​
    //2.this.方法
    //普通方法
    public void show1() {
        //在本类中调用方法时,this可以省略
        this.show2();
        //在非静态方法中调用静态方法时,也可以使用this,this同样可以省略
        this.show3();
    }
​
    public void show2() {
    }
​
    //静态方法
    public static void show3() {
        //错误: 无法从静态上下文中引用非静态 变量 this
        //在静态方法中不能使用this
        /*
        在测试类中的main函数使用xiaohei调用了show3方法,所以此处的this代表的就是xiaohei
        而xiaohei本身是一个引用性的变量,是非静态的,所以在静态函数中不能访问非静态变量
        */
        //this.show4();//错误演示
        show4();
    }
​
    public static void show4() {
    }
}

4.4 this()

​ 访问本类中的构造函数

​ 注意:

​ a.必须出现在构造方法中​ b.访问的是除了当前构造方法之外的其他构造方法​ c.具体访问的是哪个构造方法,取决于所传的参数​ d.只能书写在构造方法的第一条语句​ e.this()在同一个构造方法中只能出现一次

class ThisUsageDemo02 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
}
class Dog
{
     String name;
     int age;
     int num;
     String hobby;
​
    //提高代码的可读性,可维护性
    //构造方法
    public Dog() {
    }
    public Dog(String name) {
        this.name = name;
    }
    public Dog(int age) {
        this.age = age;
    }
​
    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public Dog(String name,int age,int num,String hobby) {
        this(name,age);
        this.num= num;
        this.hobby = hobby;
    }
}

第五节:总结

 

第六节: 课前默写

1.使用Arrays工具类完成下面操作

使用静态初始化的方式初始化一个一维数组

​ 升序排序 ​ 实现二分法查找 ​ 将数组转化为字符串表示形式

​ 遍历出所有的元素

2.使用不定长参数自定义一个函数,函数主体部分实现只打印偶数的功能

第七节:作业

利用面向对象的思想写下面的程序

1.小美在朝阳公园溜旺财【注:旺财是狗】

2.小明穿着白色的特步运动鞋在奥林匹克公园跑步

3.赵老师在讲台上讲课,小刚认真的听课做笔记

4.张阿姨和李阿姨在物美超市买红富士

构造方法

1.定义一“圆”(Circle)类,圆心为“点”Point类,构造一圆,求圆的周长和面积,并判断某点与圆的关系

2.李晓在家里开party,向朋友介绍家中的黄色的宠物狗【彩彩】具有两条腿走路的特异功能。

3.王梅家的荷兰宠物猪【笨笨】跑丢了,她哭着贴寻猪启示。

4.富二代张三向女朋友李四介绍自己的新跑车:白色的宾利

第八节:面试题

1.什么是面向对象?面向对象和面向过程的区别是什么

面向对象是基于面向对象的编程思想

面向过程强调的是每一个功能的实现,面向对象强调的是对象,然后用对象去调用功能。

2.构造方法与普通方法之间的区别

构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。

3.this关键字的作用以及使用

  本书部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。   本书内容精炼,示例简单明了,适合各层次面向对象发人员阅读,也是高校相关专业面向对象课程的理想教学参考书。 第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式发转向面向对象发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 1.4 类到底是什么 9 1.4.1 类是对象模板 9 1.4.2 属性 11 1.4.3 方法 11 1.4.4 消息 11 1.5 使用UML完成类图建模 12 1.6 封装和数据隐藏 12 1.6.1 接口 12 1.6.2 实现 13 1.6.3 接口/实现范型的个实际例子 13 1.6.4 接口/实现范型的模型 14 1.7 继承 15 1.7.1 超类和子类 16 1.7.2 抽象 16 1.7.3 is-a关系 17 1.8 多态 18 1.9 组合 20 1.9.1 抽象 21 1.9.2 has-a关系 21 1.10 小结 21 1.11 本章使用的示例代码 21 1.11.1 TestPerson示例:C#.NET 21 1.11.2 TestPerson示例:VB.NET 22 1.11.3 TestShape示例:C#.NET 23 1.11.4 TestShape示例:VB.NET 25 第2章 如何以对象方式思考 27 2.1 了解接口与实现之间的区别 28 2.1.1 接口 29 2.1.2 实现 29 2.1.3 接口/实现示例 29 2.2 设计接口时使用抽象思维 33 2.3 尽可能为用户提供最小接口 35 2.3.1 确定用户 35 2.3.2 对象行为 36 2.3.3 环境约束 36 2.3.4 明确公共接口 36 2.3.5 明确实现 37 2.4 小结 37 2.5 参考书目 38 第3章 高级面向对象概念 39 3.1 构造函数 39 3.1.1 何时调用构造函数 39 3.1.2 构造函数中有什么 40 3.1.3 默认构造函数 40 3.1.4 使用多个构造函数 41 3.1.5 构造函数的设计 44 3.2 错误处理 44 3.2.1 忽略问题 45 3.2.2 检查问题并中止应用 45 3.2.3 检查问题并尝试恢复 45 3.2.4 抛出异常 45 3.3 作用域概念 47 3.3.1 局部属性 48 3.3.2 对象属性 49 3.3.3 类属性 50 3.4 操作符重载 51 3.5 多重继承 52 3.6 对象操作 53 3.7 小结 54 3.8 参考书目 54 3.9 本章使用的示例代码 54 3.9.1 TestNumber示例:C#.NET 54 3.9.2 TestNumber示例:VB.NET 55 第4章 类剖析 57 4.1 类名 57 4.2 注释 58 4.3 属性 59 4.4 构造函数 60 4.5 访问方法 62 4.6 公共接口方法 63 4.7 私有实现方法 64 4.8 小结 64 4.9 参考书目 64 4.10 本章使用的示例代码 65 4.10.1 TestCab示例:C#.NET 65 4.10.2 TestCab示例:VB.NET 66 第5章 类设计指导原则 68 5.1 真实世界系统建模 68 5.2 明确公共接口 69 5.2.1 最小公共接口 69 5.2.2 隐藏实现 69 5.3 设计健壮的构造函数(和析构函数) 70 5.4 在类中设计错误处理 70 5.4.1 对类建立文档以及使用注释 71 5.4.2 构建类要以合作为出发点 71 5.5 设计时充分考虑重用 72 5.6 设计时充分考虑到可扩展性 72 5.6.1 名字要有描述性 72 5.6.2 抽出不可移植的代码 72 5.6.3 提供种复制和比较对象的方法 73 5.6.4 让作用域尽可能小 73 5.6.5 类应当对自己负责 74 5.7 设计时充分考虑可维护性 75 5.7.1 使用迭代 76 5.7.2 测试接口 76 5.8 使用对象持久性 78 5.9 小结 79 5.10 参考书目 79 5.11 本章使用的示例代码 79 5.11.1 TestMath示例:C#.NET 79 5.11.2 TestMath示例:VB.NET 80 第6章 利用对象实现设计 81 6.1 设计指导原则 81 6.1.1 完成适当的分析 84 6.1.2 建立工作陈述 84 6.1.3 收集需求 84 6.1.4 发用户界面的原型 85 6.1.5 明确类 85 6.1.6 确定各个类的职责 85 6.1.7 确定类如何相互合作 85 6.1.8 创建类模型来描述系统 85 6.2 案例研究:blackjack示例 86 6.2.1 使用CRC卡 87 6.2.2 明确blackjack类 88 6.2.3 明确类的职责 90 6.2.4 UML用例:明确协作关系 95 6.2.5 第轮CRC卡 98 6.2.6 UML类图:对象模型 99 6.2.7 建立用户界面原型 100 6.3 小结 101 6.4 参考书目 101 第7章 掌握继承和组合 102 7.1 重用对象 102 7.2 继承 103 7.2.1 般化和特殊化 105 7.2.2 设计决策 105 7.3 组合 107 7.4 为什么封装在OO中如此重要 109 7.4.1 继承如何削弱封装 109 7.4.2 多态的个详细例子 111 7.4.3 对象职责 111 7.5 小结 115 7.6 参考书目 115 7.7 本章使用的示例代码 115 7.7.1 TestShape示例:C#.NET 115 7.7.2 TestShape示例:VB.NET 117 第8章 框架与重用:使用接口和抽象类实现设计 119 8.1 代码:重用还是不重用 119 8.2 什么是框架 119 8.3 什么是契约 121 8.3.1 抽象类 122 8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 建立契约 128 8.3.6 系统插入点 130 8.4 个电子商务例子 130 8.4.1 电子商务问题 130 8.4.2 非重用的方法 131 8.4.3 个电子商务解决方案 133 8.4.4 UML对象模型 133 8.5 小结 137 8.6 参考书目 137 8.7 本章使用的示例代码 138 8.7.1 TestShape示例:C#.NET 138 8.7.2 TestShape示例:VB.NET 140 第9章 构建对象 143 9.1 组合关系 143 9.2 分阶段构建 144 9.3 不同类型的组合 146 9.3.1 聚集 146 9.3.2 关联 146 9.3.3 结合使用关联和聚集 148 9.4 避免依赖性 148 9.5 基数 149 9.5.1 多个对象关联 151 9.5.2 可选关联 151 9.6 集成示例 152 9.7 小结 152 9.8 参考书目 153 第10章 用UML创建对象模型 154 10.1 什么是UML 154 10.2 类图的结构 155 10.3 属性和方法 156 10.3.1 属性 156 10.3.2 方法 157 10.4 访问指示 157 10.5 继承 158 10.6 接口 159 10.7 组合 160 10.7.1 聚集 160 10.7.2 关联 161 10.8 基数 161 10.9 小结 162 10.10 参考书目 163 第11章 对象和可移植数据:XML 164 11.1 可移植数据 164 11.2 XML 165 11.3 XML与HTML 166 11.4 XML和面向对象语言 166 11.5 两个公司间共享数据 167 11.6 用DTD验证文档 168 11.7 将DTD集成到XML文档 170 11.8 使用层叠样式表 175 11.9 小结 177 11.10 参考书目 177 第12章 持久对象:串行化和关系数据库 178 12.1 持久对象基础 178 12.2 将对象保存到平面文件 179 12.2.1 串行化文件 180 12.2.2 再谈实现和接口 182 12.2.3 方法如何保存 183 12.3 串行化过程中使用XML 183 12.4 写到关系数据库 186 12.5 加载驱动程序 189 12.5.1 建立连接 189 12.5.2 SQL语句 190 12.6 小结 192 12.7 参考书目 192 12.8 本章使用的示例代码 192 12.8.1 Person类示例:C#.NET 193 12.8.2 Person类示例:VB.NET 195 第13章 对象与因特网 197 13.1 分布式计算的演进 197 13.2 基于对象的脚本语言 197 13.3 JavaScript验证示例 200 13.4 Web页面中的对象 202 13.4.1 JavaScript对象 202 13.4.2 Web页面控件 204 13.4.3 声音播放器 205 13.4.4 电影播放器 205 13.4.5 Flash 206 13.5 分布式对象和企业 206 13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web服务定义 210 13.5.3 Web服务代码 213 13.5.4 Invoice.cs 214 13.5.5 Invoice.vb 215 13.6 小结 216 13.7 参考书目 216 第14章 对象和客户/服务器应用 217 14.1 客户/服务器方法 217 14.2 专有方法 217 14.2.1 串行化对象代码 218 14.2.2 客户代码 218 14.2.3 服务器代码 220 14.2.4 运行专有的客户/服务器示例 222 14.3 非专有方法 223 14.3.1 对象定义代码 223 14.3.2 客户代码 224 14.3.3 服务器代码 225 14.3.4 运行非专有的客户/服务器示例 227 14.4 小结 228 14.5 参考书目 228 14.6 本章使用的示例代码 228 14.6.1 客户/服务器示例——VB.NET:对象定义代码 228 14.6.2 客户/服务器示例——VB.NET:客户代码 229 14.6.3 客户/服务器示例——VB.NET:服务器代码 230 第15章 设计模式 232 15.1 为什么研究设计模式 232 15.2 Smalltalk的模型/视图/控制器 233 15.3 设计模式的不同类型 234 15.3.1 创建型模式 235 15.3.2 结构型模式 239 15.3.3 行为型模式 241 15.4 反模式 242 15.5 小结 243 15.6 参考书目 243 15.7 本章使用的示例代码 243 15.7.1 C#.NET 244 15.7.2 VB.NET 247 索引 250
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值