纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Java类和对象 带你用Java全面剖析类和对象

富春山居_ZYY   2021-09-13 我要评论
想了解带你用Java全面剖析类和对象的相关内容吗富春山居_ZYY在本文为您仔细讲解Java类和对象的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java类,Java对象下面大家一起来学习吧

一、面向过程?面向对象?

C 语言是一门过程语言在求解问题的时候关注的是过程因此 C 语言是面向过程的

JAVA 语言与之不同JAVA 语言是面向对象的语言在求解问题的时候将问题拆分成好几个对象对象与对象之间相互交互从而解决问题对象是 JAVA 语言的核心

用通俗的例子来解释这两者的区别就应该是这样的

想要吃一碗蛋炒饭如果是面向过程的话就应该是这样的

在这里插入图片描述

如果是面向对象的话就应该是这样的

在这里插入图片描述

过程:

我付钱厨子做蛋炒饭服务员将蛋炒饭端上来我吃蛋炒饭

整个过程是四个对象之间交互完成的对于我而言厨子具体炒蛋炒饭的步骤我并不需要知道这就是面向对象

在用 JAVA 进行设计开发时我们需要做的就是找到对象建立对象使用对象维护对象之间的关系

二、类和类的实例化

类实际上就是一类对象的统称相当于一个模板;对象其实就是对类实例化出来的结果相当于由模板产生的样本

一个模板可以产生多个样本一个类可以实例化出多个对象

在这里插入图片描述

在 JAVA 当中类是一个引用类型需要用到关键字 class 来申明一个类实际上就相当于创建一个新的数据类型

基本语法形式:

//创建一个类
class <类的名字> {
    field;//成员变量
    method;//成员方法
}
//实例化一个对象
<类的名字> <对象名> = new <类的名字>();

2.1普通成员变量和普通成员方法

代码示例:

class Person {
    public int age;
    public String name;//成员变量放在对象当中即堆上
    public void show() {
        //int a = 10;
        //a变量定义在方法中它不是成员变量是局部变量在栈上开辟内存
        System.out.println("姓名: " + name + " 年龄: " + age);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.age = 18;
        person1.name = "富春";
        person1.show();
        Person person2 = new Person();
        person2.age = 21;
        person2.name = "山居";
        person2.show();
    }
}

 代码结果:

在这里插入图片描述

代码解释:

  • 这里通过 class 这个关键字创建了 Person 这个类(类名通常用大驼峰即每个单词的首字母都为大写)
  • 像 age 和 name 这种定义在方法外部类内部的变量称之为 成员变量 或属性 或 字段 另外这两个变量皆为普通成员变量
  • 像 show 这种描述对象行为的叫做方法或行为这里通过 show 方法将姓名和年龄进行了打印另外该方法为普通成员方法
  • 在 JAVA中通过类的实例(对象)点号(.)来访问类的成员变量和成员方法格式为:对象名.成员变量; 对象名.成员方法(实参列表);(PS:在访问类的成员方法时如果类的方法有形参就必须为方法传递与参数类型相同的实参值)
  • 在 main 函数中实例化了两个对象为对象在堆上开辟了内存内存的地址存放在 person1 和 person2 中因此这两个变量实际上是引用变量其中的 new 关键字就是用于创建一个对象的实例

内存分布:

在这里插入图片描述

注意:

  • 当对象中的成员变量并没有赋初值时引用类型默认为 null 基本类型默认为 0 值boolean 类型默认为 false char 类型默认为 '\u0000'(其实就是啥也没有)
  • 当引用类型的变量为 null 时即表示不引用任何对象此时对 null 进行访问就会出现空指针异常
  • 如果不希望成员变量使用默认值时可以在创建类的时候为成员变量赋初始值但其意义不太大类终究是个模板创造的样本各种各样

代码示例:

class Person {
    public int age;
    public String name;
    public boolean ans;
    public char ch;
    public void show() {
        System.out.println("姓名: " + name + " 年龄: " + age);
        System.out.println("ans:" + ans + " ch:" + ch);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}

🏸 代码结果:

在这里插入图片描述

2.2 静态成员变量和静态成员方法

代码示例:

class Person {
    public int age;
    public static int count;
    public static final int COUNT = 99;
    //COUNT 是静态常量
    public static void staticTest() {
        System.out.println("这是静态成员方法");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.age = 18;
        Person.count = 20;
        System.out.println(person1.age + " " + Person.count);
        Person.staticTest();
    }
}

代码结果:

在这里插入图片描述

代码解释:

