21初识面向对象,类与对象

Java面向对象编程01——初识面向对象,类与对象

面向对象&面向对象

  • 面向过程

    • 线性过程
  • 面向对象

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

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

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

什么是面向对象

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

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

  • 抽象:设计学生管理系统,只关注学生的学号等共同点(抽“像”)

  • 三大特性:

    • 封装:把数据包装起来
    • 继承:父类和子类
    • 多态:同一种事物,有不同的状态
  • 认识论角度考虑是先有对象(人)后有类(共同点)。对象,是具体的事物。类,是抽象的,是对对象的抽象

  • 代码运行角度考虑是先有类后有对象。类是对象的模板(先去设计)

类与对象的关系

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

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用
  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:
    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void
  • 构造器必须要掌握
  • 其他注意:
    • 使用new关键字,本质是在调用构造器,必须要有构造器,初始化对象的值
    • 有参构造:一旦定义了有参构造,无参就必须显示定义,否则就无效
    • 如果默认构造了有参构造,无参构造就直接空着就好
    • alt+insert 可以生成构造器

(1)创建Student类

package com.oop.demo02;
//类用来组织代码
//学生类
public class Student {
    //属性:字段
    String name;
    int age;

    //方法
    public void study(){
        System.out.println(this.name+"在学习");
    }
}

创建main方法,调用类用对象封装数据

package com.oop.demo02;
//对象封装某个具体的数据
//一个项目应该只存在一个main方法
public class Application {
    public static void main(String[] args) {
        //类:抽象的,实例化
        //类实例化以后会返回一个自己的对象!
        //student 的对象就是一个Student类的具体实例
        Student xm=new Student();
        Student xh=new Student();
        xm.name="小明";
        xm.age=21;
        System.out.println(xm.name);
        System.out.println(xm.age);
        xh.name="小红";
        xh.age=21;
        System.out.println(xh.name);
        System.out.println(xh.age);
    }
}

程序运行结果:

image-20220313161923691

(2)构造器代码

定义一个Person类

package com.oop.demo02;
//java --->class
public class Person {
    //一个类即使什么都不写,他也会存在一个方法
    //显示的定义构造器
    String name;
    int age;
    //实例初始值
    //构造器的作用
    //1.使用new关键字,本质是在调用构造器,必须要有构造器
    //如果默认构造了有参构造,无参构造就直接空着就好
    //2.构造器用来初始化值
    //默认构造器
    public Person(){}
    //重载
    //有参构造:一旦定义了有参构造,无参就必须显示定义,否则就无效
    public Person(String name){
        this.name=name;
        //String name是指参数,this.name指上面的类
    }
    //alt+insert 可以生成构造器

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

main函数代码

 public static void main(String[] args) {
        //new 实例化的一个对象
        Person person = new Person("xiaohao");
        System.out.println(person.name);
        Person xh = new Person("xiaohao",18);
        System.out.println("\t姓名:"+xh.name+"\n\t年龄:"+xh.age);
    }

程序运行结果:

image-20220313165819926

创建对象内存分析

  • 创建一个Pet类

image-20220314160233831

  • 在主函数中调用Pet类,并调试观察在内存中的流程

image-20220314160333578

  • 可以得到以下内存分析图:

image-20220314160409149

注意:

  • 栈只保存变量名以及main函数,且main函数在栈的底部,当main函数也弹出时,程序运行结束
  • 引用变量名指向堆中创建的新对象,两个对象的内存地址不同
  • 方法区中,静态方法区与类一同加载,所以所有的对象除了可以调用类中的方法外,均可以直接调用静态方法区中的方法

简单小结类与对象

  1. 类与对象

    • 类是一个模板,抽象;对象是一个具体的实例
  2. 方法

    • 定义,调用
  3. 对应的引用

    • 引用类型:基本类型(8)
    • 对象通过引用来操作的:栈——>堆(地址)
  4. 属性:字段Field 成员变量

    • 默认初始化
      • 数字:0 0.0
      • char:u0000
      • boolean:false
      • 引用:null
    • 修饰符 属性类型 属性名 =属性值 !
  5. 对象的创建和使用

    • 必须使用new关键字创建对象,构造器 Person xiaohao=new Person();
    • 对象的属性 xiaohao.name
    • 对象的方法 xiaohao.sleep()
    • 静态(类)的属性 属性 静态属性最好用类名来调用 不要用实例化的对象来调用

    image-20220407111530519

    • 静态(类)方法是不能直接访问非静态(对象)成员的(类怎么可能直接调用对象的东西!!!)
    • 静态方法中不允许使用this或是super关键字。this是调用本类的方法和属性,super是调用父类的方法和属性,他们访问的都是非静态的,你就记住:静态的只能访问静态的东西!!
    • 静态方法可以继承,不能重写,没有多态
    • 动态的行为 方法
posted @ 2023-08-18 15:59  努力学技术的小豪  阅读(37)  评论(0)    收藏  举报