面向对象编程 OOP

概述 Overview
说明
OOP:Object-Oriented Programming
以类的方式组织代码;以对象的形式封装数据
类是抽象的,是对对象的抽象;是对象的模板
对象是具体的;是类的实例
类由属性和方法组成
一个项目应该只有一个主函数main;不要每个类都指定一个main;多个main会报错
[]类的使用
Stu类:只有属性和方法
package base.class1;

public class Stu {
    String name;

    public void greeting() {
        System.out.println("hi,there.");
    }
}
OOP类:主类main,并使用Stu类
package base.class1;

public class OOP {
    public static void main(String[] args) {
        Stu stu = new Stu();
        stu.name = "gl";
        System.out.println(stu.name);
        stu.greeting();
    }
}
特性
类是抽象的
.封装
.继承
.多态
构造器 Constructor
说明
每个类默认都有一个 同名 的函数,即使你不显式的定义也会存在,这个函数就是类的构造器
构造器是公有public类型
构造器函数 没有 返回类型,即使void也不可以
作用:初始化对象
类的实例化new本质上就是调用类的构造器
构造器通常也以重载的方式给出
如果显式的声明了带参构造器,则无参new一个实例时,就会告错,必须同时显式的声明无参构造器/默认构造器
[]构造器的使用
类的默认构造器 - 不写也有
package base.class1;

public class Stu {
    public Stu() { }
}
显式声明带参构造器
package base.class1;

public class Stu {

    public Stu(String str) {
        this.name = str;
    }
}
[]如何快速生成/自定义构造器
封装 Constructor
说明
对数据细节的隐藏:该暴露的暴露,该隐藏的隐藏;属性通常是私有private
高内聚:类的内部细节自己完成,不允许外部干涉
低耦合:暴露少量的方法[不是属性]给外部使用
[]getter/setter的使用
[]如何快速生成/自定义构造器
继承 Extends
说明
一个类继承另外一个类的属性或方法
继承是 类和类 之间的关系:父类/基类、子类/派生类
子类继承父类,使用关键字extends
Object是所有类的父类
Java只有单继承;没有多继承:一个父类可以有一个或多个子类,但是一个子类只能有一个直接父类
子类可以继承父类的公有public属性和方法
final类不可以被继承
this:当前对象/调用者;没有继承也可以使用
super:只能存在子类中;代表父类对象,可以直接访问父类的属性和方法;只有存在继承的时候才可以使用;可以出现在任何地方
super([para,...]):调用父类的无参或有参构造方法,只能出现在子类的构造函数中,且只能是第一条语句 First Statement;注意sout也是语句
extends继承
public class Stu extends Person {
    // ... ...
}
super代表父类
public class Duck  extends  Ani{
    String name="duck";
    public  void  barking(){
        String name="barking animal";
        System.out.println("name: "+name);
        System.out.println("name: "+this.name);
        System.out.println("name: "+super.name);
    }
}
子类实例化时会自动执行父类的构造函数:默认在子类构造函数第一行添加super()
package basic.superUse;

class  Ani{
    public  Ani(){
        System.out.println("Ani()");
    }
}
class  Bird extends  Ani{
    public  Bird(){
        System.out.println("Bird()");
    }
}
public class SuperDemo {
    public static void main(String[] args) {
        Bird bird=new Bird();
    }
}
[]如何查看继承树
方法重写 Override
说明
重写是方法的重写;属性没有重写
只能重写公有public方法,static、final和private方法不能被重写
重写需要继承关系:子类重写父类的方法
方法名必须相同
形参列表必须相同
仅仅方法体不同
使用范围可以扩大,但是不能缩小
多态 Polymorphism
说明
Java类的多态指的是 成员方法 的多态:同一个方法对不同的对象有不同的实现
同一个方法根据发送对象的不同而采用多种不同的行为方式
多态是方法的多态;属性没有多态
[]吃
Animal动物类中:Bird鸟吃虫子;Cat猫吃老鼠;Panda熊猫吃竹子;
三要素
1. 多态需要继承关系,否则会出现ClassCastException/类调用异常
2. 多态需要重写方法;static、final和private方法不能被重写
3. 一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多:父类引用指向子类对象
Animal animal = new Cat();
animal.eat();
instanceof
判断一个对象实例instance是什么类型