Day03 类与对象
面向过程:C,面对一个问题的解决方案,不会做出重用的设计
面向对象:C++,Java,模块化设计,方便重用,考虑某个问题的标准设计,根据标准进行拼装
- 封装性:内部操作对外部不可见,内部的操作都不可直接使用时才是安全的
- 继承性:在已有结构的基础上继续进行功能的扩充
- 多态性:在继承性的基础上对类型的转换处理
面向对象开发的三个步骤:
- OOA:面向对象分析
- OOD:面向对象设计
- OOP:面向对象编程
1. 类与对象
类是对某一类事物共性的抽象概念,对象描述的是具体的产物
类由两部分组成:
- 成员属性:属性Field
- 操作方法:方法Method
定义和使用
实际开发中一个文件只有一个class
通过调用对象来使用类
- 声明并实例化对象:类名称 对象名称 = new 类名称()
- 分步骤:
- 声明对象:类名称 对象名称 = null
- 实例化对象:对象名称 = 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