类与对象
java 特点:面向对象编程
C:面向过程开发——面对一个问题的解决方案,大部分情况不会涉及到重用设计思考
C++、java:面向对象编程——模块化设计、可以进行重用设置
面向对象三大特征:
- 封装性——内部的操作对外部不可见,当内部都不可直接用的时候才是安全的
- 继承性——在已有结构的基础上继续进行扩充
- 多态性——在继承性基础上扩充而来的,指的是类型的转换处理
开发一般有三个步骤:
- OOA:面向对象分析
- OOD:面向对象设计
- 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回收释放