面向过程的程序设计:
面向过程,一种较早的编程思想,在过程的角度思考问题,强调的就是功能行为,功能的执行过程,即先干什么,后做什么。每一个功能都使用函数实现.
面向对象的程序设计(OOP):
面向对象程序设计,顾名思义,该思想是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象。
面向对象程序设计是当今主流的程序设计规范,更加适合使用于解决规模较大的问题,但是千万不要误解为面向对象一定就优于面向过程的设计.
面向对象三大特征:
封装(Encapsulation):将对象的实现细节隐藏起来,然后通过公共的方法来向外暴露该对象的功能
继承(Inheritance):当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员。
多态(Polymorphism):可以直接把子类对象赋给父类变量,但是运行时依然表现出子类的行为特征,这意味着同一类型的对象在运行时可能表现出不同的行为特征。
抽象:
抽象是指从特定的角度出发,从已经存在的一些事物中抽取我们所关注的特性、行为,从而形成一个新的事物的思维过程,是一种从复杂到简洁的思维方式。
类(class):
类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。
具有相同特性(状态)和行为(功能)的对象的抽象就是类
举例来说,“人”这个类会包含人的一切基础特征,即所有“人”都共有的特征或行为,例如有眼睛,有鼻子,会吃饭。
/*
定义类:
1:类名使用 名词 或者 名词短语,
类名首字母 大写,
如果有多个单词组成使用 驼峰表示法
2:如果类使用了public修饰,则当前类所在的文件名称也必须为该类名.
*/
public class User {
private String name;
private int age;
public void eat() {
System.out.println("");
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
对象(Object):
对象(Object)是类的实例。
例如,“狗”这个类列举狗的特点,从而使这个类定义了世界上所有的狗。而莱丝这个对象则是一条具体的狗,它的属性也是具体的。狗有皮毛颜色,而莱丝的皮毛颜色是棕白色的。因此,莱丝就是狗这个类的一个实例。一个具体对象属性的值被称作它的“状态”。(系统给对象分配内存空间,而不会给类分配内存空间。这很好理解,类是抽象的系统不可能给抽象的东西分配空间,而对象则是具体的。)
总结:对象是类的实例,类是对象的抽象。
对象的基本操作
- 对象的创建和使用
//使用new关键字创建对象
User usr1 = new User("A",20);//new关键字的作用:1).在堆内存开辟空间,2).创建对象
- 对象的比较
每次new出来的对象,都表示独立使用一块堆内存空间.
所以比较对象不能使用"=="号,因为等号比较的是内存的地址,即是不是同一块内存区域. 此时我们可以使用Object类中的equals方法(自定义类需要覆盖equals方法)来比较是否是同一个对象.
eclipse工具能自动生成自定义类的equals方法,鼠标右键(或者快捷键A/t+Shift+s)
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//对象的比较
System.out.println(user1 == user2);//false == :对于引用类型比较的是地址
System.out.println(user1.equals(user2));//true:
- 打印对象
打印对象的时候,默认打印出的是对象的hashCode值
但是,我们更关心的是对象中的状态,比如name是什么,age是什么.如果想在打印对象的时候,看到对象的状态信息,可以在当前类中覆盖Object类中的toString方法
eclipse工具自动生成toString方法,快捷键A/t+Shift+s,选择''toString"
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
//对象的打印,未覆盖toString之前
System.out.println(user1);//User@66e
//覆盖toString之后
System.out.println(user1);//User [name=A, age=20]
- 对象的生命周期
从new开始到该对象不被任何么变量引用的时候结束,一旦一个对象不被任何变量所引用时,该对象就是垃圾,就等着Java的垃圾回收器(GC)来清理。
注意:并不是垃圾一旦产生GC就会清理,这完全取决于JVM的调度,程序员无法控制。