Day03 类与对象

Day03 类与对象

面向过程:C,面对一个问题的解决方案,不会做出重用的设计

面向对象:C++,Java,模块化设计,方便重用,考虑某个问题的标准设计,根据标准进行拼装

  • 封装性:内部操作对外部不可见,内部的操作都不可直接使用时才是安全的
  • 继承性:在已有结构的基础上继续进行功能的扩充
  • 多态性:在继承性的基础上对类型的转换处理

面向对象开发的三个步骤:

  • OOA:面向对象分析
  • OOD:面向对象设计
  • OOP:面向对象编程

1. 类与对象

类是对某一类事物共性的抽象概念,对象描述的是具体的产物

类由两部分组成:

  • 成员属性:属性Field
  • 操作方法:方法Method

定义和使用

实际开发中一个文件只有一个class

通过调用对象来使用类

  • 声明并实例化对象:类名称 对象名称 = new 类名称()
  • 分步骤:
    1. 声明对象:类名称 对象名称 = null
    2. 实例化对象:对象名称 = new 类名称()

调用方法:

  • 调用属性:实例化对象.属性
  • 调用方法:实例化对象.方法(),方法可以传递任意数据类型(基本数据类型、引用数据类型)
  • 不进行属性赋值则为默认值(无default则为数据类型的默认值)
class Person {
    String name ;
    int age ;
    public void tell() {
        System.out.println("姓名:" + name + "年龄:" + age) ;
    }
}

public class day03 {
    public static void main(String [] args){
        Person zhou = new Person() ; // 声明并实例化
        Person zhou = null ; // 分步骤
        zhou = new Person() ; // 分步骤
        
        zhou.name = "小明" ;
        zhou.age = 18 ;
        zhou.tell()
    }
}

对象内存分析

最常用的内存空间:

  • 堆内存:保存对象的具体信息,堆内存空间的开辟通过 new 完成
  • 栈内存:保存堆内存的地址,地址 --> 堆内存 --> 对象

在这里插入图片描述

上例中声明并实例化的内存分析
在这里插入图片描述

分步进行的内存分析:

在这里插入图片描述

注意:对象在调用类的属性或方法时必须先实例化,否则出现 NullPointerException 异常


2. 引用传递分析

类属于引用数据类型,内存的引用传递:同一块堆内存可以被不同的栈内存指向,也可以更换指向

  • 引用传递时多个实例指向同一块堆内存,任一改变堆内存中属性的操作对所有实例有效
Person zhou = new Person() ; // 声明并实例化
Person yuan = zhou ;
zhou.name = "小明" ;
 zhou.age = 18 ;
yuan.name = "小红" ;
yuan.age = 16 ;
yuan.tell() ;
zhou.tell() ;

[out] 
姓名:小红
年龄:16
姓名:小红
年龄:16

引用与垃圾产生分析

垃圾空间:一个栈内存只能保存一个堆内存的地址,一旦断开则该堆内存无法再被引用,变成没有栈内存指向的堆内存空间,变成了垃圾。所有的垃圾将被GC(garbage collection)回收并释放,但过多的垃圾在回收前会影响性能。


3. 成员属性封装

类中的方法对外提供服务,不需要封装

属性为了安全性需要封装进行保护,默认情况下可以在类外部修改属性,但是修改的数据可能有问题,用private封装后,外部不能访问属性

类中所有属性都要用private封装,对需要访问的属性提供如下要求:

  • setter,getter:设置 setXXX,getXXX 提供更改和获取属性的方法
    • public void setName(String n)
    • public String getName()
private String name ;
private int age ;

[out] java: name 在 Person 中是 private 访问控制
class Person {
    private String name ;
    private int age ;
    public void tell() {
        System.out.println("姓名:" + name + "\n年龄:" + age) ;
    }
    public void setName(String n){
        name = n;
    }
    public String getName(){
        return name;
    }
    public void setAge(int n){
        age = n;
    }
    public int getAge(){
        return age;
    }
}

public class day03 {
    public static void main(String [] args){
        Person zhou = new Person() ; 
        zhou.setName("小明");
        zhou.setAge(18);
        zhou.tell() ;
        System.out.println(zhou.getAge());
    }
}

构造方法

使用类的步骤:

  • 声明并实例化
  • setter和getter方法修改属性

随之带来的问题是当类中的属性很多时要用很多次setter,为了简化,java提供了构造方法实现实例初始化处理:

  • 构造方法与类名称一致,可以方法重载
    • 重载时按参数个数降序或升序排列
  • 构造方法没有返回值,但不用void,为了和普通方法进行区别
  • 在使用new实例化时自动调用有参构造方法,不创建构造方法则在编译时自动创建无参构造方法
class Person {
    private String name ;
    private int age ;
    public void tell() {
        System.out.println("姓名:" + name + "\n年龄:" + age) ;
    }
    public Person(String n, int a){
        name = n;
        age = a;
    }
}

public class day03 {
    public static void main(String [] args){
        Person zhou = new Person("小明", 18) ;
        zhou.tell() ;
        System.out.println(zhou.getAge());
    }
}

匿名对象

new 类名().方法,无引用的对象,用完即被GC回收和释放

new Person("fen", 18).tell();

[out] 
姓名:fen
年龄:18

匿名对象

new 类名().方法,无引用的对象,用完即被GC回收和释放

new Person("fen", 18).tell();

[out] 
姓名:fen
年龄:18
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值