Android基础Java 基础

Java 基础 05. Java 面向对象

2021-12-13  本文已影响0人  yjtuuige

1. 初识面向对象

2. 方法回顾和加深

3. 类与对象的关系

4. 类与对象的创建

// 创建类
package com.xxx.oop.demo02;

// 学生类
public class Student {
    // 属性:字段
    String name;    // 默认 Null
    int age;    // 默认 0

    // 方法
    public void study() {
        // this 代表当前的类
        System.out.println(this.name + "在学习");
    }
}
// 创建对象
package com.xxx.oop.demo02;

// 一个项目应该只存在一个 main 方法
public class Application {
    public static void main(String[] args) {
        // 类:抽象的,实例化
        // 类实例化后,会返回一个自己的对象!
        // student1 student2 对象,就是 Student 类的具体实例!
        Student student1 = new Student();
        Student student2 = new Student();

        // 未赋值
        System.out.println(student1.name);  // null
        System.out.println(student1.age);   // 0

        student2.name="Liu";
        student2.age=3;
        // 已赋值
        System.out.println(student2.name);  // Liu
        System.out.println(student2.age);   // 3

        student2.study();   // Liu在学习
    }
}
package com.xxx.oop.demo02;

public class Person {
    // 一个类即使什么也不写,也存在一个与类同名的方法
    // 显示的定义构造器

    String name;

    // 定义无参构造器
    /*
     * 1. 使用 new 关键字,本质在调用构造方法;
     * 2. 用来初始化对象的值
     * */
    public Person() {
        this.name = "name01";
    }

    // 有参构造器
    // 定义有参构造器,如果想使用无参构造,无参就必须显示定义
    public Person(String name) {
        this.name = name;
    }
}
package com.xxx.oop.demo02;

// 一个项目应该只存在一个 main 方法
public class Application {
    public static void main(String[] args) {
        // 实例化对象,调用无参
        Person person = new Person();
        System.out.println(person.name);

        // 调用有参
        Person person1 = new Person("有参构造");
        System.out.println(person1.name);
    }
}

5. 创建对象内存分析

package com.xxx.oop.demo03;

public class Pet {
    // 属性
    public String name;
    public int age;

    // 方法
    public void shout() {
        System.out.println("叫了一声!");
    }
}
package com.xxx.oop;

import com.xxx.oop.demo03.Pet;

public class Application {
    public static void main(String[] args) {
        // 实例化类,创建 dog 对象
        Pet dog = new Pet();
        // 赋值
        dog.name = "旺财";
        dog.age = 3;

        System.out.println(dog.name);   // 旺财
        System.out.println(dog.age);    // 3
        dog.shout();    // 叫了一声!
        System.out.println("===========");
        // 创建 cat 对象
        Pet cat = new Pet();
        // 未赋值,为默认值
        System.out.println(cat.name);   // Null
        System.out.println(cat.age);    // 0
        cat.shout();    // 叫了一声!
    }
}

小结:

  1. 类与对象
    • 类是一个 模板:抽象;
    • 对象是一个具体的 实例
  2. 方法
    定义,调用
  3. 对象的引用
    • 引用类型:除基本类型(8)外的类型
    • 对象是通过引用来操作的:栈--->堆
  4. 属性:字段 Field 成员变量
    • 默认初始化值:
      • 数字: 0,0.0
      • char:u0000
      • boolean:false
      • 引用:null
    • 修饰符 属性类型 属性名 = 属性值
  5. 对象的创建和使用
    • 必须使用 new 关键字创造对象,构造器 Person person1 = new Person();
    • 对象的属性 person1.name
    • 对象的方法 person1.sleep()
  6. 类:
    • 静态的属性:属性
    • 动态的行为:方法

6. 面向对象三大特性:封装、继承、多态

1、封装:属性私有,get/set

package com.xxx.oop;

import com.xxx.oop.demo04.Student;

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();

        s1.setName("Liu");
        System.out.println(s1.getName());

        s1.setAge(999); // 非法值
        System.out.println(s1.getAge());
    }
}
package com.xxx.oop.demo04;

// 类    private:私有
public class Student {
    // 属性私有
    private String name;    // 姓名
    private int id;    // 学号
    private char sex;   // 性别
    private int age;    // 年龄

    // 提供一些可以操作属性的方法 public get() set()
    // 自动创建 get set 方法: 快捷键 Alt + Insert
    // get 获取数据
    public String getName() {
        return name;
    }
    // set 设置数据
    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 120 || age < 0) {
            this.age = 3;
        } else {
            this.age = age;
        }
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

2、继承:object 类、super、方法重写

Super 概述

super 注意点

  1. super 调用父类的构造方法,必须在构造方法的第一行!
  2. super 必须只能出现在子类的方法或者构造方法中!
  3. super 和 this 不能同时调用构造方法!

super VS this

重写:都是方法的重写,与属性无关

总结:重写,需要有 继承关系,子类重写父类的方法,且必须是 非静态方法

  1. 方法名必须相同;
  2. 参数列表列表必须相同;
  3. 修饰符:范围可以扩大但不能缩小: public > Protected > Default > private
  4. 抛出的异常:范围,可以被缩小,但不能扩大;ClassNotFoundException —> Exception (大)

3、多态:

instanceof:判断两个类型之间是否存在父子关系。左边的对象,是否是右边的类的实例,返回 boolean 的数据类型。