  • 用 static 关键字修饰的成员变量叫做静态成员变量修饰的成员方法叫做静态成员方法
  • 普通成员变量或普通成员方法的访问需要实例化一个对象通过引用进行访问但是静态成员变量或静态成员方法无需创建实例对象直接通过类名进行访问格式为:类名.成员变量; 类名.成员方法(实参列表);
  • 静态成员变量或方法被同一个类的不同实例所共用且不属于对象它们被存放在方法区只存在一份

内存分布:

在这里插入图片描述

注意:

  • 静态方法是不能直接使用非静态成员变量或非静态方法因为后两者都和实例相关如果需要使用的话需要实例化对象而静态方法和实例无关和类相关因此不能直接调用这也就是为什么在 main 函数中调用其他方法被调用的方法最好是静态方法的原因
  • 那么 main 函数为何非得是静态的呢?不是静态的又会如何?
  • 假设 main 函数不是静态的函数那么想要调用 main 函数必须要进入 main 函数中实例化对象通过引用去调用 main 函数但问题就在于 main 函数压根就没有被调用又如何进入到 main 函数当中呢?这就形成了一个逻辑死循环唯一的解法就在于将 main 函数设置为静态的通过 Java 虚拟机去调用它

三、封装

在面向对象编程中封装是将对象运行所需的资源封装在程序对象中——基本上是方法和数据对象是“公布其接口”其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象这个概念就是“不要告诉我你是怎么做的只要做就可以了”

3.1 private

属性和方法都有自身的访问权限private/ public 这两个关键字表示 “访问权限控制”

public: public 表明该数据成员、成员函数是对所有用户开放的所有用户都可以直接进行调用
private: private 表示私有私有的意思就是除了class自己之外任何人都不可以直接使用

在本章第一段代码示例中成员变量 age 和 name 分别被 public 所修饰就可能出现以下的问题:

类的使用者必须要了解 Person 类内部的实现, 才能够使用这个类. 学习成本较高如果 Person 这个类的实现者修改了成员变量的名字类的使用者就需要将自己的代码随之更改如果项目的规模较大就会导致维护的成本过高

每个成员变量或方法的访问权限是需要依据具体的情况仔细斟酌而不应当随意的设置为 public

在这样的思考下private 关键字显得尤为重要被其修饰的属性类的使用者是不能够直接使用的(根本没有访问到)需要借助接下介绍的 getter 和 setter 方法这样就可以不用对类里面的实现细节进行知晓

3.2 getter 和 setter

当用 private 来修饰字段的时候如果需要获取或者修改这个 private 属性就需要使用 getter 和 setter 方法

代码示例:

class Person {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int myAge) {
        age = myAge;
    }
    public void setName(String myMame) {
        name = myMame;
    }
    public String getName() {
        return name;
    }
    public void show() {
        System.out.println("姓名: " + name + " 年龄: " + age);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setAge(18);
        person1.setName("富春");
        int age = person1.getAge();
        String name = person1.getName();
        System.out.println(name + " " + age);
        person1.show();
    }
}

代码结果:

在这里插入图片描述

代码解释:

getName 和 getAge 即为 getter 方法, 表示获取这个成员的值

setName 和 setAge 即为 setter 方法, 表示设置这个成员的值

四、构造方法

实例化对象时分两步:

1为对象分配内存空间

2.调用对象的构造方法(构造方法不止一种)

构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用,不仅可以构造对象也可以帮助我们对成员变量进行初始化

4.1 基本语法

规则:

方法名和类名是相同的并且没有返回值

在类中没有提供任何的构造函数的情况下编译器会默认生成一个不带有参数的构造函数

如果类中定义了构造方法就不会默认生成无参的构造方法

构造方法支持重载规则和普通方法的重载一致

代码示例:

class Person {
    private int age;
    private String name;
    public Person() {
        System.out.println("不带参数的构造方法");
    }
    public Person(String name) {
        this.name = name;
        System.out.println("带一个参数的构造方法");
    }
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("带两个参数的构造方法");
    }
    public void show() {
        System.out.println("姓名: " + this.name + " 年龄: " + this.age);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.show();
        Person person2 = new Person("富春");
        person2.show();
        Person person3 = new Person("山居",18);
        person3.show();
    }
}

代码结果:

在这里插入图片描述

4.2 this 关键字

在此之前的代码中出现了很多的 this 关键字那么该关键字代表什么呢?

该关键字在对象被构造的过程中被使用对象还未构造完因此它并不代表当前对象this 关键字代表着当前对象的引用

可以借助 this 关键字来访问对象的成员变量和成员方法也可以通过它来调用其他的构造方法

方法:

  • this . 成员变量
  • this . 成员方法
  • this ( )

注意:

