MENU

类与对象

• November 14, 2020 • 面向对象编程

类与对象

java 特点:面向对象编程


C:面向过程开发——面对一个问题的解决方案,大部分情况不会涉及到重用设计思考
C++、java:面向对象编程——模块化设计、可以进行重用设置

面向对象三大特征:

  1. 封装性——内部的操作对外部不可见,当内部都不可直接用的时候才是安全的
  2. 继承性——在已有结构的基础上继续进行扩充
  3. 多态性——在继承性基础上扩充而来的,指的是类型的转换处理

开发一般有三个步骤:

  1. OOA:面向对象分析
  2. OOD:面向对象设计
  3. OOP: 面向对象编程

在生活中可以说得通的场景,在面向对象程序中都可以模仿出来,这就是面向对象编程


一些事物的抽象概念——许多有共性的对象组成类

对象

具体的事物——类的一个具体例子

类是一个模板,对象是一个实例

先有类,后有对象
比如:可以把男人当做一个类,而我就是一个对象
为什么可以把男人当成一个类,因为男人都有共性(年龄,姓名,会说话,会打球等等)
而我就具备这些特征,因此我是男人这个类里面的一个对象


类一般由两个组成:

  • 成员属性:比如我的年龄、姓名 ——对象的属性
  • 成员方法:比如我会唱歌、会跳舞 ——对象的行为

类 长这样:

里面有两个属性(name, age)和两个方法(sing, dance)
如果要调用这两个方法,那么必须通过实例对象来调用,产生实例对象的语法如下:

  • 声明并实例化对象:Man man = new Man();
  • 分步骤进行,先声明,在后面的代码中再实例化

调用属性:对象名.属性 例如:man.name;
调用方法:对象名.方法名() 例如:man.sing();


对象实例化

堆内存:保存的是对象的具体信息,开辟是通过new 完成的
栈内存:保存的是一块堆内存的地址

Man man = new Man();
在这条语句中,man 可以理解为存在栈内存里面的地址 ,Man 表示这个地址存放的数据类型,而new则在堆内存里面开辟一块空间,此空间的大小由Man 来决定,所以是new Man();
直接看图吧

必须要实例化(new在堆内存开辟)之后,才能调用对象的属性和方法


引用传递

同一块堆内存空间可以被不同的栈内存同时指向,也可以更换指向

主方法内的引用传递:

public static void main(String[] args) {
    Man man1 = new Man();
    Man man2 = man1;
}

man2和man1指向的是同一块堆内存,当man2.age = 80的时候,实际上改变的是堆内存中实例对象的属性值,当我们再次调用man1.age的时候,man1.age为80;

利用方法实现引用传递处理:

class Man{
    String Name;
    int age;
    public void sing(){
        System.out.println("我会唱歌");
    }
    public void dance(){
        System.out.println("我会跳舞");
    }
    public void change(Man man){      //传的是一个内存地址,所以方法结束后会改变其值
        man.age = 80;
    }
}

public class Main {
    public static void main(String[] args) {
        Man man1 = new Man();
        man1.age = 18;
        man1.Name = "Bob";
        Man man2 = new Man();
        man2.age = 20;
        man1.change(man2);
        System.out.println(man2.age);
    }
}

最后输出的结果是:80,而不是20


引用与垃圾产生分析

如果运用处理不当,会导致垃圾产生

没有任何栈内存所指向的堆内存空间就是垃圾空间

所有的垃圾都将被GC(垃圾处理回收机制),如果垃圾过多,回收性能会下降,所以在实际开发中,垃圾产生越少越好
一个栈内存只能够保存一个堆内存的地质数据,如果发生更改,则之前的数据将从此栈内存中彻底消失


成员属性封装

一般成员属性都需要有较高的安全性——采用封装性
在默认情况下,类的属性可以通过其他类来获取或者修改(类外部修改属性)
利用private 进行封装处理,属性对外部就不可见了,但是对类内部是可见的
要在外部访问或者设置,可以使用getter()和setter()方法

在开发过程中,最好类的所有属性都利用private封装,同时提供setter和getter方法


构造方法与匿名对象

  • 构造方法在什么时候使用?

在创建一个对象的时候(new),初始化属性

  • 构造方法有什么优点?

  • 构造方法名称必须与类名称保持一致

  • 构造方法不允许设置任何返回值类型

构造方法长这样:

每一个类都有构造方法,如果程序员没有定义,那么默认的有一个无参数的啥都不干的构造方法,程序编译的时候自动创建的

  • 为什么构造方法没有返回值?构造方法没有返回值为什么不用void 修饰?

因为不需要有返回值;为了与普通成员方法区别开来

什么是匿名对象?
对象的地址没有取名字,形如:new Man("Bob", 18);
只执行一次就会变成垃圾,被GC回收释放

Archives QR Code Tip
QR Code for this page
Tipping QR Code