Object > String
Object > Person > Teacher
Object > Person > Student
package com.xxx.oop.demo09;
// 父类
public class Person {
    public void go(){
        System.out.println("go");
    }
}
package com.xxx.oop.demo09;
// 子类,继承 Person 类
public class Teacher extends Person{
}
package com.xxx.oop.demo09;
// 子类,继承 Person 类
public class Student extends Person{
}
public static void main(String[] args) {
        Object obj = new Student();
        System.out.println(obj instanceof Student); // true
        System.out.println(obj instanceof Person);  // true
        System.out.println(obj instanceof Object);  // true
        System.out.println(obj instanceof Teacher); // false
        System.out.println(obj instanceof String);  // false
    }
Person person = new Student();
System.out.println(person instanceof Student); // true
System.out.println(person instanceof Person);  // true
System.out.println(person instanceof Object);  // true
System.out.println(person instanceof Teacher); // false
// System.out.println(person instanceof String);  // 编译报错
Student student = new Student();
System.out.println(student instanceof Student); // true
System.out.println(student instanceof Person);  // true
System.out.println(student instanceof Object);  // true
// System.out.println(student instanceof Teacher); // 编译报错
// System.out.println(student instanceof String);  // 编译报错
package com.xxx.oop.demo09;
// 父类
public class Person {
    public void run(){
        System.out.println("run");
    }
}
package com.xxx.oop.demo09;
// 子类,继承 Person 类
public class Student extends Person{
    public void go(){
        System.out.println("go");
    }
}
package com.xxx.oop;

import com.xxx.oop.demo09.Person;
import com.xxx.oop.demo09.Student;

// 测试类
public class Application {
    public static void main(String[] args) {
        // 类型之间转换:父类 子类
        // 高                低
        Person person = new Student();  // 低转高,自动转换
        // person.go(); 无法调用 Student 子类的独有方法

        // 将 person 强制转化成 Student 类型,就可以使用 Student 类型的方法了
        Student student = (Student) person; // 高转低,强制转换
        student.go();   // 调用 Student 子类的独有方法
        // ((Student) person).go(); 简写方式
        student.run();  // 调用 Person 父类的方法
    }
}
public class Application {
    public static void main(String[] args) {
        // 类型之间转换:父类 子类
        Student student = new Student();
        student.go();
        // 子类转换为父类,可能会丢失自己的本来方法
        Person person = student;    // 低转高,自动转换
    }
}

类型转换 总结:

  1. 父类引用指向子类的对象
  2. 把子类转换为父类,向上转换
  3. 把父类转换为子类,向下转换,强制转换
  4. 方便方法的调用,减少重复的代码

static 关键字

package com.xxx.oop.demo10;
// static
public class Student {
    private static int age; // 静态变量(类变量)
    private double score;   // 非静态变量

    public static void main(String[] args) {
        Student s1 = new Student();
        // 通过对象方式调用 静态变量
        System.out.println(s1.age); // 0
        // 通过对象方式调用 非静态变量
        System.out.println(s1.score);   // 0.0
        // 通过类方式调用 静态变量
        System.out.println(Student.age);    // 0
        // 报错:通过类方式无法调用 非静态变量
        // System.out.println(Student.score);   // 编译报错
    }
}
package com.xxx.oop.demo10;
// static
public class Student {
    public void run(){      // 非静态方法
        go();   // 非静态方法中可以直接调用静态方法
        System.out.println("非静态方法");
    }
    public static void go(){    // 静态方法
        System.out.println("静态方法");
    }
    public static void main(String[] args) {
        // 静态方法调用
        go();   // 1. 直接调用
        Student.go();   // 2. 通过类方式
        new Student().go(); // 3. 通过对象实例方式
        // 非静态方法调用
        // run();  报错:不能直接调用非静态方法
        new Student().run();    // 只能通过对象方式调用 非静态方法
    }
}

补充

package com.xxx.oop.demo10;

public class Person {
    // 2. 匿名代码块:赋初始值
    {
        System.out.println("匿名代码块");
    }
    // 1. 静态代码块:只加载一次
    static {
        System.out.println("静态代码块");
    }
    // 3. 构造方法
    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("======================");
        Person person1 = new Person();
    }
}
package com.xxx.oop.demo10;
// 静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
    public static void main(String[] args) {
        System.out.println(random());   // 导入后直接调用
        System.out.println(PI);   // 导入后直接调用
    }
}

7. 抽象类和接口

抽象类

package com.xxx.oop.demo11;

// abstract 抽象类: 类继承 extends 单继承 (接口可以实现多继承)
public abstract class Action {
    // 约束,有人帮我们实现
    // abstract 抽象方法,只有方法名,没有方法的实现
    public abstract void doSomething();
    // 抽象类中可以存在普通的方法
    public void run(){
        System.out.println("抽象类中的普通方法");
    }
}
package com.xxx.oop.demo11;

// 抽象类的所有方法,继承它的子类都必须实现它的方法(重写),除非子类也是抽象类
public class A extends Action{
    // 重写父类的抽象方法
    @Override
    public void doSomething() {
    }
}

接口

package com.xxx.oop.demo12;

// interface 接口定义关键字 接口都需要有实现类
public interface UserService {
    // 常量(一般不这样用):默认:public static final
    int AGE=99;

    // 接口中的定义的方法都是抽象的,默认: public abstract
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}
package com.xxx.oop.demo12;

public interface TimeService {
    void timer();
}
package com.xxx.oop.demo12;
// 类实现接口 interface
// 实现了接口的类,就必须实现接口中的方法 快捷键:Ctrl + I
// 通过接口实现多继承 UserService,TimeService
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {
    }
    @Override
    public void delete(String name) {
    }
    @Override
    public void update(String name) {
    }
    @Override
    public void query(String name) {
    }
    @Override
    public void timer() {
    }
}

接口总结:

8. 内部类及 OOP 实战

上一篇下一篇

猜你喜欢

热点阅读