1、面向过程和面向对象编程的差异
面向过程(Procedure Oriented Programming,简称POP),是一种最基本的编程思想。完成某件事情主要通过流程步骤逐步实现。注重细节。
面向对象(Object Oriented Programming,简称OOP),是最为推广的编程思想。完成某件事情主要将解决问题的所有参与对象创建出来,并赋予对象对应的行为和属性。注重创建解决问题的对象。
2、类和对象
2.1类(Class)
类是具有相同属性和行为的对象的集合(也可以叫做模板)。
属性:是描述对象的特征,在代码中以定义变量的形式呈现。
行为:是描述对象的动作,在代码中以定义方法的形式呈现。
/*
定义一个学生类
修饰符 class 类名{
//属性
//方法
}
*/
public class Student{
//定义属性
String name;//学生姓名
int studentId;//学生学号
//定义方法
void info(){
//介绍自己的信息
System.out.println("我叫"+name+",学号是"+studentId);
}
}
2.2对象(Object)
对象是类的一个具体实例,是类的一个具体表现。
/*
创建对象
类名 对象名 = new 构造方法(参数);
*/
public class Test{
public static void main(String[] args) {
//创建一个学生类的对象
Student student = new Student();
//给对象赋值
student.name="小明";
student.studentId=1001;
//调用方法
student.info();
}
}
类和对象的关系
对象是类的一个具体实例,类是对象的集合(模板)。先定义类(模板)才能同过类创建对象。
3.成员变量、局部变量、静态常量
- 成员变量:定义类中的变量,也成为这个类的属性,拥有默认值,在创建对象时创建,通过对象对其进行访问。
- 局部变量:定义在方法中的变量,没有默认值,必须赋值了才能使用,在调用方法时创建。
- 静态常量:特殊的成员变量,使用范围在该类中,使用static和final修饰符修饰,通常在定义时赋值,在加载类时创建,通过类名方法调用。
4、构造方法
构造方法是一种特殊的方法,方法名和类名一样,并且没有返回值。
- 没有返回值部分(不是使用void),方法名必须和类名一致 。
- 在使用new关键字创建对象时自动调用对应的构造方法 。
- 每个类在定义后,隐藏有一个默认的无参数的构造方法 。
- 如果自己写了一个构造方法后,默认隐藏的无参数的构造方法就会失效 构造方法通常用于初始化成员变量 。
- 构造方法之间都是重载关系。
- 构造方法不能重写 构造方法执行时,不一定会创建对象。如抽象类中有构造方法,但该构造方法只在创建其子类对象 时自动调用。
5、面向对象的三大特性
5.1、封装
将类中的属性使用private修饰后,就可以不允许非当前类进行访问,以此达到保护核心代码的目的。 封装的步骤:(private的使用)
1.给类中的所有属性添加private修饰符 。
2.给每个属性定义setXX()方法用于赋值。
3.给每个属性定义getXX()方法用于读取属性。
5.2、继承
类A可以通过extends关键字继承类B。 语法:class 类A extends 类B 类A称为子类、派生类、衍生类、subClass 类B称为父类、基类、超类、superClass 继承后,子类可以访问父类中非私有的属性和方法。 不同的子类中相同的代码,都可以定义在父类中,减少子类中的代码冗余。
继承的特点
- 如果多个类之中有相同或类似的代码,可以将这些代码提出来定义在一个公共的类中,这个类就是 父类。再让那些类去继承这个父类,这样就能减少子类的重复代码。
- 子类对象可以直接访问父类中非私有的属性和方法
- 子类可以对父类中的方法进行拓展或覆盖,这称为方法重写,重写后,子类对象再调用该方法时, 执行的是重写后的内容。
- java中是单继承,一个子类只能有一个父类,一个父类可以有多个子类。
- java中可以多重继承,类A可以继承类B,类B也可以继承类C,这时类A可以访问类B和类C中非私 有的成员。
- 任何类都是Object类的子类。
- 在创建子类对象时,先执行父类中相应的构造方法。
方法重载overload
在一个类中,如果多个方法的方法名相同,参数列表不同(参数类型不同或参数数量不同)时,这些方法称 为重载的方法。同名不同参。重载用于在一个类中,某个方法在不同的条件下,执行不同的内容。
注意:方法名相同,参数列表(参数类型和数量)不同。
方法重写override
当子类继承父类后,可以对父类中非私有的方法进行拓展。这个行为称为方法重写。重写用于子类拓展父类的某个方法。
注意:方法名、参数列表、返回值必须和父类一致,访问权限不能比父类更严格(访问修饰符的范围要么相同要么更大),不能抛出比父类更大的异常。
5.3、多态
多态是面向对象语言的一种特性,通常在代码中用于:需要使用一个父类对象时,实际传递的是一个子 类对象,这时可以将子类对象当做父类对象使用。这种特性称为多态。
6、this和super
都可以当做对象或构造方法使用。
当做对象:this表示当前类的对象,super表示当前类的父类对象,this或super当对象时,只能用在非静态方法中。
当做构造方法:this()表示当前类的无参构造方法,super()表示当前类的父类的无参构造方法,this或super当构造方法时,只能放在另一个构造方法的第一行。
每个继承关系中,如果父类和子类都没有重载构造方法时,子类里都有一个默认无参的构造方法,其中 在调用父类的无参的构造方法。
7、Object类
Object类是所有类的根类。任何类都直接或间接的继承了该类,但没有显式地写出来。所有类都可以调用或重写 Object类中的方法。 toString()在输出某个对象时自动调用的方法,默认Object中输出的是“对象所在类的全限定名@十六进制 哈希码”, 通常自己定义的类需要重写该方法,用于输出该对象中的属性。 equals()是比较两个对象是否相同的方法,默认Object中使用==比较,所以自定义类后,如果要比较该 类的对象,一定要重写equals方法和hashcode方法,根据指定参数比较两个对象是否相同。
8、abstract
abstract是一个修饰符,用于修饰方法或类。
8.1、修饰方法
用法:访问修饰符 abstract 返回值 方法名(参数列表);如果某个父类中的方法在定义时无法决定要做什么,而是由其子类负责实现时,该方法可以定义为抽象 方法。
注意这里的方法不能有方法体(大括号)。这时该抽象方法所在的类,也必须用abstract修饰,让其成为一个抽象类。
特点:抽象方法没有方法体,抽象方法只能定义在抽象类或接口中,抽象方法通常需要子类重写,abstract不能修饰构造方法和静态方法。
8.2、修饰类
如果一个类中有抽象方法,该类一定得是抽象类。用法:访问修饰符 abstract class 类名{}。
特点:抽象类不能实例化(不能创建抽象类的对象),抽象类中可以有抽象方法,也可以有普通方法、构造方法(除抽象方法外和普通类一样),抽象类的构造方法在创建其子类对象时自动执行,但不会创建抽象类的对象,某个类如果继承了抽象类,那么这个类要么也是抽象类,否则就要重写抽象类中的所有抽象方法,通常抽象类都需要子类继承后重写其中的抽象方法。
9、interface
在java中,数据类型分为原始类型和引用类型。引用类型分为:数组、类和接口。所以接口是一种数据类型,类似于类。类使用class定义,接口使用 interface定义。如果一个抽象类中的所有方法都是抽象方法,那么就可以将这个抽象类定义为接口。
9.1、定义接口
访问修饰符 interface 接口名{};
由于java是单继承,如果类A想要继承多个"父类"中的内容时,就不能使用extends,但可以使用 implements实现多个接口而达到多继承的目的。接口是一个完全抽象类,其中的方法都是被public abstract修饰的公开抽象方法,其中的属性,都是被 public static final修饰的公开的静态常量,需要在定义时赋值才能使用。接口和抽象类一样,通常需要子类继承,但继承接口,称为"实现接口"。使用implements关键字实现。
ts实现多个接口而达到多继承的目的。接口是一个完全抽象类,其中的方法都是被public abstract修饰的公开抽象方法,其中的属性,都是被 public static final修饰的公开的静态常量,需要在定义时赋值才能使用。接口和抽象类一样,通常需要子类继承,但继承接口,称为"实现接口"。使用implements关键字实现。
特点:接口不能实例化,接口中的抽象方法默认使用public abstract修饰,属性默认使用public static final修饰,接口中没有构造方法和普通方法(jdk1.8后,接口中允许定义"default修饰的默认方法"和"static修饰的静态方法")接口的实现类,必须重写接口中的抽象方法。