面向对象基础

一、面向对象程序设计

1.什么是对象

 

      Java是面向对象的编程语言, 对象就是面向对象程序设计的核心。对象就是真实世界中的实体,对象与实体是一一对应的。现实世界中每一个实体都是一个对象,它是一种具体的概念。对象有以下特点:
①对象具有属性和行为。
②对象具有变化的状态。
③对象具有唯一性。
④对象都是某个类别的实例。
⑤一切皆为对象,真实世界中的所有事物都可以视为对象。

 

2.面向对象与面向过程的区别

 

       面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可, 常见的面向过程语言就是 C语言。
       面向对象是把整个需求按照特点、 功能划分,将这些存在共性的部分封装成对象。创建对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为,除了C语言之外的其他常见编程语言都是面向对象的编程语言。如 :Java、python 等。
                                                   面向对象与面向过程的优缺点

 

 

3.面向对象的三大特征
(1)封装性:封装是面向对象的核心思想。
(2)继承性:继承性主要描述的是类与类之间的关系,通过继承,可以将原有类的某些特征或全部特征继承到新的类中,而无需重复编写。
(3)多态性:多态性是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,使同一个属性和方法在不同的类中具有不同的语义。

二、什么是类

1.类的定义        
        类是对某一类事物的抽象描述,是用来创建对象的模板,包含了被创建对象的属性和方法的定义。
[修饰符] class <类名> {
    各种成员变量的定义;
    各种成员方法的定义;
}

2.理解成员变量和局部变量

        大括号里面还需要定义类的成员变量及成员方法, 在类体(大括中的内容即类体)中,变量定义部分所声明的变量为类的成员变量,而在成员方法体中声明的变量和方法的参数则被称为局部变量。

        成员变量和局部变量的主要区别体现在它们的作用范围不同:

        成员变量: 在类体中声明,整个类中均可使用。

        局部变量: 在方法内或方法内的复合代码块(也就是“{ }” 之间的代码) 中声明的变量, 在方法内、 代码块外声明的局部变量,在整个方法中有效。而在代码块中声明的变量只在代码块中有效。例如: 

public class Student { 
    int a=18;     // 定义的成员变量 a,整个Student 类中有效
    //Read为成员方法
    public void Read(){
        int b=5;    // b 为方法的局部变量,整个方法中使用时有效
        if(time<24){
            int c=8;    //c 为代码块的局部变量,只能在 if的{}中使用
            a=a+c;    // 允许访问
            b=b-c;    //允许访问
        }
    }
}
(1)声明成员变量
Java用成员变量来表示类的状态和属性, 声明成员变量的基本语法如下。
[修饰符] [static] [final] <变量类型> <变量名>;

(2)声明局部变量

局部变量的声明不能使用修饰符public、protected、private 和static 关键字,但可以使用final。将变量变成常量,声明局部变量的基本语法如下。
[final] <变量类型> <变量名>;

3.成员方法

 

成员方法,就是用来实现类的行为的功能函数,类的成员方法由声明和方法体两个部分组成。其一般格式如下。
[修饰符] <方法返回值的类型> <方法名>([参数列表]){ 
    [方法体]
}

三、什么是构造方法与对象

1.构造方法的定义

 

        构造方法除了创建对象,还能在创建对象的过程中给该对象中的成员变量进行赋值,构造方法是一种特殊的方法。它的方法名与它所在的类名完全相同,它没有返回值, 也不需要用void关键字进行标识。

 

2.对象创建与使用

(1)对象创建

创建对象的具体语法格式如下:
类名 对象名 =new 构造方法名([参数列表])

(2)对象使用

创建对象后,就可以利用对象来访问成员变量和成员方法进而完成相应的操作了,通过使用运算符“.”来实现访问。语法格式如下。
对象 . 成员变量
对象 . 成员方法()

                                                各类型变量的初始值

 (3)垃圾对

当对象没有被任何变量引用时,它将成为垃圾对象,不能再被使用。

