Java面向objectprogrammingtutorial
面向objectprogramming(Object-Oriented programming, OOP) is aprogramming范式, 它将data and operationdata methodencapsulation in 一起, 以object for basic单位forprogramming. Java is a纯面向object programminglanguage, 本tutorial将介绍Java 面向objectfeatures, includingclass, object, inheritance, polymorphism, encapsulation and abstraction - core concepts.
1. 面向objectprogramming basicconcepts
1.1 what is 面向objectprogramming?
面向objectprogramming is aprogramming范式, 它 core思想 is 将现实世界in 事物abstraction for object, 每个object都 has 自己 property and behavior. throughobject之间 交互来completiontask, 而不 is 像面向过程programming那样throughfunction 调用来completiontask.
1.2 面向objectprogramming features
面向objectprogramming具 has 以 under 四个主要features:
- encapsulation: 将data and operationdata methodencapsulation in 一起, 隐藏object in 部implementation细节, 只暴露必要 interface.
- inheritance: 子class可以inheritance父class property and method, implementationcode 复用.
- polymorphism: 不同class型 object可以 for 同一message做出不同 response.
- abstraction: 将具体 事物abstraction for class, 只关注事物 本质特征, ignore次要细节.
2. classes and objects
2.1 class 定义
class is object 蓝graph or 模板, 它定义了object property and behavior. in Javain, usingclass关键字来定义class.
// class 定义
public class Person {
// property (成员variable)
private String name;
private int age;
// constructmethod
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// method (成员method)
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void introduce() {
System.out.println("我叫" + name + ", 今年" + age + "岁. ");
}
}
2.2 object creation and using
object is class instance, usingnew关键字来creationobject.
// creationobject
Person person1 = new Person();
Person person2 = new Person("张三", 18);
// usingobject
person1.setName("李四");
person1.setAge(20);
person1.introduce(); // 输出: 我叫李四, 今年20岁.
person2.introduce(); // 输出: 我叫张三, 今年18岁.
2.3 constructmethod
constructmethod is a特殊 method, 用于初始化object. constructmethod 名称 and class名相同, 没 has return valueclass型, 甚至连void也没 has .
// constructmethodexample
public class Student {
private String name;
private int id;
private double score;
// 默认constructmethod
public Student() {
name = "未知";
id = 0;
score = 0.0;
}
// 带parameter constructmethod
public Student(String name, int id) {
this.name = name;
this.id = id;
score = 0.0;
}
// 带三个parameter constructmethod
public Student(String name, int id, double score) {
this.name = name;
this.id = id;
this.score = score;
}
// method
public void display() {
System.out.println("姓名: " + name);
System.out.println("学号: " + id);
System.out.println("成绩: " + score);
}
}
// usingconstructmethodcreationobject
Student student1 = new Student(); // using默认constructmethod
Student student2 = new Student("王五", 1001); // using带两个parameter constructmethod
Student student3 = new Student("赵六", 1002, 95.5); // using带三个parameter constructmethod
student1.display();
student2.display();
student3.display();
3. encapsulation
3.1 what is encapsulation?
encapsulation is 指将object property and behaviorencapsulation in 一起, 隐藏object in 部implementation细节, 只暴露必要 interface. throughencapsulation, 可以improvingcode security性 and 可maintenance性.
3.2 such as何implementationencapsulation?
in Javain, implementationencapsulation 步骤such as under :
- 将property声明 for 私 has (using
private关键字) . - providing公共 getter and settermethod来访问 and modifyproperty.
// encapsulationexample
public class BankAccount {
// 私 has property
private String accountNumber;
private double balance;
// constructmethod
public BankAccount(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
if (initialBalance >= 0) {
this.balance = initialBalance;
} else {
this.balance = 0;
}
}
// 公共 gettermethod
public String getAccountNumber() {
return accountNumber;
}
public double getBalance() {
return balance;
}
// 公共 settermethod (带verification)
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}
// 显示accountinformation
public void displayAccount() {
System.out.println("账号: " + accountNumber);
System.out.println("余额: " + balance);
}
}
// usingBankAccountclass
BankAccount account = new BankAccount("123456789", 1000);
account.displayAccount(); // 输出: 账号: 123456789 余额: 1000.0
account.deposit(500);
account.displayAccount(); // 输出: 账号: 123456789 余额: 1500.0
account.withdraw(300);
account.displayAccount(); // 输出: 账号: 123456789 余额: 1200.0
// 尝试直接访问私 has property (会编译error)
// account.balance = 5000; // 编译error
4. inheritance
4.1 what is inheritance?
inheritance is 指子class可以inheritance父class property and method, implementationcode 复用. in Javain, usingextends关键字来implementationinheritance.
4.2 inheritance implementation
// 父class
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " in 吃东西. ");
}
public void sleep() {
System.out.println(name + " in 睡觉. ");
}
}
// 子class
public class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父class constructmethod
}
// 重写父class method
@Override
public void eat() {
System.out.println(name + " in 吃骨头. ");
}
// 子class特 has method
public void bark() {
System.out.println(name + " in 汪汪叫. ");
}
}
// 另一个子class
public class Cat extends Animal {
public Cat(String name) {
super(name); // 调用父class constructmethod
}
// 重写父class method
@Override
public void eat() {
System.out.println(name + " in 吃鱼. ");
}
// 子class特 has method
public void meow() {
System.out.println(name + " in 喵喵叫. ");
}
}
// usinginheritance
Dog dog = new Dog("旺财");
dog.eat(); // 输出: 旺财 in 吃骨头.
dog.sleep(); // 输出: 旺财 in 睡觉.
dog.bark(); // 输出: 旺财 in 汪汪叫.
Cat cat = new Cat("咪咪");
cat.eat(); // 输出: 咪咪 in 吃鱼.
cat.sleep(); // 输出: 咪咪 in 睡觉.
cat.meow(); // 输出: 咪咪 in 喵喵叫.
4.3 super关键字
super关键字用于访问父class property and method, 以及调用父class constructmethod.
public class Person {
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
}
}
public class Employee extends Person {
private String department;
private double salary;
public Employee(String name, int age, String department, double salary) {
super(name, age); // 调用父class constructmethod
this.department = department;
this.salary = salary;
}
@Override
public void display() {
super.display(); // 调用父class displaymethod
System.out.println("部门: " + department);
System.out.println("工资: " + salary);
}
}
// usingEmployeeclass
Employee employee = new Employee("张三", 30, "techniques部", 8000.0);
employee.display();
// 输出:
// 姓名: 张三
// 年龄: 30
// 部门: techniques部
// 工资: 8000.0
5. polymorphism
5.1 what is polymorphism?
polymorphism is 指不同class型 object可以 for 同一message做出不同 response. in Javain, polymorphism implementation需要满足以 under 条件:
- inheritancerelationships
- method重写
- 父class引用指向子classobject
5.2 polymorphism implementation
// 父class
public class Shape {
public void draw() {
System.out.println("绘制形状");
}
}
// 子class
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
public class Triangle extends Shape {
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
// usingpolymorphism
Shape[] shapes = new Shape[3];
shapes[0] = new Circle();
shapes[1] = new Rectangle();
shapes[2] = new Triangle();
// polymorphism 体现: 同一class型 引用调用同一method, 表现出不同 behavior
for (Shape shape : shapes) {
shape.draw();
}
// 输出:
// 绘制圆形
// 绘制矩形
// 绘制三角形
5.3 method 重写 and 重载
method重写 (Override) : 子class重写父class method, method名, parameterlist and return valueclass型必须相同.
method重载 (Overload) : in 同一个classin, 定义 many 个同名method, 但它们 parameterlist不同 (parameter个数, parameterclass型 or parameter顺序不同) .
// method重写example
public class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("狗汪汪叫");
}
}
// method重载example
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
// using
Calculator calculator = new Calculator();
System.out.println(calculator.add(3, 5)); // 调用add(int, int)
System.out.println(calculator.add(3.5, 5.5)); // 调用add(double, double)
System.out.println(calculator.add(1, 2, 3)); // 调用add(int, int, int)
6. abstractionclass and interface
6.1 abstractionclass
abstractionclass is a不能instance化 class, 它用于定义子class 共同behavior. abstractionclassin可以package含abstractionmethod and 具体method. abstractionmethod is a没 has implementation method, 它 implementation由子classproviding.
// abstractionclass
public abstract class Vehicle {
protected String brand;
public Vehicle(String brand) {
this.brand = brand;
}
// 具体method
public void start() {
System.out.println(brand + "开始启动");
}
// abstractionmethod
public abstract void drive();
public abstract void stop();
}
// 子class
public class Car extends Vehicle {
public Car(String brand) {
super(brand);
}
@Override
public void drive() {
System.out.println(brand + "汽车 in 公路 on 行驶");
}
@Override
public void stop() {
System.out.println(brand + "汽车停止");
}
}
public class Bike extends Vehicle {
public Bike(String brand) {
super(brand);
}
@Override
public void drive() {
System.out.println(brand + "自行车 in small 路 on 行驶");
}
@Override
public void stop() {
System.out.println(brand + "自行车停止");
}
}
// using
Vehicle car = new Car("奔驰");
car.start();
car.drive();
car.stop();
Vehicle bike = new Bike("永久");
bike.start();
bike.drive();
bike.stop();
6.2 interface
interface is a完全abstraction class, 它只package含abstractionmethod and 常量. in Javain, usinginterface关键字来定义interface, usingimplements关键字来implementationinterface.
// interface
public interface Flyable {
void fly();
}
public interface Swimmable {
void swim();
}
// implementationinterface
public class Bird implements Flyable {
private String name;
public Bird(String name) {
this.name = name;
}
@Override
public void fly() {
System.out.println(name + " in 天空in飞翔");
}
}
public class Fish implements Swimmable {
private String name;
public Fish(String name) {
this.name = name;
}
@Override
public void swim() {
System.out.println(name + " in 水in游泳");
}
}
// implementation many 个interface
public class Duck implements Flyable, Swimmable {
private String name;
public Duck(String name) {
this.name = name;
}
@Override
public void fly() {
System.out.println(name + " in 天空in飞翔");
}
@Override
public void swim() {
System.out.println(name + " in 水in游泳");
}
}
// using
Bird bird = new Bird("麻雀");
bird.fly();
Fish fish = new Fish("金鱼");
fish.swim();
Duck duck = new Duck("鸭子");
duck.fly();
duck.swim();
7. in 部class
7.1 what is in 部class?
in 部class is 定义 in 另一个class in 部 class. in 部class可以访问 out 部class 成员, including私 has 成员.
7.2 in 部class class型
Javain has 四种class型 in 部class:
- 成员 in 部class: 定义 in class in 部, method out 部.
- 局部 in 部class: 定义 in method or code块 in 部.
- 匿名 in 部class: 没 has 名称 in 部class, 通常用于creationinterface or abstractionclass instance.
- 静态 in 部class: using
static关键字修饰 in 部class.
// 成员 in 部class
public class OuterClass {
private int outerVar = 10;
// 成员 in 部class
public class InnerClass {
private int innerVar = 20;
public void display() {
System.out.println(" out 部classvariable: " + outerVar);
System.out.println(" in 部classvariable: " + innerVar);
}
}
public void method() {
InnerClass inner = new InnerClass();
inner.display();
}
}
// 局部 in 部class
public class LocalInnerClassDemo {
public void method() {
final int localVar = 30;
// 局部 in 部class
class LocalInnerClass {
public void display() {
System.out.println("局部variable: " + localVar);
}
}
LocalInnerClass localInner = new LocalInnerClass();
localInner.display();
}
}
// 匿名 in 部class
public interface Greeting {
void sayHello();
}
public class AnonymousInnerClassDemo {
public void method() {
// 匿名 in 部class
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello from anonymous inner class!");
}
};
greeting.sayHello();
}
}
// 静态 in 部class
public class StaticInnerClassDemo {
private static int staticOuterVar = 40;
private int nonStaticOuterVar = 50;
// 静态 in 部class
public static class StaticInnerClass {
private int innerVar = 60;
public void display() {
System.out.println("静态 out 部classvariable: " + staticOuterVar);
// 静态 in 部class不能访问非静态 out 部classvariable
// System.out.println("非静态 out 部classvariable: " + nonStaticOuterVar); // 编译error
System.out.println(" in 部classvariable: " + innerVar);
}
}
}
// using
OuterClass outer = new OuterClass();
outer.method();
// creation成员 in 部class instance
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display();
LocalInnerClassDemo localDemo = new LocalInnerClassDemo();
localDemo.method();
AnonymousInnerClassDemo anonymousDemo = new AnonymousInnerClassDemo();
anonymousDemo.method();
// creation静态 in 部class instance
StaticInnerClassDemo.StaticInnerClass staticInner = new StaticInnerClassDemo.StaticInnerClass();
staticInner.display();
实践case: 学生managementsystem
现 in , 让我们creation一个 simple 学生managementsystem, using面向objectprogramming 思想.
// 学生class
public class Student {
private String id;
private String name;
private int age;
private String major;
private double gpa;
public Student(String id, String name, int age, String major, double gpa) {
this.id = id;
this.name = name;
this.age = age;
this.major = major;
this.gpa = gpa;
}
// Getter and Settermethod
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public double getGpa() {
return gpa;
}
public void setGpa(double gpa) {
this.gpa = gpa;
}
// 显示学生information
public void display() {
System.out.println("学号: " + id);
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("专业: " + major);
System.out.println("GPA: " + gpa);
System.out.println();
}
}
// 学生managementsystemclass
import java.util.ArrayList;
import java.util.List;
public class StudentmanagementmentSystem {
private List students;
public StudentmanagementmentSystem() {
students = new ArrayList<>();
}
// 添加学生
public void addStudent(Student student) {
students.add(student);
System.out.println("学生添加成功!");
}
// 根据学号find学生
public Student findStudentById(String id) {
for (Student student : students) {
if (student.getId().equals(id)) {
return student;
}
}
return null;
}
// delete学生
public boolean deleteStudent(String id) {
Student student = findStudentById(id);
if (student != null) {
students.remove(student);
System.out.println("学生delete成功!");
return true;
} else {
System.out.println("未找 to 该学生!");
return false;
}
}
// 显示所 has 学生
public void displayAllStudents() {
if (students.isEmpty()) {
System.out.println("没 has 学生information!");
} else {
System.out.println("所 has 学生information: ");
System.out.println("------------------------");
for (Student student : students) {
student.display();
}
}
}
// 按GPAsort
public void sortByGpa() {
students.sort((s1, s2) -> Double.compare(s2.getGpa(), s1.getGpa()));
System.out.println("学生按GPAsort成功!");
}
}
// test学生managementsystem
public class TestStudentmanagementmentSystem {
public static void main(String[] args) {
StudentmanagementmentSystem sms = new StudentmanagementmentSystem();
// 添加学生
sms.addStudent(new Student("1001", "张三", 18, "计算机科学", 3.8));
sms.addStudent(new Student("1002", "李四", 19, "软件工程", 3.5));
sms.addStudent(new Student("1003", "王五", 18, "data科学", 3.9));
// 显示所 has 学生
sms.displayAllStudents();
// 按GPAsort
sms.sortByGpa();
sms.displayAllStudents();
// find学生
Student student = sms.findStudentById("1002");
if (student != null) {
System.out.println("找 to 学生: ");
student.display();
}
// delete学生
sms.deleteStudent("1001");
sms.displayAllStudents();
}
}
这个学生managementsystemimplementation了以 under functions:
- 添加学生information
- find学生information
- delete学生information
- 显示所 has 学生information
- 按GPAsort学生information
互动练习
练习1: creation一个形状class层次structure
creation一个abstraction Shapeclass, package含abstractionmethodcalculateArea() and calculatePerimeter(). 然 after creationCircle, Rectangle and Triangle子class, implementation这些abstractionmethod.
练习2: creation一个银行accountclass
creation一个BankAccountclass, package含账号, 余额etc.property, 以及存款, 取款, query余额etc.method. implementationencapsulation, 确保余额不能 for 负数.
练习3: creation一个动物class层次structure
creation一个Animalabstractionclass, package含makeSound()abstractionmethod. 然 after creationDog, Cat, Birdetc.子class, implementation各自 makeSound()method. usingpolymorphismcreation不同 动物object并调用它们 method.