Back
Featured image of post JavaOOP_01

JavaOOP_01

初识面向对象


  1. 初识面向对象
  2. 方法回顾和加深
  3. 对象的创建分析

初识面向对象

  • 面向过程思想

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

    • 物以类聚,分类的思想模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
  • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

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

  • 面向对象的三大特性

    • 封装:封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。
    • 继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
    • 多态:多态是同一个行为具有多个不同表现形式或形态的能力。

回顾方法和加深

  • 静态方法与非静态方法的调用

    • 静态方法定义: 在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。

    Student类

    package com.oop.demo01;
    
    public class Student {
        //静态方法
        public static void eat(){
            System.out.println("kazikazi");
        }
        //非静态方法
        public void say(){
            System.out.println("hello");
        }
    }
    

    Demo01类

    package com.oop.demo01;
    
    public class Demo01 {
        public static void main(String[] args) {
            //调用静态方法可以直接调用
            Student.eat();
                     System.out.println("========================");
            //调用非静态方法时需要实例化对象 new
            //对象类型 对象名字 = new 对象值;
            Student student = new Student();
            student.say();
        }
    }
    

    运行结果

    image1

    可以知道,静态方法在main方法中调用可以直接调用,非静态方法则需要先实例化类(new一个对象)才能调用

  • 值传递

    package com.oop.demo01;
    
    public class Demo02 {
        public static void main(String[] args) {
            int a = 1;
            System.out.println(a);//1
            change(a);//实参
            System.out.println(a);//1
        }
        //返回值为空
        public static void change(int a){//形参
            a = 10;
        }
    }
    

    image2

    上述代码中a的值没有改变是因为实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参

    通俗来说就是:小明去餐厅看到别人桌子上的糯米鸡好吃,然后小明就叫服务员点了一份糯米鸡,小明吃完了,别人桌上的却不受影响,因为他们吃的不是同一份糯米鸡。

  • 引用传递

    package com.oop.demo01;
    
    public class Demo04 {
        public static void main(String[] args) {
            Person person = new Person();
            person.name = "高佬";
            System.out.println(person.name);
            Demo04.change(person);
            System.out.println(person.name);
        }
        public static void change(Person person){
            //person是一个对象,指向了一个对象
            person.name="志恒";
        }
    
    }
    class Person{
        String name;
    }
    

    image3

    实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参

对象的创建分析

对象的创建

  • 对象可以通过new关键字来创建,示例如下

    创建一个Student类

    package com.oop.demo02;
    //学生类
    public class Student {
        //属性
        String name;
        int age;
        //方法
        public void print(){
            System.out.println(this.name+"学生在学习");
        }
    }
    

    Test类

    package com.oop.demo02;
    //一个项目只能有一个main方法
    public class Test {
        public static void main(String[] args) {
            /* 类:抽象的,需要实例化
            *  类实例化之后会返回一个自己的对象
            *  student对象就是一个Student类的具体实例
            * */
            Student student1 = new Student();
            Student student2 = new Student();
    
            //给对象赋值
            student1.name = "小明";
            student1.age = 10;
    
            System.out.println(student1.name);
            System.out.println(student1.age);
    
            System.out.println(student2.name);
            System.out.println(student2.age);
    
        }
    }
    

    运行结果:

    image4

  • 使用new关键字创建的时候,除了分配空间之外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。

构造器

  • 构造器又叫构造方法,在进行创建对象的时候必须要调用的。并且构造器有一下两个特点:

    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void

    作用

    1. 使用new关键字,本质就是在调用构造器
    2. 初始化对象的值

    注意点

    1. 定义有参构造之后,如果想使用无参构造,就必须显示的定义一个无参的构造

    ait+Insert IDEA生成构造器的快捷键

  • 构造器代码示例:

    Person类:

    package com.oop.demo02;
    
    public class Person {
        //一个类即使什么都不写,它都会存在一个方法(构造器)
        //显示的定义构造器
        String name;
        int age;
        //无参构造
        public Person() {
        }
    
        //有参构造:一旦定义了有参构造,无参就必须显示定义
        public Person(String name,int age) {
            this.name = name;
            this.age = age;
        }
    }
    

    Test类:

    package com.oop.demo02;
    //一个项目只能有一个main方法
    public class Test {
        public static void main(String[] args) {
            //new 实例化一个对象
            Person person = new Person("minster",21);
    
            System.out.println(person.name+" "+person.age);
        }
    }
    

    image5

对象的内存分析

  • 首先先创建一个简单的Pet类

    package com.oop.demo02;
    
    public class Pet {
        String name;
        int age;
    
        public Pet() {
        }
    
        public Pet(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public void shout(){
            System.out.println(this.name+"在叫");
        }
    }
    

    Tset

    package com.oop.demo02;
    //一个项目只能有一个main方法
    public class Test {
        public static void main(String[] args) {
            //new 实例化一个对象
            Pet dog = new Pet("旺财",3);
            Pet cat = new Pet("cat", 3);
            dog.shout();
            cat.shout();
        }
    }
    

    内存分析图

    image6

    在内存中,创建一个对象,栈空间中存放的是对象的引用,而堆空间中存放的是new出来的东西,栈、堆两个空间通过一个内存地址相互连接。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy