Java基础入门:面向对象-基础知识

77 阅读3分钟

面向对象

  • 面向对象编程OOP:Object Oriented Programming
  • 面向对象设计OOD:Object Oriented Design
  • 面向对象技术OOT:Object Oriented Technology

面向对象基础概念

  • 真实世界对象的两大共同特征:状态和行为
  • 观察身边真实世界的物体(对象),问自己两个问题:
    • 这个对象可能处于什么状态
    • 这个对象可以执行什么可能的行为
  • 编程中的对象与真实世界一样
    • 状态:用变量表示存储
    • 行为:用方法公开表达行为

什么是类

  • 类是创建单个对象的蓝图(blueprint)
  • 类是用来造对象的
  • 用类的好处
    • OOP 最基本构建模块,不同组件不同类,好划分,好维护,好更改
  • 如何写一个类
    • 类的名字
    • 状态:用变量表示存储
    • 行为:用方法公开表达行为
public class Car {
    // 属性/字段/状态/成员变量 (静态数据) fields
    int topSpeed;
    String color;
    int totalSeats;

    // 方法(动态行为) method
    void drive() {
        System.out.println("Starting driving...");
    }

    void speedUp() {}

    void speedDown() {}

    String display(String context) {
        return context;
    }

    public static void main(String[] args) {
        // 创建对象(最常用)
        Car car = new Car();
        // 用对象(实例)变量调用
        System.out.println("Top speed: " + car.topSpeed);
        System.out.println("Color: " + car.color);

        car.drive();
        System.out.println(car.display("I love you!!!"));

    }
}

构造器/构造函数(Constructor)

  • 一个类至少有一个构造器,可以有多个构造器
  • 名字必须和类名完全一样
  • 可视为特殊方法,没有返回值
  • 如果没有定义任何构造器,该类会自动生成一个默认无参构造器
  • 无参构造器 V.S 有参数的构造器
    • 无参构造器:
    Car() {
        System.out.println("This is car constructor");
        this.topSpeed = 200;
        this.color = "black";
        this.totalSeats = 2;
    }
    
    • 有参构造器:
    Car(String colorToSelect) {
        this.topSpeed = 150;
        this.color = colorToSelect;
        this.totalSeats = 4;
    }
    
    Car(int speed, int seats, String colorToSelect) {
        this.topSpeed = speed;
        this.color = colorToSelect;
        this.totalSeats = seats;
    }
    
  • 如果一个类定义了构造器并且这些构造器都有参数,那么不会生成默认无参构造器

尽量不要将方法放入构造器内,会影响运行性能

包(Package)

  • 命名空间 -> name space (本质:文件夹)
  • 把功能相似或相关的类或接口组织在同一个包中
  • 在不同的包里可以用一样的名字
  • 包有访问权限

重载(Overload)

  • 只体现在方法上(方法重载和构造器重载)
  • 方法名字一样,但参数列表不同

重点:只关注参数类型

// void speedUp()
void speedUp() {
    System.out.println("speed 10");
}
// void speedUp(int)
void speedUp(int speedToUpdate) {
    System.out.printf("speed %d\n", speedToUpdate);
}
// void speedUp(String)
void speedUp(String speed) {}
// void speedUp(String, int)
void speedUp(String speed, int speedToUpdate) {}
// void speedUp(int, String)
void speedUp(int speedToUpdate, String speed) {}
// void speedUp(int, int)
void speedUp(int currentSpeed, int speedToUpdate) {}

常量 Constant

  • 用关键字 final 来定义一个常量
  • 常量被初始化后不能更改
  • 常量命名一般用全部大写字母表示
  • 在类中定义常量一般和 static 一起使用
  • 一般定义在类里,不定义在函数里
  • 相关文章:(详解Java 中 static 的作用 - 知乎 (zhihu.com))
public class ConstantDemo {
    static final int NUM = 100;
    public static void main(String[] args) {
        int num = 100;
        System.out.println("num: " + num);
        num = 1000;
        System.out.println("num: " + num);
        System.out.println("NUM: " + NUM);
    }
}

static 关键字(属于类)

  • static 属性和方法属于类,生命周期和类相同
  • static 成员变量只有一份
  • static 属性/方法可以被该类的所有对象实例共享使用
  • static 方法不能调用非 static 方法,反过来可以
  • 调用方法
    • 属性:className.field
    • 方法:className.method
public class StaticDemo {
    int id;
    static String name;

    public StaticDemo(int id) {
        this.id = id;
    }

    static void printInformation(String msg) {
        System.out.println("Information: " + msg);
    }

    void printObjectInformation() {
        System.out.println("Print this: " + this);
        printInformation("Info");
    }

    public static void main(String[] args) {
        StaticDemo demo1 = new StaticDemo(10);
        printInformation("Welcome");
        System.out.println("demo id1: " + demo1.id);
        demo1.printObjectInformation();

        StaticDemo demo2 = new StaticDemo(15);
        printInformation("Goodbye");
        System.out.println("demo id2: " + demo2.id);
        demo2.printObjectInformation();

        System.out.println("Static demo Name: " + name);
    }
}
  • 静态代码块:
// 静态代码块用于类的初始化
static {
    name = "STATIC JAVA";
    System.out.println("Init static demo with static block");
    printInformation("hello");
    String[] args = new String[1];
    // main方法一样可以被静态代码块调用
    main(args);
}

Import 关键字 - 导入类

  • 要使用其他包的类,需用 import

  • Java 默认导入 java.lang 包下的所有类

  • 难题:在一个类里面要用同名类则么办?

    • pacakage + className 来表示
  • 如何导入 static 相关

    import static + 详细路径