六、面向对象基础

六、面向对象基础,第1张

一、类和对象 1、什么是面向对象
  • 面向对象和面向过程的思想对比
    • 面向过程编程(Procedure Oriented Programming)

      • 是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
    • 面向对象编程(Object Oriented Programming)

      • 是一种以对象为中心的编程思想,通过指挥对象实现具体的功能

对象:指客观存在的事物(万物皆对象)

小结:

  1. 客观存在的任何一种事物,都可以看做程序中的对象
  2. 使用面向对象思想可以将复杂的问题简单化
  3. 将我们从执行者的位置,变成了指挥者

2、什么是类
  • 类是对现实生活中一类具有共同属性和行为的事物的抽象

类是对事物,也就是对象的一种描述,可以将类理解为一张设计图,根据设计图,可以创建出具体存在的事物。即根据类去创建对象

  • 类的组成

    • 属性:该事物的各种特征
    • 行为:该事物存在的功能(能够做的事情)
  • 小结:类和对象的关系

    • 类是现实生活中一类具有共同属性和行为的事物的抽象
    • 对象是能够看得到模的着的真实存在的实体
    • 类是对象的描述,对象是类的实体

3、类的定义
  • 属性:在代码中通过成员变量来体现(类中方法外的变量)

  • 行为:在代码中通过成员方法来体现(和前一章的方法相比去掉static关键字即可,原因参看下一篇博客中的static)

  • 类的定义步骤:

    1. 定义类
    2. 编写类的成员变量
    3. 编写类的成员方法
/*
    public class 类名{
        // 成员变量
        变量1的数据类型 变量1;
        变量2的数据类型 变量2;
        ...
        // 成员方法
        方法一;
        方法二;
        ...
    }
*/

4、对象的使用
  • 创建对象
    • 格式:类名 对象名 = new 类名();
  • 使用对象
    • 使用成员变量格式:对象名.变量名
    • 使用成员方法格式:对象名.方法名()

例:

// 定义了一个学生类
public class Student {
    String name;
    int age;

    public void study(){
        System.out.println("学习");
    }

}
public class StudentTest {
    public static void main(String[] args) {
        Student stu = new Student();
        // 默认初始值
        System.out.println(stu.age);  // 0
        System.out.println(stu.name);  // null
        // 调用方法
        stu.study();

        // 对属性赋值
        stu.name = "张三";
        stu.age = 20;

        System.out.println(stu.age);  // 20
        System.out.println(stu.name);  // 张三
        
        System.out.println(stu);
        // com.xu.oop.Student@1540e19d
        // com.xu.oop.Student:全类目(包名 + 类名)
        // @1540e19d  :  @分隔符 + 16进制内存地址
    }
    
}
二、对象内存图 1、栈和堆的介绍
  • 这里我们主要观察栈(虚拟机栈)和堆

栈:所有局部变量都会在栈内存中创建

  • 局部变量:定义在方法中的变量或方法声明上的变量
  • 方法执行都会加载到栈中进行
  • 局部变量的特点:随着方法的调用而存在,随着方法的调用完毕而消失

堆:所有对象及其对应的示例变量和数组都将存储在此处

  • 简单理解为:new出来的东西,都存储在堆内存
  • 每一个new出来的东西都有一个地址值,使用完毕后,会在垃圾回收器空闲时被回收
  • 实例变量(成员变量)有初始化值:
    • 基本数据类型:整数0,浮点数0.0,布尔false,字符空字符
    • 引用数据类型null

2、单个对象的内存图


3、两个对象的内存图

注:多个对象使用的是同一份字节码文件和成员方法


4、两个引用指向同一对象内存图

注:当stu1赋值为null时,stu1指向的堆内存连接断开,再调用会出现空指针异常

当stu2也赋值为空时,堆内存中的那块空间没有引用,会被系统的垃圾回收机制自动清除

  • 垃圾回收(以后JVM部分会再细讲)

当堆内存中,对象或数组产生的地址,通过任何方式都不能被找到后,就会判定为内存中的垃圾

垃圾会被java垃圾回收器,空闲的时候自动进行清理

三、成员变量和局部变量 1、什么是成员变量和局部变量
  • 成员变量:类中方法外的变量
  • 局部变量:方法中的变量
public class Student {
    String name;  // 成员变量
    