用 this 关键字调用其他的构造方法时一定要放在第一行静态方法里不允许出现 this 关键字因为该关键字代表着当前对象的引用而静态的方法是不依赖于对象的

代码示例:

class Person {
    private int age;
    private String name;
    public Person() {
        this("富春",18);//调用其他的构造方法
        System.out.println("不带参数的构造方法");
    }
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("带两个参数的构造方法");
    }
    public void show() {
        System.out.println("姓名: " + this.name + " 年龄: " + this.age);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.show();
    }
}

代码结果:

在这里插入图片描述

加 this 关键字是一个良好的代码习惯

五、代码块

Java 中用大括号 { } 将多行代码括起来并形成一个独立的代码区间的代码形式称为代码块它是 Java 中常见的代码形式

根据代码块定义的位置以及关键字又可分为以下四种:普通代码块、构造代码块、静态代码块、同步代码块

接下来主要向大家介绍前三种最后一种讲解多线程部分时在涉及一下

5.1 普通代码块

它是最常见的代码块是类中方法的方法体或在方法名后面

代码示例:

public class TestDemo {
    public static void main(String[] args) {
        int a = 10;
        {
            int b = 20;
            System.out.println(b);
        }
        System.out.println(a);
    }
}

代码解释:

在这里main 方法后面跟着的 { } 所包裹的内容是一个普通代码块将定义变量 b 并且打印它的代码包裹起来的 { } 中的内容也是一个普通代码块

5.2 构造代码块

定义在类中的不加修饰符的代码块叫构造代码块也叫实例代码块构造代码块一般用于初始化实例成员变量

代码示例:

class Person {
    private int age;
    private String name;
    {
        this.name = "山居";
        this.age = 18;
    }
    public void show() {
        System.out.println("姓名: " + this.name + " 年龄: " + this.age);
    }
}

5.3 静态代码块

使用 static定义的代码块一般用于初始化静态成员属性和需要提前准备的一些数据

代码示例:

class Person {
    private int age;
    private String name;
    public static int count;
    static {
        count = 20;
    }
    public void show() {
        System.out.println("姓名: " + this.name + " 年龄: " + this.age);
    }
}

5.4 注意事项

构造代码块优先于构造函数执行静态代码块优先于构造代码块执行且对于同一个类来说只执行一次当代码块和成员变量同为静态的或同为实例的时候其值和定义的顺序是有关系的

六、快捷方法

6.1 toString方法

在本章第一段代码示例中类里面通过 show 方法将对象的属性进行打印但当属性很多时就显得不那么方便因此可以用快捷键

步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行)

步骤二:选择 toString()

步骤三:选择需要打印的属性

步骤四:选择 OK

在这里插入图片描述

代码示例:

class Person {
    public int age;
    public String name;
    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.age = 18;
        person1.name = "富春";
        System.out.println(person1);
    }
}

代码结果:

在这里插入图片描述

代码解释:

@Override 是注解用于解释该方法是重写的方法未重写 toString 方法时打印 person1将会是一个地址
当重写 toString 方法时打印 person1将会直接调用 toString 方法

6.2 setter / getter 方法

setter / getter 方法也可以使用快捷键自动生成

步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行)

步骤二:选择 Getter and Setter

步骤三:选择需要该方法的属性

步骤四:选择 OK

在这里插入图片描述

代码示例:

class Person {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
        //age = age;错误
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("姓名: " + name + " 年龄: " + age);
    }
}

代码解释:

自动生成的 setter 方法形参名字和类中的成员属性的名字一样的时候如果不使用 this , 相当于自赋值this 表示当前对象的引用

6.3 构造方法(快捷)

当想要快速生成参数个数不同的构造方法时也有快捷键

步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行)

步骤二:选择 Constructor

步骤三:选择需要该方法的属性

步骤四:选择 OK(无参的话跳过步骤三直接选择 Select None)

在这里插入图片描述

代码示例:

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

总结

本篇文章就到里了希望能够给你带来帮助也希望您能够多多关注的更多内容!


相关文章

猜您喜欢

  • Mybatis一对多和多对一处理 Mybatis一对多和多对一处理的深入讲解

    想了解Mybatis一对多和多对一处理的深入讲解的相关内容吗iiis1327在本文为您仔细讲解Mybatis一对多和多对一处理的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Mybatis一对多处理,mybatis一对多和多对一配置,mybatis一对多关联查询下面大家一起来学习吧..
  • Python扩展模块加速方案 解析Python扩展模块的加速方案

    想了解解析Python扩展模块的加速方案的相关内容吗燕山588在本文为您仔细讲解Python扩展模块加速方案的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python扩展模块加速,Python扩展模块,Python加速下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式