四、类的分装

        类的封装,就是指将类中的成员方法和成员变量用private关键字修饰,凡是被private关键字修饰过的成员方法和成员变量就成为该类的私有属性,它们只能在它所在的类中被访问,而该类的对象不能访问这些私有属性。

如果想要访问这些私有属性,类中需要提供一些被 public修饰过的公有方法, 再通过对象调用公有方法,从而达到间接访问这些私有属性的目的。
五、什么是参数传值
1.传值机制
        无论成员方法ꎬ 还是构造方法,都有一个可选项[参数列表],当定义的方法包含参数时,那么在调用该方法时必须给这些参数指定参数值。
        其中,在方法定义时出现的参数称为形式参数,而在调用方法时实际传递给形式参数的参数值则被称为实际参数。
        与 C语言不同,Java方法中的参数传递方式只有一种,即值传递。所谓值传递,就是将实际参数的副本传递到方法内,在方法中对传递过来的参数做出的修改并不会影响实际参数本身。
2.基本数据类型的参数传值
        参数传递所涉及的参数类型是一致的,如整型传递给整型、 字符串传递给字符串,但是, 还有一种情况就是取值范围更大的数据是可以传递给取值范围小于它的数据,比如,int 类型,可以传递给short,double可以传递给float。反之,则不允许。
3.引用类型参数的传值
        引用类型参数,其实就是指方法中的参数是一个类的对象,即将对象作为方法中的参,请看下面两段代码:
Student stu1=new Student ();
Studet stu2=stu1;
        其中,第一行代码的含义是: 利用 new关键字开辟一段内存空间,创建一个Student 类型对象,然后用变量stu1去指向这个对象,变量stu1的实质就是一个对象的引用,变量stu1的类型就是引用类型(Student)。
        后面创建的stu2也会重新开辟一段内存空间,但是用于初始化它的值不是用new  Student()创建的新对象,而是stu1。stu2此时已经指向一个对象,所以用stu1来初始化stu2,实际上就是将stu1指向的对象来初始化stu2,也就是说它们指向同一个对象,只是指向这个对象的名称换成了 “stu2”而已,对stu1 的操作就是对stu2 的操作。
        所以,当引用类型作为方法的参数进行传递时,对其中一个变量值的改变必然会影响另一个变量,这一点看似和前面讲的“Java方法中的参数传递方式只有值传递”相冲突。其实,在 Java中,引用类型参数的传值依然是按照“值传递”的方式。因为所谓的按引用传递,意思是在方法中,用以接收实际参数的局部变量的内存空间与实际参数的内存空间是同一个。但在这里显然不是,stu1 和stu2 分别占用不同的内存空间,这里的stu1 和stu2 会互相影响完全是因为它们的引用完全相同、 所指向的值是同一个对象,而不是因为它们的内存空间相同。
六、什么是成员内部类
        在一个类中还可以定义另一个类,这样的类就被称为成员内部类,而包含了内部类的类就被称为外部类。
        成员内部类和成员变量、 成员方法一样, 都属于类的全局成员。 一般格式为:
public class Student {
    public int a     // 定义成员变量a 
    a void speak(){     // 定义成员方法
    }
    class Learn{     //定义内部类Learn
    }
}

七、this关键字

如果成员变量和局部变量的名称相同,这时,成员变量就会被隐藏。要想在成员方法中使用成员变量,就必须使用this关键字,语法格式如下:
this.成员变量名;
this.成员方法名();

1.this关键字访问类的成员变量

this关键字访问类的成员变量可以解决成员变量与局部变量重名的问题,请参看以下代码:
public class Goods {
    String name;
    public void srtName(String name) {     // 定义一个setName 方法
    this.name;     /// 将参数值赋予类中的成员变量 
    } 
}

2.this关键字作为方法的返回值 

public class Goods{
    String name;
    publicString getName() {     // 定义一个setName方法
        return this.name;     // 返回当前对象的成员变量 name值,this可以省略 
    }
}

