Skip to content

12面向对象

传统的C语言属于面向过程编程语言。 面向过程解决问题的思路: 面向过程的抽象是将实现一个功能的一组命令组合成为一个函数,这个函数就能实现这一个功能,是对功能实现的一种抽象,有了函数,我们就没有必要重复写很多的代码(特殊地譬如递归,可通过循环替代),仅仅一个代码集合名称以及参数就能调用抽象的命令集合。

Java语言属于面向对象编程语言 面向对象解决问题的思路: 从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。

面向对象编程包括 面向对象的分析(OOA,Object Oriented Analysis) 面向对象的设计(OOD,Object Oriented Design) 面向对象的编程实现(OOP,Object Oriented Programming) 面向对象思想说明 OOA:通常是把构成问题域的事务分解成各个对象,给对象赋予相应的属性和行为,通过多个对象的相互协调来解决问题。 建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 。支持面向对象编程是Java 语言的重要特点。 OOD:这些对象没有先后顺序,共同作用才构成了整个系统。我们只要用代码设计出这几个类型的对象,然后让他们互相通信、传递消息就可以完成系统功能。 面向对象编程思想实际上就是一种运用对象、类、继承、封装、聚合、关联、消息、多态性等概念来构造系统的软件开发方法。 OOP:编写代码

12.1 面向对象概念

抽象(abstract):

从事物中舍弃个别的非本质特征,抽取共同的本质特征

只考虑与问题域相关的信息,而忽略与问题域不相关的部分

对象(object):是系统中用来描述客观事物的一个实体。

可以是有形的,也可以是无形的(如一个客户,一张银行卡,窗体中的一个按钮等等)

对象是构成世界的一个独立单位

具有自己的静态结构(属性)和动态行为(方法)

每个对象有自己的唯一标识

类(class):

类是一组具有相同属性和行为的对象的抽象,类的作用是用来创建对象,对象是类的一个实例

类和对象的关系

抽象和具体的关系。

每一个类在某一时刻都有零个或更多的实例, 类是生成对象的模板

一个类定义了使用哪些数据来描述属性,每一个对象都有相应的属性值数据,一个类通过一系列方法来定义行为,这些方法能在每个对象中被激活

12.2类的定义

什么是类 把相似的对象划归成一个类。 在软件设计中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的属性(变量)和行为(方法)。

[类修饰符] class 类名{
       类的成员

}

实例

java
public class Human {

    String name;
    int age;


    public void eat(){
        System.out.println("吃喝");
    }

    public void play(){
        System.out.println("xxx游戏");
    }

}

12.3 对象的创建

什么是对象

类(class) — 是对某一类事物的描述

对象(object) — 是实际存在的某类事物的个体

也称为实例(instance)

创建语法语句

java
类名   对象名 = new   类名();

实例

java
//对象的声明和创建
Human zhangfei = new Human();

12.4 对象的使用

在其他类中,使用对象名点运算符调用属性和方法 引用类的属性:对象名.属性 引用类的方法:对象名.方法名(实参)

在类内的方法中,访问本类的属性和方法可以直接访问

java
package com.neusoft.oo;

/**
 * 项目:      javaadvice
 * 类名:       Human
 * 创建时间:  2020/11/15  16:29
 * 描述 :     人类
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Human {

    //属性,全局的变量
    String name ="人类";
    int age;



    public void eat(){
        //在方法中声明的变量称之为 局部变量
        System.out.println("吃喝");
    }

    public void play(){
        System.out.println("xxx游戏");
    }
    public void sayHello(){
        System.out.println("大家好 我是xxx");
    }

    public static void main(String[] args) {
//        int xx = 0;
        int[] ages = new int[30];


        //对象的声明和创建
        Human zhangfei = new Human();


        ////给属性赋值
        zhangfei.name = "张飞";
        //调用变量的属性
        System.out.println("zhangfei.name\t"+zhangfei.name);

        //调用方法 对象名.方法名();
        zhangfei.sayHello();

    }
}

12.5 创建对象原理

java程序是交由JVM执行的,根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

我们在实例化一个对象时,同时操作了栈内存和堆内存。

在栈内保存对象的首地址,即引用; 在堆内存中保存了对象的属性。 对对象的所有操作只能通过引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾失效。

12.6 垃圾回收机制

垃圾回收(Garbage Collection,GC),JDK7以后使用G1(Garbage First)机制: 当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。 垃圾回收机制作用于堆内存,与栈内存无关。 垃圾回收机制是JVM内部运行的一个优先级比较低的后台线程,自动进行垃圾回收。它是保证程序健壮的主要手段,不用程序员参与,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。 对象会被回收情况: 1、对象的引用被赋值为null: Person p = new Person( ); p = null; 2、使用的匿名对象: new Person( ).sayHello( ); 3、超出生命周期的,如: for( int i = 0; i< 100; i++){ Person p = new Person( ); } 这里,创建了100个对象,循环赋值给变量p,每结束一次循环,变量p就超出生命周期,对象变为垃圾。

12.7 java中的值传递

java
package com.neusoft.oo;

/**
 * 项目:      javaadvice
 * 类名:       MyMath
 * 创建时间:  2020/11/15  16:51
 * 描述 :     算数
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Human {

    //属性,全局的变量
    String name ="人类";
    int age;


}

public class MyMath {

    public void plus(int  num){
        num ++;
        System.out.println(num);
    }


    public void plus(Human h){
        h.age ++;
        System.out.println("inner "+h.age);
    }

    public static void main(String[] args) {
        int num = 100;
        new MyMath().plus(num);
        System.out.println("num:"+num);


        Human h = new Human();
        h.age = 100;
        new MyMath().plus(h);
        System.out.println("outer h.age:"+h.age);
    }
}

12.7 构造方法

this 关键字

构造方法(构造器,Constructor) 构造方法也是方法,但是它是特殊的方法而已 所有的对象都是通过构造器来创建的 创建对象:

构造器(构造方法/构造器,Constructor)特点: 构造方法名必须与类相同的名称 不含返回值类型,也没有void 不能在方法中用return语句返回一个值

构造方法用来完成对象的创建,即完成对象的实例化 在Java中,每个类都至少要有一个构造器 一个类可以不写出构造方法,编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,我们称之为“默认的空构造器”。

java
package com.neusoft.oo;

/**
 * 项目:      javaadvice
 * 类名:       Tiger
 * 创建时间:  2020/11/16  8:47
 * 描述 :     老虎
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Tiger {

    String name;
    int age;


    public static void main(String[] args) {
        //Tiger
        Tiger t = new Tiger();//默认无参构造器
    }


}

12.8 构造方法的重载

当声明了带参的构造器,如果需要无参构造器,必须显示的声明。

this代表本类对象 或者是构造器

java
package com.neusoft.oo;

/**
 * 项目:      javaadvice
 * 类名:       Tiger
 * 创建时间:  2020/11/16  8:47
 * 描述 :     老虎
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Tiger {

    String name;
    int age;
    String address;

    /**
     * 构造器不需要声明返回类型
     * 构造方法跟类名必须一样
     * 没有return语句
     * @return
     */
    Tiger(){
    }

    //构造器重载
    //this代表本类对象
    Tiger(String name,int age){
        this.name = name;
        this.age = age;
    }

    //this() 在此处代表本类的构造器
    Tiger(String name,int age,String address){
        this(name,age);
        this.address = address;
    }

    public static void main(String[] args) {
        //Tiger
        Tiger t = new Tiger();

        Tiger t1 = new Tiger("东北虎",10);
        Tiger t2 = new Tiger("华南虎",5);

        System.out.println("t1.name\t"+t1.name);
    }


}

