Java 面向对象
面向过程(Procedure Oriented)
面向过程是一种以过程为中心的编程思想。是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
面向对象(Object Oriented)
面向对象是一种以事物为中心的编程思想。是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象是以功能来划分问题,而不是步骤。面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。
通俗的来说:
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
面向对象三大特性
1、封装
将对象的实现细节隐藏起来,仅对外提供公共访问方式。将变化隔离,便于使用,提高复用性和安全性。
2、继承
当子类继承父类后,子类是一种特殊的父类,能够直接或间接获得父类里的成员。提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。这意味着同一类型的对象在运行时可能表现出不同的行为特征。提高了程序的拓展性。
名词说明
对象(object):包含特性和行为的一个实体,对象也称为实例(instance)
类(class):具有相同特性和行为的多个对象的抽象
类的实例化:把类具体到某一个对象上面,该对象有具体的什么状态特征和什么行为。
类的定义
对象的一些状态特征使用成员变量表示
对象的行为使用方法表示
class 类名 {
0~N个成员变量(字段Field);
0~N个方法
}
注意:
- 若类使用 public 修饰,则类名必须和当前所在的文件名相同
- 类型必须符合标识符的命名规范(使用名词,首字母大写)
例子:人类
class Person {
// 描述状态特征:成员变量
String name; // 姓名
int age; // 年龄
int height; // 身高
// 描述行为:方法
void sing(){
// 唱歌
}
void dance(){
// 跳舞
}
}
对象的创建
在程序中,必须先有类,再有对象(先得有模板,再有根据模板制造出来的个体)
创建对象
类 对象名 = new 类名();
赋值
对象名.变量名 = 值;
取值
变量 = 对象名.变量名
对象调用方法
对象名.方法名([实参])
匿名对象
创建一个对象,没有把它赋值给任何一个变量。只能使用一次。
构造器
构造器:在对象创建时,自动调用的方法,我们称它是构造器或者构造方法。
一个类至少存在一个构造器。创建对象其实就是在调用构造器。
构造器的作用
1、创建对象,必须和 new 一起使用。
2、完成对象的初始化操作。
构造器的特点
1、构造器的名称是和当前类名一致的。
2、禁止有返回值类型,不能使用void作为返回值。
3、在构造器当中不能使用return。
其实构造器是有返回值的,它返回的是当前创建对象的引用。
默认构造器
在类中找不到默认的无参构造器,但是通过反编译工具可以看到。
java 源文件:
public class User {
String name;
int age;
public void showMe() {
System.out.println("我是" + name);
}
}
通过反编译后:
import java.io.PrintStream;
public class User
{
String name;
int age;
public User()
{
}
public void showMe()
{
System.out.println((new StringBuilder("我是")).append(name).toString());
}
}
编译器编译源文件时,会创建一个默认的构造器,如果成员变量设置了默认值,默认值也是在默认构造器当中设置的。
java 源文件:
public class User {
String name = "smile";
int age = 20;
public void showMe() {
System.out.println("我是" + name);
}
}
通过反编译后:
import java.io.PrintStream;
public class User
{
String name;
int age;
public User()
{
name = "smile";
age = 20;
}
public void showMe()
{
System.out.println((new StringBuilder("我是")).append(name).toString());
}
}
默认构造器的特点
1、符合构造器的特点
2、没有参数
3、如果类使用了public修饰,它创建的默认构造器也会加public。
自定义构造器
自己定义了构造器,编译器就不会帮你再生成默认的构造器了。
public class User {
String name;
int age;
public User() {
name = "smile";
age = 18;
}
public User(String userName, int userAge) {
name = userName;
age = userAge;
}
public void showMe() {
System.out.println("我是" + name);
}
}
自定义构造器后,成员变量设置了默认值,默认值是在自定义构造器当中最开始设置的。
java 源文件:
public class User {
String name = "smile";
int age = 20;
public User() {
name = "xzh";
age = 18;
}
public User(String userName, int userAge) {
name = userName;
age = userAge;
}
public void showMe() {
System.out.println("我是" + name);
}
}
通过反编译后:
import java.io.PrintStream;
public class User
{
String name;
int age;
public User()
{
name = "smile";
age = 20;
name = "xzh";
age = 18;
}
public User(String userName, int userAge)
{
name = "smile";
age = 20;
name = userName;
age = userAge;
}
public void showMe()
{
System.out.println((new StringBuilder("我是")).append(name).toString());
}
}
构造器的重载
- 可以定义多个构造器,构造器的名称相同,参数不同。
- 在创建对象时,根据不同的参数,调用不同的构造器。