JAVA基础再回首(四)——面向对象思想、类与对象、成员/局部变量、匿名对象、封装、private、this、构造方法
好久没更了,毕业季的离别总令人伤感,我相信再见是为了我们更好的遇见。好了,来继续学习吧!
一、面向对象思想
- 概述: 面向对象是基于面向过程的编程思想
- 特点:
- 更符合我们思想习惯的思想
- 可以将复杂的事情简单化
- 将我们从执行者变成了指挥者(角色发生了转换)
- 说了上面的概念,有的人肯定没有明白和理解
- 那么,我们就针对面向对象思想举几个例子吧。
1.买电脑:
面向过程:我要了解电脑–了解我自己的需求–找对应的参数信息–去中关村买电脑–讨价还价–买回电脑
面向对象:我知道我要买电脑 – 计算机老师去给我买 – 老师就买回来了
2.洗衣服:
面向过程:把衣服脱下–找一个盆–放点洗衣粉–加点水–把衣服扔进去–搓一搓–清洗衣服–拧干–晾起来
面向对象:把衣服脱下–打开全自动洗衣机–扔进去–一键即可–晾起来
- 列举了上面两个例子,我们可以看出,运用面向对象的思想可以很方便的解决我们的问题,同时我们也可以把面向对象思想的使用规则做以总结,让我们更符合面向对象思想
- A:首先分析有那些类
- B:接着分析每个类应该有什么
- C:最后分析类与类的关系
我们知道了面向对象的使用规则,就来做一道练习吧!
练习:把大象装进冰箱。
- 分析:
- 面向过程:
- 动作有哪些呢?
A:打开冰箱门
B:装进大象
C:关闭冰箱门
- 动作有哪些呢?
- 代码体现:
- 面向过程:
class Demo {
public static void main(String[] args) {
//调用方法
open();
in();
close();
}
public static void open() {
System.out.println("打开冰箱门");
}
public static void in() {
System.out.println("装进大象");
}
public static void close() {
System.out.println("关闭冰箱门");
}
}
运行结果:
- 我们从面向对象的思想来分析,并实现代码:
- A:有哪些类呢?
- 大象、冰箱、Demo
- B:每个类有哪些东西呢?
- 大象:
- 进去
- 冰箱:
- 开门、关门
- Demo:
- main方法
- 大象:
- C:类与类直接的关系是什么呢?
- Demo中使用大象和冰箱类的功能。
- A:有哪些类呢?
代码实现:
class DaXiang {
public static void in() {
System.out.println("装进大象");
}
}
class BingXiang {
public static void open() {
System.out.println("打开冰箱门");
}
public static void close() {
System.out.println("关闭冰箱门");
}
}
class Demo {
public static void main(String[] args) {
//冰箱调用开门
BingXiang.open();
//大象调用进去
DaXiang.in();
//冰箱调用关门
BingXiang.close();
}
}
运行结果:
![]()
是不是发现运行结果都是一样的呀,但是对于运用面向对象思想实现的代码,在以后的开发中是很好维护的,所以我们要运用面向对象的思想去编程。
- 面向对象开发
- 就是不断的创建对象,使用对象,指挥对象做事情。
- 面向对象设计
- 其实就是在管理和维护对象之间的关系。
- 面向对象特征
- 封装(encapsulation)
- 继承(inheritance)
- 多态(polymorphism)
二、类与对象的关系
- 类:是一组相关的属性和行为的集合
- 属性——事物的基本描述,行为——事物的功能
- Java语言中最基本的单位是类。所以,我们要用类来体现事物
- 对象:是该类事物的具体体现
- 举例:
- 类 ——学生就是类
- 对象 ——班长就是一个对象
三、成员变量和局部变量的区别
- 在类中的位置不同
- 成员变量——类中方法外
- 局部变量——方法内或者方法声明上
- 在内存中的位置不同
- 成员变量——堆内存
- 局部变量——栈内存
- 生命周期不同
- 成员变量——随着对象的存在而存在,随着对象的消失而消失
- 局部变量——随着方法的调用而存在,随着方法的调用完毕而消失
- 初始化值不同
- 成员变量——有默认的初始化值
- 局部变量——没有默认的初始化值,必须先定义,赋值,才能使用。
注意:成员变量和名称可以不可和局部变量一样呢?
答案当然是可以的,但是使用的时候要注意,先找小范围,再找大范围。
四、匿名对象
匿名对象:就是没有名字的对象。
是对象的一种简化表示形式
- 匿名对象的两种使用情况
- 对象调用方法仅仅一次的时候
- 作为实际参数传递
我们来举例说明:
//正常写法
Student s = new Student();
s.age=23;
//匿名写法
new Student().age = 23;
//我们可以看到,用匿名写法时不用起名字就可以直接修改age的值了。
// 输出学生的数量
System.out.println("一共有"+new Student().num + "个学生");
//这种方法就是作为实际参数传递
五、封装(Encapsulation)
封装属于面向对象的三大特征之一。我们来一起学习它。
- 封装的概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 好处:
- 隐藏实现细节,提供公共的访问方式
- 提高了代码的复用性
- 提高安全性
- 原则:
- 将不需要对外提供的内容都隐藏起来
- 把属性隐藏,提供公共方法对其访问
我们来写一个Demo
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
s.age=5; //给成员变量赋值
s.study(); //调用方法
}
}
class Student{
String name;//姓名
int age; //年龄
//定义学习的方法
public void study(){
System.out.println("学生爱学习");
}
}
输出结果:学生爱学习
六、private
- private 关键字(意思是私有的)
- 是一个权限修饰符。
- 可以修饰成员(成员变量和成员方法)
- 被private修饰的成员只在本类中才能访问。
- private最常见的应用:
- 把成员变量用private修饰
- 提供对应的getXxx()/setXxx()方法
- 一个标准的案例的使用
我们一起写一个Demo来学习private关键字
在上面这个Demo中,我们可以发现,当我们用private修饰Student类中的成员变量时,在StudentDemo类中我们就不能调用它的成员变量age了。
上面我们也讲到了, 被private修饰的成员只在本类中才能访问。
那么我们要怎么去访问呢?这个时候java就给我们提供了一个方法,我们一起来看
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
// s.age=5; //给成员变量赋值
s.setAge(5); //给成员变量赋值
s.study(); //调用方法
}
}
class Student{
private String name;//姓名
private int age; //年龄
//定义学习的方法
public void study(){
System.out.println("学生爱学习");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
七、this
this关键字:代表所在类的对象引用。简单的说,它就代表当前类的一个对象。
- 注意:
- 方法被哪个对象调用,在该方法内部的this就代表那个对象
- 用法:
- 解决局部变量隐藏成员变量
如果你们细心点就会发现,在上面我们写的Demo中set方法中是有this的
- 解决局部变量隐藏成员变量
public void setAge(int age) {
this.age = age;
}
八、构造方法
- 作用概述:
- 给对象的数据进行初始化
- 格式:
- 方法名与类名相同
- 没有返回值类型,连void都没有
- 没有具体的返回值
我们来写一个简单的Demo
class Student {
private String name; //null
private int age; //0
public Student() {
System.out.println("这是构造方法");
}
}
class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
}
}
输出结果:
![]()
只要我们创建了对象就是new了,就执行了构造方法
- 注意:
- 如果你不提供构造方法,系统会给出默认构造方法
- 如果你提供了构造方法,系统将不再提供
- 构造方法也是可以重载的
我们来完成一个重载的Demo
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("阿杜");
Student s3 = new Student("阿杜",23);
}
}
class Student{
private int age; //年龄
public Student(){
System.out.println("这是构造");
}
public Student(String name){
System.out.println(name);
}
public Student(String name,int age){
System.out.println("这是构造"+age);
}
}
输出结果:
好了,面向对象这一张的内容很多,但是很重要,所以我们一定要学会他,博客会陆续更新的,谢谢