面向对象(类与对象)

发布于:2024-07-27 ⋅ 阅读:(37) ⋅ 点赞:(0)

1.类与对象

1.1 什么是对象

对象:是一个一个实实在在的,具体的个体(实体)。比如:一个个人、一辆辆车、一本本书等等。

1.2 什么是类

类:一组具有相同特征的对象的抽象描述

如:

张三,510220199612013669,18256958568,158936587.... 代表一个对象

李四,510220199612013667,18256958575,158936787.... 代表一个对象

姓名、身份证号码、手机号码、qq号码..... 对应一个类

此时就可以将这些对象抽取相同的特征(属性)封装为一个类

public class Person {
    String name;//名称
    String idCard;//身份证
    String phone;//手机
    String qq;//qq号
}

通俗而言:类就相当于施工图,我们可以根据施工图来知道一栋楼每套房子具有那些功能区(共同的特质),进而造出楼房。

在Java中根据施工图创建对象的关键字是 new。

从代码编写的角度而言,必须先创建类,才能创建出对象。

1.3 什么是面向对象

面向对象是一种思想或编程方式。

面向对象的过程是以“对象”为中心。

Scanner input = new Scanner(System.in);//input就是一个Scanner类的对象

System.out.print("请输入姓名:");
String name = input.next();

System.out.print("请输入年龄:");
int age = input.nextInt();

input.close();

与面向对象对应的另一种编程思想:面向过程。它是以函数为中心,实现代码就是通过函数调用把过程串起来。(c语言是面向过程编程)

public class ArrayTools{
    public static int max(int[] arr){
        int max = arr[0];
        for(int i=1; i<arr.length; i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    
    public static void print(int[] arr){
        for(int i=0; i<arr.length; i++){
            System.out.print(arr[i] + "  ");
        }
        System.out.println();
    }
    
    public static void main(String[] args){
        int[] arr = {2,4,5,3,1};
        print(arr);
        int result = max(arr);
        System.out.println("最大值:" + result);
    }
}

这一段代码,如果抛开ArrayTools类的定义,那么3个函数是独立的,它们互相调用即可,这种方式就是面向过程的编程思想。

另外一个场景描述,来理解面向对象与面向过程的区别:

把大象装进冰箱的问题?

面向过程 面向对象
以步骤为中心,即以函数为中心 以类/对象为中心
(1)把冰箱门打开 (2)把大象装进去 (3)把冰箱门关上 (1)定义人这个类,包含pull,push功能,包含name属性 (2)定义冰箱这个类,包含open,close,save功能,包含size、brand等属性 (3)定义大象这个类,包含walk功能,包含weight属性 (4)定义测试类,包含main方法,在main方法中创建人、冰箱、大象的对象,调用对象的方法来完成

 1.4 如何定义类

语法格式:

【①修饰符】 ②class ③类名{
    ④类的成员
}

如:

public class Person{
    String name; //类的成员
}

 1.5 如何new对象

语法格式:

new 类名()

 如果没有用变量引用对象,这个对象是一个“匿名对象”。匿名对象都是一次性,无法反复使用

public class Test {
    public static void main(String[] args) {
        new Person();//创建了一个Person类的对象
        System.out.println(new Person());//创建一个Person类的对象,并且打印这个对象
        //com.yang.dto.Person@3b07d329
        System.out.println(new Person());//又创建一个Person类的对象,并且打印这个对象
        //com.yang.dto.Person@41629346
        //上述三个对象是匿名对象,都是独立的,无法重复使用的

    }
}

 如何用变量引用一个对象?

类名 对象名 = new 类名();

 对象名本质上也是一个变量,是一个引用数据类型的变量。

public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p);
        System.out.println(p);
        System.out.println(p);
        //p这个对象可以被反复使用
        /*
        这里的p是对象名,同时也变量名

        Java的数据类型:
        (1)基本数据类型:byte,short,int,long,float,double,char,boolean
           int a = 1;
        (2)引用数据类型:数组、类等
            int[] arr = new int[5];
            Person p = new Person();

            int[],Person是数据类型,从这个角度来说,arr, p也是变量。
            因为这种变量引用的是一个对象,所以这个变量称为引用数据类型的变量,也称为对象名。

         */
    }
}

2.类的成员之一:成员变量

2.1 如何定义成员变量

【修饰符】 class 类名{
    【①修饰符】 数据类型  成员变量名;
}

【】表示可选
public class Person {
    public static String star;//星球   成员变量,因为它有static修饰,它就是静态变量
    public String name;//名称          成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
    public String idCard;//身份证      成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
    public String phone;//手机        成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
    public String qq;//qq号          成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
}

成员变量的作用是描述事物的属性和数据特征。

2.2 如何使用成员变量

2.2.1 跨类使用成员变量

对象名.实例变量

类名.静态变量

虽然静态变量也可以通过 “对象.静态变量”的方式访问,但是我们更推荐“类名.静态变量”

2.2.1 本类使用成员变量

 2.3 成员变量的特点

  • 实例变量的值是每一个对象都是独立的

  • 静态变量的值是整个类共享的,无论是哪个对象,或类修改了它,那么都是统一修改的,因为它只有1份。

  • 成员变量有默认值

数据类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0
char \u0000 编码值为0的空字符
boolean false
引用数据类型 null

2.4 变量的内存分析图

又上图可知:

每一个对象实例都是独立的,都有各自的内存空间,放在堆中。

一个类的静态变量是共享的,只有一份内存空间,放在方法区中。

当Person类 被类加载器加载后,就会立刻在方法区中开辟一个空间存放静态变量。如果没有给静态变量赋值,那么就会赋上默认值。

当new对象的时候,就会在堆中开辟一个空间存放对象的实例变量(一个对象一个空间)

当方法被调用入栈时,就会在栈中开辟空间,存放局部变量

Person的过程:

① 类加载器

② 给Person的静态变量在方法区中分配空间

③  调用main方法,main方法入栈

(1)给Person.start变量赋值

(2)创建对象,p1在堆中开辟空间,存放p1的实例变量值(默认值) 

(3)创建对象,p2在堆中开辟空间,存放p2的实例变量值(默认值)    

(4)给p1.name   p2.name赋值

注意:因为main方法比较特殊,main方法执行完毕代表程序运行完毕,此时整个JVM虚拟机也会退出。

2.4 静态变量和实例变量对比

实例变量 静态变量
跨类访问方式 对象名.实例变量 类名.静态变量
它的值是共享的还是独立 每一个对象独立的 整个类共享的
是否有默认值
内存位置 方法区

 2.4 引用数据类型的成员变量

总结:

  • 所有引用数据类型的成员变量,默认值是null

  • 如果没有给引用数据类型的成员变量赋值对应的对象,那么通过它. 成员变量等都会发生 NullPointerException(空指针异常)

3 类的成员之二:成员方法

3.1 方法的分类

根据方法的修饰符是否有static修饰,分为:

3.1.1 静态方法

总结:

  • 本类调用:直接用

  • 跨类调用:类名.静态方法

3.1.2 非静态方法(实例方法)

总结:

  • 本类使用:直接使用

  • 跨类调用:对象名.实例方法

3.2 成员方法使用本类的成员变量

总结:本类的静态方法,不能直接使用 本类的实例变量 或 实例方法。

访问方式 是否允许
本类的静态方法 访问 本类的静态变量、静态方法 可以
本类的静态方法 访问 本类的实例变量、实例方法 ×
本类的实例方法 访问 本类的实例变量、实例方法 可以
本类的实例方法 访问 本类的静态变量、静态方法 可以

 。。。。。。。。。


网站公告

今日签到

点亮在社区的每一天
去签到