类和面向对象

类和面向对象

一、面向对象

1、什么是面向对象

​ 面向对象(Object Oriented Program,简称OOP)是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。Java是一门纯面向对象的语言。用面向对象的思想来涉及程序,更符合人们对事物的认知,对大型程序的设计、扩展以及维护都非常友好。

面向对象

2、面向过程与面向对象

什么是面向过程

​ 面向过程(Procedure-Oriendented Program,简称POP)是一种编程模型,由一系列要执行的计算步骤组成,通常采用自上而下、顺序执行的方式。编程时把解决问题的步骤分析出来,然后利用函数逐步实现,在一步一步的具体步骤中再按顺序调用函数。

面向过程常见的编程语言:C、Basic等。

比如说在C语言学习中的三子棋游戏:

第一步 初始化棋盘

第二步 玩家下棋

第三步 电脑下棋

第四步 判断

第五步 退出游戏

面向过程注重的是过程,但是代码的扩展和维护比较麻烦

而面向对象以"对象"为中心思想,把要解决的问题分成各个对象,建立对想的目的不是通过对象完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

3、面向对象的特征

面向对象三大特征:封装、继承、多态。而类和对象阶段主要研究封装。

二、类的定义和使用

1、什么是类

简单来说类就是对一个对象的描述,主要包括对象的属性和对象的行为(方法)

2、类的定义

//创建一个类
class TestClass{
	field;//字段(属性) 或者 成员变量
    method;//行为 或者 成员方法
}

class为定义类的关键字,TestClass为类名,{}中的为类的主体。。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类
具有哪些功能,称为类的成员方法

例如定义一个狗类

public class Dog{
    //狗的属性
    public String Name;
    public String Gender;
    public int age;
    public String Color;
    //狗的行为
    public void eat(){
        System.out.println(name+"吃狗粮~~~");
    }
    public void sleep(){
        System.out.println(name+"在睡觉~~~");
    }
    public void braks(){
        System.out.println(name+"汪汪汪~~~");
    }
}

注意

  • 类名采用大驼峰定义
  • 一般一个文件当中只定义一个类
  • main方法所在的类一般要使用public修饰
  • public修饰的类必须和文件名相同

3、类的实例化

首先什么类的实例化

当我们定义了一个类时,就相当于在计算机中定义了一种新的类型(好比在C语言中创建了一个结构体),与int,double类型类似。

用类 类型创建对象的过程,称为类的实例化,在Java中通过采用new关键字,配合类名来实例化对象。

public static void main(String[] args) {
    Dog d=new Dog();
    //访问属性
    d.Name="小黑";
    d.Gender="母";
    d.age=3;
    d.Color="黑";
    //访问方法
    d.eat();
    d.sleep();
    d.barks();    
}
//输出结果
//    小黑吃狗粮~~~
//    小黑在睡觉~~~
//    小黑汪汪汪~~~

注意

  • new关键字用于创建一个对象的实例

  • 使用 . 来访问类的属性和方法

  • 同一个类可以创建多个实例

4、类和对象

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类的成员.
  2. 类是一种自定义类型,可以用来定义变量.
  3. 一个类可以实例化多个对象.
  4. 类实例化出的对象好比现实中使用建筑设计图建造出的房子,类就好比设计图.

三、this引用

1、为什么要用this引用

public class Dog{
    //狗的属性
    public String Name;
    public String Gender;
    public int age;
    public String Color;
    public void setDog(String N, String G, int a, String c){
        Name=N;
        Gender=G;
        age=a;
        Color=c;
    }
}    

通过调用setDong方法对对象进行设置。那如果是下面代码时编译器该如何处理

public void setDog(String Name, String Gender, int age, String color){
    Name=Name;
    Gender=Gender;
    age=age;
    Color=color;
}

那函数体中到底是谁给谁赋值?这就需要用this引用来解决。

2、什么是this引用

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针

在成员方法中所有成员变量的操作,都是通过this引用去访问。只不过用户不需要来传递,编译器自动完成。

