1.类
类是构造对象的模板或者蓝图。由类构造对象的过程叫做创建类的实例。
封装
实现封装意义在于绝对不能让类中的方法直接访问其他类中的实例字段。只能通过对象的方法与对象数据进行交互。可以提高重用性和可靠性。
2.对象
对象的三个特性:
(1)行为
(2)状态
(3)标识
3.类与类之间的关系
- 依赖——“use-a”
- 聚合——“has-a”
- 继承——“is-a”
用var声明局部变量
如果可以从变量的初始值推导出它们的类型,可以用var关键字声明局部变量,而无须指定类型。
ps:var关键字只能用于方法中的局部变量。参数和字段的类型必须声明。
Emploee harry = new Employee();
可以声明为:var harry = new Empoloyee();
4.静态字段和静态方法
静态字段
个人理解其含义就是将某个字段设为静态的目的就是因为此字段可以被所有的实例所共享,即使没有对下你个,它也存在。静态字段不属于任何单个的对象,它属于类。
静态方法
静态方法是不在对象上执行的方法。它不使用任何的对象,换句话说,它没有隐式参数。
用一段代码总结所学知识:
public class ConstructorTest {
public static void main(String[] args) {
var staff = new Employee[3];
staff[0] = new Employee("Harry",40000);
staff[1] = new Employee(60000);
staff[2] = new Employee();
for (Employee e : staff)
System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary());
}
}
class Employee
{
private static int nextId; //静态变量
private int id;
private String name = "";//实例字段初始化
private double salary;
//静态初始化块
static
{
var generator = new Random();
nextId = generator.nextInt(10000);
}
//对象初始化块
{
id = nextId;
nextId++;
}
public Employee(String n,double s) //重载构造器
{
name = n;
salary = s;
}
public Employee(double s)
{
this("Employee #" + nextId,s); //用this调用另一个构造器
}
public Employee() //无参构造器
{
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
}
5.继承
类、超类、子类
在普通员工不会晋升的前提下,拿员工类和经理类来举例,可以理解为每一个经理都是一个员工,这时创建经理类派生于已存在的员工类,这个已存在的类就是超类,新类称为子类。
覆盖方法
使用关键字super来调用超类的方法。
子类构造器
public Manager(String name, double salary, int year, int month, int day)
{
super(name, salary, year, month, day);
bonus = 0;
}
这里的super调用超类Employee类中带有n、s、year、month、day参数的构造器。
多态
"is-a"规则指出子类的每个对象也是超类的对象。另一种表述是替换原则,程序中出现超类对象的任何地方都可以使用子类对象替换。
this与super总结
t
h
i
s
{
隐
式
参
数
的
引
用
调
用
该
类
的
其
他
构
造
器
this\left\{ \begin{aligned} 隐式参数的引用\\ \\ 调用该类的其他构造器 \end{aligned} \right.
this⎩⎪⎨⎪⎧隐式参数的引用调用该类的其他构造器
s
u
p
e
r
{
调
用
超
类
的
方
法
调
用
超
类
的
构
造
器
super\left\{ \begin{aligned} 调用超类的方法\\ \\ 调用超类的构造器 \end{aligned} \right.
super⎩⎪⎨⎪⎧调用超类的方法调用超类的构造器