    public void study() {
        int i = 0;  // 局部变量
        System.out.println("study....");
    }
    
    public void doHomework(){
        System.out.println("do homework...");
        int j = 0;  // 局部变量
    }
    
    int age;  // 成员变量(不建议这么写)
    
}

2、两者的区别
区别成员变量局部变量
类中位置不同类中方法外方法内或方法声明上(形参)
内存中位置不同堆内存栈内存
生命周期不同随着对象的存在而存在,随着对象的消失而消失随着方法的调用而存在,随着方法调用完毕而消失
初始化值不同有默认的初始化值没有默认的初始化值,必须先定义,赋值后才能使用
四、封装 1、private关键字
  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问

针对private修饰的成员变量,如果需要被其他类使用,提供相应的 *** 作

  • 提供get变量名()方法,用于获取成员变量的值,用public修饰
  • 提供set变量名(参数)方法,用于设置成员变量的值,用public修饰

2、private关键字的使用

一个标准类的编写:

  • 把成员变量用private修饰
  • 提供对应的setXxx()/getXxx()方法
// 定义一个学生类
public class Student {
    // 将成员变量定义为私有
    private String name;
    private int age;
    
	// 提供外部接口
    public void setName(String n){
        name = n;
    }
    public void setAge(int a){
        age = a;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setAge(23);
        stu.setName("张三");

        System.out.println(stu.getAge());
        System.out.println(stu.getName());
    }
}

3、this关键字
  • 局部变量和成员变量如果重名,Java使用的是就近原则

  • this关键字的作用:可以调用本来的成员(变量,方法)

    • 解决局部变量和成员变量的重名问题
    • this限定的变量用于指代成员变量
    • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
  • this:代表所在类的对象的引用

    • 方法被那个对象调用,this就代表哪个对象
public class Student {
    private String name;
    private int age;

    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    // 打印this的内存地址
    public void printThis(){
        System.out.println(this);
    }
}
public class StudentTest2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        // 打印s1对象的内存地址
        System.out.println(s1);
        // 打印s1对象的this的内存地址
        s1.printThis();
        
		// 打印s2对象的内存地址
        System.out.println(s2);
        // 打印s2对象的this的内存地址
        s2.printThis();
        
    }
}

注:那个对象调用了this,this就保存了哪个对象的内存地址


4、封装
  • 面向对象三大特征之一(封装,继承,多态)
  • 隐藏内部的实现细节,仅对外暴露公共的访问方式
  • 封装常见的体现:
    • 私有成员变量,提供setXxx和getXxx方法
    • 将代码抽取到方法中,这是对代码的一种封装
    • 将属性抽取到类当中,这是对数据的一种封装
  • 封装的好处:
    • 通过方法来控制成员变量的 *** 作,提高了代码的安全性
    • 把代码用方法进行封装,提高了代码的复用性
五、构造方法和JavaBean 1、构造方法概述
  • 构造、创造对象的时候,所调用的方法

  • 格式:权限修饰符 类名(参数){}

    1. 方法名与类名相同,大小写也要一致

    2. 没有返回值类型,连void都没有

    3. 没有具体的返回值(不能由return带回结果数据)

  • 执行时机:

    1. 创建对象的时候调用,每创建(new)一次对象,就会执行一次构造方法
    2. 不能手动调用构造方法
public class Student {
    String name;
    int age;

    // 构造方法
    public Student() {
        System.out.println("无参构造方法....");
    }
    
}
public class StudentTest {
    public static void main(String[] args) {
        Student stu1 = new Student();  // 打印:无参构造方法....
    }
}
  • 构造方法作用

    • 用于给对象的数据(属性)进行初始化
  • 注意事项

    • 如果没有定义构造方法,系统将给出一个默认的无参数的构造方法
    • 如果定义了构造方法,系统将不再提供默认的构造方法
    • 如果自定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法
    • 建议无论是否使用,都手动书写无参构造方法和带参构造方法
2、JavaBean
  • 就是一个Java中的类,其对象可以用于在程序中封装数据
    • 举例:学生类,手机类

标准JavaBean必须满足如下要求:

  • 成员变量使用private修饰
  • 提供每一种成员变量对应的setXxx()和getXxx()
  • 提供一个无参构造方法

后续经常会用到JavaBean这个概念,务必牢记

快捷键:Alt + [fn] + Insert

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/729531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存