类和面向对象

简介: 类和面向对象

类和面向对象

文章目录

一、面向对象

1、什么是面向对象

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

cecd3e68ad0d1a449a1d864328938ac3.png

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;
}

068361f7d82b9722597d83ea20bd7fd7.png

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();
    }
}
  1. 当用户未显示定义,编译器会生成一份无参的默认构造方法(一旦用户定义,编译器则不再生成)
  2. 构造方法中可以通过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. 初始化所分配的空间

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

数据类型 默认值
byte 0
char ‘/0000’
short 0
int 0
long 0L
boolean false
float 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="黑";
}

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

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="黑";
}

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

目录
相关文章
|
4月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
35 0
|
6月前
|
C++
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
|
6月前
|
Python 容器
面向对象详解,面向对象的三大特征:封装、继承、多态-2
面向对象详解,面向对象的三大特征:封装、继承、多态
|
6月前
|
Python
面向对象详解,面向对象的三大特征:封装、继承、多态-1
面向对象详解,面向对象的三大特征:封装、继承、多态
|
存储 算法 Java
面向对象编程实践:类、对象与继承
面向对象编程实践:类、对象与继承
65 0
面向对象的封装,继承,多态(一)
面向对象的封装,继承,多态。
83 0
面向对象的封装,继承,多态(一)
|
SQL 安全 数据库
对面向对象继承的一些思考
本文浅谈对面向对象继承的一些思考
135 0
对面向对象继承的一些思考
下一篇
DataWorks