因此上面的setDog方法可以修改为

public void setDog(String N, String g, int a, String c){
    this.Name=Name;
    this.Gender=Gender;
    this.age=age;
    this.Color=color;
}

image-20220824230757082

3、this引用的特征

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在非静态成员方法中使用
  3. this引用的指向不能修改
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
    对象的引用传递给该成员方法,this负责来接收,编译器编译之后将"成员方法"的隐藏的this还原。

四、对象的构造及初始化

1、构造方法

a、概念

构造方法(也称构造器)是一种特殊的构造方法,,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

b、特性
  1. 名字必须与类名相同

  2. 没有返回值,设置成void也不行

  3. 由编译器自动调用,且在整个对象的生命周期内只调用一次。

  4. 构造方法可以重载

    public class Dog {
        public String name;
        public String gender;
        public int age;
        public String color;
        //无参构造方法
        public Dog(){
            this.name = "小黑";
            this.gender = "母";
            this.age = 3;
            this.color = "黑";
        }
       //带参数的构造方法
        public Dog(String name, String gender, int age, String color) {
            this.name = name;
            this.gender = gender;
            this.age = age;
            this.color = color;
        }
        public void printDog(){
            System.out.println(this.name +" "+this.gender+" "+this.age+" "+this.color);
        }
        public static void main(String[] args) {
            Dog Dog=new Dog();
            Dog Dog1=new Dog("小七","公",2 ,"金黄色");
            Dog.printDog();
        }
    }
    
  5. 当用户未显示定义,编译器会生成一份无参的默认构造方法(一旦用户定义,编译器则不再生成)

  6. 构造方法中可以通过this调用其他构造方法来简化代码

    public class Dog {
        public String name;
        public String gender;
        public int age;
        public String color;
        //无参构造方法
        public Dog(){
            this("小黑","母",3,"黑");
            //this.name = "小黑";
            //this.gender = "母";
            //this.age = 3;
            //this.color = "黑";
        }
       //带参数的构造方法
        public Dog(String name, String gender, int age, String color) {
            this.name = name;
            this.gender = gender;
            this.age = age;
            this.color = color;
        }
        public void printDog(){
            System.out.println(this.name +" "+this.gender+" "+this.age+" "+this.color);
        }
        public static void main(String[] args) {
            Dog Dog=new Dog();
            Dog Dog1=new Dog("小七","公",2 ,"金黄色");
            Dog.printDog();
        }
    }
    

    注意:

    • this(……)引用必须放在第一句

    • 不能形成环

       public Dog() {
              this("小黑", "母", 3, "黑");
          }
      
          public Dog(String name, String gender, int age, String color) {
              this();
          }
      //报错:构造方法被递调用
      

2、默认初始化

当我们在定义局部变量时必须要对局部变量进行初始化,而成员变量可以不用初始化,这是为什么呢?

在new对象时,JVM层面会做好多事情

  1. 检测对象对应的类是否加载

  2. 为对象分配空间

  3. 处理并发安全问题

    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

  4. 初始化所分配的空间

    即:对象空间申请好后,对象中成员也设置好了初始值

    数据类型默认值
    byte0
    char‘/0000’
    short0
    int0
    long0L
    booleanfalse
    float0.0f
    double0.0
    引用类型null
  5. 设置对象头信息

  6. 调用构造方法,给对象中的成员赋值

3、就地初始化

在声明成员变量时,就直接给了初始值。

public class Dog {
    public String name="小黑";
    public String gender="母";
    public int age=3;
    public String color="黑";
}

代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

oat | 0.0f |
| double | 0.0 |
| 引用类型 | null |

  1. 设置对象头信息

  2. 调用构造方法,给对象中的成员赋值

3、就地初始化

在声明成员变量时,就直接给了初始值。

public class Dog {
    public String name="小黑";
    public String gender="母";
    public int age=3;
    public String color="黑";
}

代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小 王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值