3.this关键字调用类的成员方法

 

public class Student{
    public void introduce() {     //定义一个introduce 方法
    ......
    }
    public void speak() {     //定义一个speak方法
        this.introduce()     //调用当前对象的introduce()方法
    }
}

 

4.this关键字在构造方法中的使用

         构造方法的作用就是给对象的成员变量赋值,一个类中必须有构造方法, 如果没有定义构造方法,系统也会自动生成一个,在实际开发中,往往会定义多个构造方法,虽然它们的名称都是类名,但是它们的参数是不一样的,我们就是根据这些参数来选择到底调用哪一个构造方法,关于方法的重载在后面还会详细讲解。
        构造方法是在实例化对象的同时被对象自动调用的,在程序中,不能像调用其他成员方法一样通过对象来调用,但是可以通过使用“ this([参数 1,参数 2,......参数 n])”的形式来调用构造方法。
八、static关键字
1.静态变量
        静态变量,就是指被static关键字修饰过的成员变量,静态变量被所有实例共享,可以使用“类名.变量名”的形式来访问。
2.静态方法
        静态方法,就是指被static 关键字修饰过的成员方法,同静态变量一样, 静态方法
也可以使用“类名.方法名”的形式来访问,也可以通过类的实例对象来访问。
九、什么是包
1.包的概念
        包(package)是Java提供的一种区别类的命名空间的机制,是类的组织方式,是一组相关类的集合,Java中提供的包主要有以下 3 种用途:
        (1)把功能相似、 相关的类或接口组织在同一个包中, 方便类的查找和使用。
        (2)如同文件夹一样,包也采用了树形目录的存储方式, 同一个包中的类名是不同的。不同的包中类的名字可以相同,当同时调用两个不同包中相同类名的类时, 应该加上包名加以区别,因此, 包可以避免类名冲突。
        (3)包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
2.包的创建
        创建包可以通过在类或接口的源文件中使用 package 语句来实现,具体语法格式如下:
package 包名:

十、import语句

 

需要使用系统已经定义好的Scanner 类中的nextInt方法,而如果要在程序中使用这些系统提供的类,必须使用 import关键字来加载已定义好的类或包,然后才能调用其方法和属性,import java.util.Scanner的具体含义是: 加载java包中的util包中的Scanner类,只有这样,才能在程序中直接使用Scanner类中的方法。import语句的基本语法格式如下:
import 包名1 [. 包名1下的子包名].......  .类名|∗;
        | : 表示或者。
         ∗: 表示引用这个包中所有的类。
        一个 Java源程序中可以有多个import语句,它们必须写在 package 语句和源文件中类的定义之间。Java类库中常用的包有以下几个:
        Java.lang   提供利用 Java编程语言进行程序设计的基础类,最重要的类是Object(它是类层次结构的根)和 Calss(它的实例表示正在运行的应用程序中的类)。
        Java.util   包含集合框架、 遗留的collection类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、 随机数生成器和位数组、 日期Date 类、堆栈Stack 类、向量Vector类等)。 集合类、 时间处理模式、 日期时间工具等各类常用工具包。
        Java.io   Java 的核心库Java.io提供了全面的 IO 接口, 包括文件读写、 标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流, 或者从输入流读入。
        Java.net    网络编程常用的包。
        Java.sql    操作数据库常用的包。
十一、设计超市购物系统
1.任务描述
        去超市购物是人们日常生活的重要事情之一,超市中有很多日常生活用品,如水果、 蔬菜、 洗衣机、 电冰箱等。人们只能买到超市中的已有商品,如果需要的商品在超市中没有或已经卖完了,那么顾客将不能在超市买到商品。
