07.面向对象编程

v面向过程 & 面向对象

  • 面向过程思想

    • 步骤清晰简单,第一步做什么,第二步做什么。。。
    • 面向过程适合处理一些较为简单的问题
  • 面向对象思想

    • 物以类聚,分类的思想模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后,才对某个分类下的细节进行面向过程的思索。

    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!

  • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

什么是面向对象

  • 面向对象编程(Object-Oriented Programming, OOP)

  • 面向对象编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据。

  • 抽象

  • 三大特性:

    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

  • 从代码运行角度考虑是先有类后有对象,类是对象的模板。

回顾方法及加深

  • 方法的定义

    • 修饰符

    • 返回类型

    • break (跳出switch,结束循环)注意和return(return:结束方法,返回一个结果!)的区别

    • 方法名:注意规范就可(见名知意)

    • 参数列表:(参数类型,参数名)…

    • 异常抛出

    • package OOP;
      
      import java.io.IOException;
      
      public class Test01 {
          // main 方法
          public static void main(String[] args) {
      
          }
          /*
          修饰符 返回值类型 方法名 (...) {
          // 方法体
          return 返回值;
          }
           */
          // return 结 束 方 法,返 回 一 个 结 果!
          public String sayHello () {
              return "Hello!";
          }
          public void print(){ // 返回值为空
              return;
          }
          public int max(int a,int b){
              return a > b ? a : b ;// 三元运算符
          }
          // 异 常 抛 出  // eg:数组下标越界:ArrayIndexOutOfBoundsException
          public void readFile(String file) throws IOException{
      
          }
      }
      
  • 方法的调用:递归

    • 静态方法:带有static的方法

    • 非静态方法

    • /*
      当方法为静态方法时,可以通过类名直接调用,当方法为非静态方法时,不能通过类名直接调用。
      */
      public class Test02 {
          public static void main(String[] args) {
              Student.say();
          }
      }
      
      public class Student {
          public static void say(){ // 静态方法
              System.out.println("这个学生说话喽!");
          }
      }
      
    • /*
      此时需要通过Student类创建的对象来调用该方法
      */
      package OOP;
      
      public class Test02 {
          public static void main(String[] args) {
              Student student = new Student();
              student.say();
          }
          // 和 类 一 起 加 载 的,
          public static void A() {
              B(); // 此时A已经存在,而B 对象还未创建,还不存在,故调用失败
          }
          // 类实例化之后才存在(对象创建之后才存在)
          public  void B() {
      
          }
      }
      
      
    • public class Student {
          public void say(){ // 非静态方法
              System.out.println("这个学生说话喽!");
          }
      }
      
    • 形参和实参

    • package OOP;
      
      public class Test03 {
          public static void main(String[] args) {
              Test03 test03 = new Test03();
                                            // 实参 1 和 3
              System.out.println(test03.add(1,3)); // 输 出 结 果 为 4
              
              System.out.println("============");
                                  // 实 参 1 和 2
              int add = Test03. add(1,2);
              System.out.println(add); // 输 出 结 果 为 3
          }
                             // 形式参数a,b
          public static int add(int a,int b){
              return a+b;
          }
      }
      
    • 值传递和引用传递

    • package OOP;
      
      // 值 传 递
      public class Test04 {
          public static void main(String[] args) {
              int a = 1;
              System.out.println(a); // 结 果 为 1
              Test04.change(a);
              System.out.println(a); // 结 果 为 1
          }
          // 返 回 值 为 空
          public static void change(int a){
             a = 10;
          }
      }
      
      package OOP;
      
      // 引 用 传 递: 对象传递,本质上还是值传递
      public class Test05 {
          public static void main(String[] args) {
              Persion persion = new Persion();
              System.out.println(persion.name); // 结 果 为 :null
              Test05.change(persion);
              System.out.println(persion.name); // 结 果 为 :李某某
          }
          public static void change(Persion persion){
              // persion是一个对象;指向的---> Persion persion = new Persion(); 这是一个具体的人,可以改变其属性。
              persion.name = "李某某";
          }
      }
      //定义了一个Persion类,它有一个属性:name
      class Persion {
          String name; // null
      }
      
    • this关键字

  • 类与对象的关系

    • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不能代表某一个具体的事物

      • 动物、植物、手机、电脑。。。

      • Persion类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为

    • 对象是抽象概念的具体实例

      • 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
      • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象概念。
  • 创建和初始化对象

    • 使用new关键字创建对象

    • package OOP.Test06;
      
      // 学 生 类
      public class Student {
          // 属性:字段
          String name;
          int age;
          // 在 学 习
          public void study() {
              System.out.println(this.name+"在学习");
          }
      }
      
      package OOP.Test06;
      
      // 一个项目只应存在一个main方法
      public class Application { // 主 类
          public static void main(String[] args) {
              // 类:抽象的, 实例化
              // 类实例化后会返回一个自己的对象!
              // student对象 就是一个Student类的具体实例!
              Student xiaoming = new Student();
              Student xiaohong = new Student();
              System.out.println(xiaoming.age); // 输出结果为:0
              System.out.println(xiaoming.name); // 输出结果为:null
      
              xiaohong.name = "小红"; // 赋值
              xiaohong.age = 21; // 赋值
              System.out.println(xiaohong.name); // 输出结果为:小红
              System.out.println(xiaohong.age); // 输出结果为:21
          }
      }
      
    • 使用new关键字创建的时候,出了分配内存空间外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

    • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造其有以下两个特点:

      1. 必须和类的名字相同

      2. 必须没有返回类型,也不能写void

        package OOP.Test07;
        
        // 一个项目只能有一个main方法
        public class Application {
            public static void main(String[] args) {
                // new 实例化了一个对象
                Persion persion1 = new Persion();
                System.out.println(persion1.name); // 输出结果为:null
        
                Persion persion2 = new Persion("lixiaokang");
                System.out.println(persion2.name); // 输出结果为:lixiaokang
            }
        }
        
        package OOP.Test07;
        
        public class Persion {
            // 一个类即使什么都不写,他也会存在一个方法
            // 显示的定义构造器
            String name;
            /*
            实例化初始值:
            1.使用new关键字,本质是在调用构造器(构造方法)
            2.用来初始化值
             */
            public Persion(){ // 构造方法
        
            }
            // 有参构造:一旦定义了有参构造,无参构造就必须显示定义(写出来)
            public Persion(String name){
                this.name = name;
            }
        }
        
    • 构造器必须要掌握(很重要!!)

      • 和类名相同
      • 没有返回值
    • (构造器)作用:

      • new 本质在调用构造方法
      • 初始化对象的值
    • 注意:

      • 定义有参构造之后,如果想使用无参构造,需显示的定义一个无参的构造
      • idea快捷键:Alt + Insert :快速生成构造器
    • 创建对象内存分析

      • package OOP.Test08;
        
        public class Application {
            public static void main(String[] args) {
                Pet dog = new Pet();
                dog.name = "旺财";
                dog.age = 3;
                dog.shout();
                System.out.println(dog.name);
                System.out.println(dog.age);
                Pet cat = new Pet();
            }
        }
        
      • package OOP.Test08;
        
        public class Pet {
        
            public String name;
            public int age;
            // 无 参 构 造
        
            public void shout() {
                System.out.println("叫了一声");
            }
        }
        
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFluGEcb-1629187516803)(C:\Users\LXK\AppData\Roaming\Typora\typora-user-images\image-20210729175213306.png)]

      • 注意:
            栈里面存放的主要是main()方法和对象的引用,且存放在栈的最底端,而创建的对象和它包含的数据则存放在堆中。
            值得注意的是方法区中的静态方法去,它和类“共存亡”,类刚被加载时就已经存在。
        
      • 堆、栈、方法区存储的内容
        堆:
        堆中存放的都是new出来的对象,每个对象都包含一个与之对应的.class文件,凡是new出来的对象都存放在堆中,堆中不存放基本类型和对象引用,只存放对象本身。
        
        非静态成员变量在类的实例化时开辟空间并初始化,所以类的非静态成员变量也放在堆中。
        
        对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理。
        
        栈:
        每个线程包含一个栈区,栈中只保存基础数据类型的值和对象的引用。在方法执行时,被分配的内存就存在栈中,所以当然存储的局部变量就在栈中。当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放;
        
        每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
        
        栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
        
        方法区:
        方法区又叫静态区,方法区中包含的都是在整个程序中永远唯一的元素比如class,static变量
        
        方法区和堆一样都是被各个线程所共享,它用于存储class二进制文件,包含了虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
        
        常量池是方法区的一部分内存,常量池在编译期间就将一部分数据存放于该区域,包含基本数据类型如int、long等以final声明的常量值,
        串池也是方法区中的一部分内存,用于存放String字符串,对于方法运行期位于栈中的局部变量String常量的值可以通过 String.intern()方法将该值置入到常量池中。
        
        方法区是线程安全的,由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。方法区的静态变量一个线程访问的时候另一个线程必须等待。
        
      • img

      • 小结:

      • package OOP.Test09;
        
        public class Application {
            public static void main(String[] args) {
        
                /*
                小结:
                1. 类与对象
                    类是一个模板:(是抽象的)。对象是一个具体的实例
                2. 方法
                    定义   调用!
                3. 对象的引用
                    引用类型:(除去八大基本类型以外的类型)
                        对象是通过引用(指向对象的地址)来操作的:栈----->堆(地址)
                4. 属性:字段Filed 成员变量
                    默认初始化
                        数字:0  0.0
                        char: u0000
                        boolean: false
                        引用: null
                    修饰符   属性类型  属性名 = 属性值!
                5. 对象的创建和使用
                    1.必须使用new关键字创建对象, 构造器 People people = new People();
                    2.对象的属性  people.name
                    3.对象的方法  people.sing()
                6. 类
                    静态的属性  属性
                    动态的属性  方法
        
                    封装 继承 多态
                 */
            }
        }
        

      1.必须使用new关键字创建对象, 构造器 People people = new People();
      2.对象的属性 people.name
      3.对象的方法 people.sing()
      6. 类
      静态的属性 属性
      动态的属性 方法

                封装 继承 多态
             */
        }
      

      }

      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
posted @ 2022-07-17 19:08  小白到大牛  阅读(55)  评论(0)    收藏  举报