Day7-笔记(OOP、封装、继承、多态、static、instanceof、abstract)

面向对象编程---OOP

面向对象编程(objcet-oriented programming)oop

面向对象编程的本质就是:以类的方式组织代码,以对象的组织封装数据。

三大特性:封装、继承、多态

构造器详解

构造器:

	1. 和类名相同
	2. 没有返回值

作用:

	1. new本质就是在调用构造方法
	2. 初始化对象的值

注意点:

​ 如果定义了一个有参构造之后,如果想使用无参构造,必须要重新定义一个无参构造。

快捷键:Alt+Insert 插入方法自动生成get和set 无参有参构造方法

创建内存对象分析

栈:存放变量名

堆:存放对象

小结

  1. 类与对象

    类是一个模板:抽象,对象是类的实例

  2. 方法

    定义、调用!!

  3. 对象的引用

    引用类型:

    基本类型(8)byte short int long float double char boolean

  4. 属性 字段field 成员变量

    默认初始化:

    数字:0 0.0

    char: u0000

    引用:null

    修饰符 属性类型 属性名 =属性值!

  5. 对象的创建和使用

    必须使用new关键字创建对象,构造器 Person xiaoli = new Person();

    • 对象的属性 xiaoli.name

    • 对象的方法 xiaoli.eat()

  6. 静态的属性 属性

    动态的行为 方法

封装

封装:该露的露,该藏的藏。

  • 高内聚,低耦合

封装---数据的隐藏

​ 通常,应禁止直接访问一个对象中数据的实际显示,应通过操作接口来访问,这称之为信息隐藏。

属性私有,get/set访问与操作。

继承

子类继承父类的所有方法

public class Person {
    //JDK7的新特性
    protected int money = 10_0000_0000;

    public Person() {
        System.out.println("Person的无参构造方法");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
public class Student extends Person {
    private String name;
    private int age;
    private int studyID;
    private char sex;


    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 int getStudyID() {
        return studyID;
    }

    public void setStudyID(int studyID) {
        this.studyID = studyID;
    }

    public char getSex() {
        return sex;
    }

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

    public void print(Student student) {
        System.out.println("Name:" + student.getName());
        System.out.println("Sex:" + student.getSex());
        System.out.println("Age::" + student.getAge());
        System.out.println("StudyID:" + student.getStudyID());
    }

    public void sleep() {
        System.out.println(this.name + "在睡觉");
    }

    public void study() {
        System.out.println(this.name + "在学习");
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //alt+insert
    public Student() {
//        this();  //this 也是只能放在第一行,与super()只能二选一
        //隐藏代码:super(),调用父类的构造器,必须放在方法的第一行,否则会报错
        super();

        System.out.println("Student的无参构造方法");

    }
}

super注意点:

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

VS this:

​ 代表的对象不同:

​ this:本身调用者这个对象

​ super:代表父类对象的应用

​ 前提:

​ this:没有继承也可以使用

​ super:只能在继承条件才可以使用

构造方法:

​ this();本类的构造

​ super();父类的构造

多态

多态:同一方法可以根据发送对象的不同而采用多种不同的行为方式。

  1. 多态是方法的多态,属性没有多态

  2. 父类和子类,有联系 类型转换异常! ClassCastException!

  3. 存在条件:有继承关系,方法需要重写,父类引用指向子类对象

    Father f1 = new Son();

    以下方法不能被重写:

    • static方法,属于类,它不属于实例

    • final常量

    • private方法

// 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多(父类,有关系的类)
//        new Student();
//        new Person();
        //可以指向的引用类型就不确定了:父类的引用指向子类
        //Student 能调用的方法都是自己的或者是继承的父类的
        Student s1 = new Student();
        //父类型,可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();
        Object s3 = new Student();

        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
        s1.run();
        s2.run();
        ((Student) s2).study();//子类重写了父类的方法,执行子类的方法
        ((Student) s2).sleep();
        s3.toString();

instanceof

(类型转换) 引用类型

//        System.out.println(X instanceof Y);        //是否存在父子关系,存在则编译通过!!
        // object > String
        // object > Person > Student
        // object > Person > Teacher
        Object object = new Student();
        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
        System.out.println("==============================================");
        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); // 编译报错
        System.out.println("==============================================");
        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); // 编译报错
        System.out.println("==============================================");
    }
//类型之剑的转换:父    子
//高                低
Person obj = new Student();
//将student这个对象转换为Student类型。就可以使用Student类型的方法了。
((Student) obj).go();

//子类转换为父类,可能会丢失自己本来的一些方法!!!
Student student1 = new Student();
student1.go();
Person person = student1;
person.run

static详解

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();
    }
}
//静态导入包

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);
    }
}

抽象类abstract

//abstra 抽象类   extends:单继承
public abstract class Action {
    //约束  有人帮我们实现~
    //abstract 抽象方法,只有方法名字,没有方法的实现。
    public abstract void doSomething();

    //1. 抽象类不能new,只能靠子类去实现它:约束!
//2. 抽象类中可以写普通的方法
//3. 抽象方法必须在抽象类中
    public Action() {
        System.out.println("aaaaaaaaa");
    }
}
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非这个子类也是抽象类。
public class A extends Action {
    @Override
    public void doSomething() {
        System.out.println("dosomething");
    }
}

抽象类也有构造器!

存在的意义:程序的可扩展性!

posted @ 2021-07-09 22:05  xiaolifc  阅读(66)  评论(0)    收藏  举报