2.任务目标
(1)学会分析“超市购物系统”子任务实现的逻辑思路。
(2)能够独立完成“超市购物系统”程序的源代码编写、 编译及运行。
(3)实理现解思类路和对象的概念及它们的创建和使用。
3.实现思路
本程序共可分为三个类: 商品、 超市和顾客。
(1)商品具有商品名称的属性。
(2)超市不仅有商品名称,还库存了不同的商品。 因此,还包括库存这一属性(即由不同商品组成的数组)。超市有卖货行为,即判断顾客需要的商品是否在库存内,如果在,说明顾客可以购买到商品,返回商品。 如果不在,说明顾客不能买到商品,返回null。
(3)顾客有名字属性,还有购物行为,顾客可以决定要去的超市和要购买的商品。
(4)实顾现客代的码购物行为和超市的卖货行为类似。
4.实现代码
(1)定义一个商品类
public class Goods|{
    private String name;
    public Goods( String name)}    //定义构造方法为成员变量赋值
        this. name = name;
    }
    public String getName (){
        return this. name;    //this可以省略
    }
    public void setName ( String name){
        this. name = name;
    }
}

(2)定义一个超市类Supermarket

//超市包括超市名称、超市商品的库存量(由商品组成的数组)、卖货方法(查看商品是否在库存中)
public class Supermarket
    private String name;    //定义超市名称
    private Goods[] store;    //定义一个Goods类型数组存放商品
    public String getName()
        return name;
    } 
    public void setName ( String name){
        this. name = name;
    }
    public Goods[] getStore(){
        return store;
    }
    public void setStore(Goods[] store){
        this. store = store;

    }
//卖货行为
    public Goods sellGoods (String name){
        for(int i=0; i<store. length; i++){     //循环遍历仓库中每一个商品
            if(store[i]. getName () = = name){
                return store[i];      //如果商品在该超市的库存中,返回商品
            } 
        }
        return null;     //如果商品不在该超市的库存中,返回null
    }
}

(3)定义一个顾客类

//购物者包括购物者的名字、购物方法(要买的商品,指定的超市)
public class Consumer{
    private String name;
    public String getName(){
        return name;
}
    public void setName ( String name){
        this. name = name;
}
    //定义购物方法,指定去哪个超市、要购买的商品
    public Goods shopping( Supermarket s, String goodsName) 1
         //调用超市的卖货方法,指定商品名,把卖出的结果返回
        return s. sellGoods ( goodsName);
    }
}

(4)定义测试类Test,完成相应操作

//首先创建商品对象、超市对象、购物对象,再调用购物方法进行测试
public class Text {
    public static void main (String[] args){    
        //创建商品对象
        Goods gl= new Goods ("油饼");
        Goods g2= new Goods("豆浆机");
        Goods g3= new Goods("黄豆");
        Goods g4 = new Goods (" 自然堂");
        Goods g5= new Goods ("洁柔");
        //创建超市对象
        Supermarket m = new Supermarket();
        m. setName("大润发");
        m. setStore (new Goods[] {g4,g5});
        Supermarket s= new Supermarket ();
        s. setName("家乐福");
        s. setStore(new Goods[]{g1,g2,g3});    //给s超市的库存赋值。
        //创建顾客对象
        Consumer cl = new Consumer();
        cl. setName("三");
        Consumer c2= new Consumer();
        c2. setName("李四"); 
        //购物行为
        Goods gol =cl. shopping(m,"豆浆机");     //调用购物方法,指定超市和商品名,得到购物
        if(gol! =null){    //对结果进行判断
        System. out. println(c1. getName () + "在" + m. getName () + "买到了" +go1. getName ()+"。";
        }else{
        System. out. println(c1. getName() + "在" + m. getName() +",什么也没有买到。");
}

        Goods go2 = c2. shopping(s,"豆浆");
        if(go2! = null){
        System. out. println(c2. getName() + "在" + s. getName() + "买到了" +go2. getName()+"。”);
        }else{
        System. out. println(c2. getName() + "在" + s. getName() +",什么也没有买到。");
        }
    }
}

5.运行结果

 

 

posted @ 2022-09-13 23:41  史华月  阅读(139)  评论(0编辑  收藏  举报