12.9 构造方法调用

12.10 Java包的概念

在Java中,包主要有以下用途 : 包允许将类组合成较小的单元 有助于避免命名冲突 包允许在更广的范围内保护类、数据和方法 将类放入包中,语法为:

java
package 包名;

使用包注意问题: 在java中位于包中的类,在文件系统中的存放位置, 必须有与包名层次相对应的目录结构 package语句作为java源文件的第一条语句 每个源文件只能声明一个包 如果没有package语句,则默认为无名包 Java类库中常用的包 java.lang Java默认包,任何程序中,该包都被自动导入。 java.io 输入/输出操作有用的类的组成。

12.10.1 package和import说明

声明

java
package com.neusoft.p1;

/**
 * 项目:      javaadvice
 * 类名:       PackTest
 * 创建时间:  2020/11/16  9:23
 * 描述 :
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class PackTest {
}

import

同一个包下不需要,访问不同包中的类,使用import关键字引入其它包中的类 必须在package声明后面,类声明前面 import语句可以出现多次

java
package com.neusoft.app;
import com.neusoft.p1.PackTest;



/**
 * 项目:      javaadvice
 * 类名:       Main
 * 创建时间:  2020/11/16  9:23
 * 描述 :     入口类
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Main {

    public static void main(String[] args) {


        //com.neusoft.p1.PackTest
        //使用全限定名 包名+类名
//        com.neusoft.p1.PackTest pt = new com.neusoft.p1.PackTest();

        PackTest packTest = new PackTest();


    }
}

import通配符

只能导入当前包,不包含子包

import com.neusoft.p1.*;

注意:java.lang包中的类几乎所有代码都会用到,因此无论写没写 import java.lang.*,编译器都会自动帮你补上

12.11 静态:static关键字

static关键字可以修饰的元素

  1. 属性 注意:只能修饰属性,不能修饰局部变量。
  2. 方法
  3. 代码块

static修饰属性:

  1. 所有对象共享,称为静态变量或类变量
  2. 不用static修饰的属性称为实例变量

static修饰方法:

​ 不需要实例化,可以直接访问,称为静态方法或类方法

static修饰语句块:

​ 类中由static关键字修饰的,不包含在任何方法体中的代码块,称为静态代码块

java
package com.neusoft.st;

/**
 * 项目:      javaadvice
 * 类名:       Math
 * 创建时间:  2020/11/16  9:58
 * 描述 :
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Math {

    //static 属性
    static double PI = 3.14;

    static {
        PI = 4;
        System.out.println("静态代码块,优先执行");
    }

//    ALT +INSERT
    public Math() {
        System.out.println("构造器.....");
    }

    //静态方法
    public static int plus(int numa ,int numb){
        return numa + numb;
    }


    public static void main(String[] args) {
        new Math();
        System.out.println(Math.PI);
        System.out.println(Math.plus(10,20));
    }
}

12.12 单例模式

java
package com.neusoft.st;

/**
 * 项目:      javaadvice
 * 类名:       Earth
 * 创建时间:  2020/11/16  10:28
 * 描述 :     地球
 * 作者 :     张金山 
 * QQ:	314649444
 * Site:      https://jshand.gitee.io
 */
public class Earth {

    private Earth(){
    }

    private static   Earth earth ;


    /**
     * 懒汉模式
     * @return
     */
    public synchronized   static Earth instance(){
        if(earth == null){
            earth = new Earth();
        }
        return earth;
    }

}

Released under the MIT License.