面向对象思想编程
类和对象
类class
创建类:
[修饰符]class 类名{
//属性(变量)
//行为(方法)
}
例如我创建一个小车类,这个类有品牌颜色等属性,同时我要让其实现行驶,停止等一系列行为
public class Car{
String brand;//品牌
String color;//颜色
//定义方法
void go(){
System.out.println("汽车在行驶");
}
void stop(){
System.out.println("汽车停止");
}
}
创建对象
类名 对象名=new 构造方法(参数);
类和对象的关系
成员变量和局部变量
成员变量
定义在类中的变量,称为成员变量,拥有默认值。
类型 | 默认值 |
整型 | 0 |
浮点型 | 0.0 |
布尔型 | false |
字符型 | 空字型\u0000 |
引用类型 | null |
局部变量
定义在方法中的变量,称为局部变量,没有默认值,赋值后才能使用
构造方法
是一个特殊的方法,没有返回值,方法名和类名一致。每个类在定义时,都有一个默认隐藏的无参数的 构造方法,在创建对象时自动调用,通常用于初始化成员变量。
面向对象的三大特性(封装、继承、多态)
封装
使用private关键字对属性进行修饰,可以防止除自身类之外的地方对该属性进行访问。 这样可以保护关键属性,隐藏类内部的实现细节,再对外提供一组公开的get/set方法用于对该属性的赋 值和读取。
继承
类A可以通过extends关键字继承类B。 语法:class 类A extends 类B 类A称为子类、派生类、衍生类、subClass 类B称为父类、基类、超类、superClass 继承后,子类可以访问父类中非私有的属性和方法。 不同的子类中相同的代码,都可以定义在父类中,减少子类中的代码冗余。
方法重写
当子类继承父类后,可以对父类中非私有的方法进行拓展。 这个行为称为方法重写。 重写用于子类拓展父类的某个方法。
重写要求
方法名、参数列表、返回值必须和父类一致
访问权限不能比父类更严格(访问修饰符的范围要么相同要么更大)
不能抛出比父类更大的异常
方法重载
在一个类中,如果多个方法的方法名相同,参数列表不同(参数类型不同或参数数量不同)时,这些方法称 为重载的方法。同名不同参。 重载用于在一个类中,某个方法在不同的条件下,执行不同的内容。
重载要求
方法名相同
参数列表(参数类型和数量)不同
this和super
这两个关键字都可以当作对象或构造方法
this当作对象
用法:this.属性或this.方法。 这时的this,表示当前类的对象。只能在方法中使用。 通常用于在方法中区分成员变量和参数。如封装时的set方法就用到了this区分。
this当作构造方法
用法:this([实际参数]); 此时的this()表示,当前类的一个构造对应的构造方法。
super当作对象
用法同this,但super表示父类的对象。 可以通过super访问父类对象中的非私有属性和方法。
super当作构造方法
用法同this(),表示调用父类中的某个构造方法。 只能用在构造方法中的第一行。
继承的特点
如果父类中重载了构造方法,默认无参构造方法就会失效,同时子类也会报错。 这时需要在子类的某个构造方法中,再调用父类的那个重载的构造方法即可。
多态
多态是面向对象语言的一种特性,通常在代码中用于:需要使用一个父类对象时,实际传递的是一个子 类对象,这时可以将子类对象当做父类对象使用。这种特性称为多态。 在不使用多态特性的情况下,假如要调用计算图形面积的方法,参数为圆时,输出圆的面积,参数为正 方形时,输出正方形的面积。。。如果有新的图形出现,就要再重载这个计算面积的方法。 如果使用多态,就可以不用重载那些方法,只需要定义一个参数为所有图形的父类,调用该父类对象的 计算方法。具体计算方法交给子类重写。这样就免去了重载的过程,只定义一个参数为父类对象的方 法,实际传递子类对象,调用方法时执行的是子类重写后的内容。
实现多态的前提
1.必须在继承关系中
2.子类的对象保存在父类的变量中(也称向上转型)
抽象abstract
是一个修饰符用于修饰方法或类。
修饰方法
用法:访问修饰符 abstract 返回值 方法名(参数列表);
如果某个父类中的方法在定义时无法决定要做什么,而是由其子类负责实现时,该方法可以定义为抽象 方法。 注意这里的方法不能有方法体(大括号)。 这时该抽象方法所在的类,也必须用abstract修饰,让其成为一个抽象类。
接口interface
在java中,数据类型分为原始类型和引用类型。
引用类型分为:数组、类和接口。所以接口是一种数据类型,类似于类。类使用class定义,接口使用 interface定义。 如果一个抽象类中的所有方法都是抽象方法,那么就可以将这个抽象类定义为接口。