前言
类、对象与接口
文章目录
- 前言
- 一、类与对象
- 二、源文件声明的规则
- 三、修饰符
- 四、继承
- 五、多态
- 六、接口
- 1、定义
- 2、接口
- 3、实现
- 4、接口
一、类与对象
类:定义一种全新的数据类型,包含一组变量(数据)和函数(逻辑),即将变量、数组、函数打包在一起。
对象/实例:类里的每一个实例/对象。
生活中的例子:例如在一间教室中,可以将Student定义成类,表示“学生”这个抽象的概念。那么每个同学就是Student类的一个对象/实例。
代码例子:String str1, str2, str3;
其中String
为类,str1
, str2
, str3
为对象/实例。
二、源文件声明的规则
一个源文件中只能有一个public
类。
一个源文件可以有多个非public
类。
源文件的名称应该和public
类的类名保持一致。
每个源文件中,先写package
语句,再写import
语句,最后定义类,其中包的概念即当前文件所在的路径。
三、修饰符
一个类中的变量或者函数称其为成员变量和成员函数。
修饰符一般用来修饰类中的变量或者函数,访问指的是访问类中的变量或者函数。
- private:只有本类内部可以访问,主要为了防止类外对其修改,代码协作,不希望类外对其进行修改。
- public:类外可以访问。
- protected:同一包或者子类可以访问。
- default:同一个包内可以访问。
- static
- 修饰变量:静态变量,当前类的所有实例共享(例如一个教室中的黑板),普通变量为每个实例所共有的(例如一个教师中每个学生的草稿纸)。静态变量的访问通过类名来访问
- 修饰函数:静态函数只能访问静态函数(共享的只能访问共享的),普通的函数可以访问普通的函数也可以访问静态函数
- 修饰变量:静态变量,当前类的所有实例共享(例如一个教室中的黑板),普通变量为每个实例所共有的(例如一个教师中每个学生的草稿纸)。静态变量的访问通过类名来访问
构造函数:初始化对象时可以传一些参数。
封装:变量修饰为private,外面如果想访问这个变量时,有两种情况,一种是通过set函数赋值,另一种是取值通过get函数。
class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public String toString() {
return String.format("(%d, %d)", x, y); // 将当前点转换成字符串
}
}
四、继承
为了减少代码量,将公共的概念变成一个基类,每一个角色从这个基类中继承过来,每一个角色会将基类中的成员函数和成员变量继承过来。
例如,想在当前类的基础之上加上一个新的参数,代码如下。
class ColorPoint extends Point {
private String color;
public ColorPoint(int x, int y, String color) {
super(x, y); // 调用父类的构造函数,将父类中的x和y赋成当前的x和y
this.color = color;
}
public void setColor(String color) {
this.color = color;
}
public String toString() { // 子类和父类中有同名的函数时会优先使用子类的
return String.format("(%d, %d, %s)", super.getX(), super.getY(), this.color);
}
}
五、多态
父类引用可以指向子类对象,Point2虽然是父类类型,但是对象是子类对象,Point和Point2是同一种类型的对象,调用同一个toString函数时结果不一样,第一个调用父类的toString方法,第二个调用子类的toString方法。
同一种类型的对象,调用同一个函数会有不同的行为
多态的作用:一个游戏中几百个英雄,初始时每个英雄都会说一句话,如果不用多态的话,需要调用每一个英雄的greet方法,需要写好多if-else语句,很麻烦。
如果有多态的话,会将每一个英雄对象赋给它的基类,然后只需要一句代码就行。
每次调用greet函数时会看是哪个对象,然后调用自己对应的greet函数。
六、接口
主要用来定义一个类必须要包含哪些函数的一个工具
1、定义
interface Role {
void greet();
void move();
int getSpeed();
}
2、接口
一个接口可以继承多个接口
interface Hero extends Role {
public void attack();
}
3、实现
接口的实现:就是实现接口中定义的函数。一个类可以实现多个接口,每个接口间用 , 隔开。
class Zeus implements Hero {
private final String name = "Zeus";
public void attack() {
System.out.println(name + ": Attack!");
}
public void greet() {
System.out.println(name + ": Hi!");
}
public void move() {
System.out.println(name + ": Move!");
}
public int getSpeed() {
return 10;
}
}
4、接口
一个对象是可以放到本类的变量上,也可以放到父类的变量上,也可以放到接口类型的变量上
多个类去实现同一个接口。
class Athena implements Hero {
private final String name = "Athena";
public void attack() {
System.out.println(name + ": Attack!!!");
}
public void greet() {
System.out.println(name + ": Hi!!!");
}
public void move() {
System.out.println(name + ": Move!!!");
}
public int getSpeed() {
return 10;
}
}
public class Main {
public static void main(String[] args) {
Hero[] heros = {new Zeus(), new Athena()}; // 将类定义成接口类型
for (Hero hero: heros) { // 第一个调用宙斯的,第二个调用雅典娜的
hero.greet();
}
}
}