面向对象(OOP)08~17

发布时间 2023-11-01 11:09:28作者: 两块五的菜鸟

面向对象(OOP)08~17

1.封装

​ "高内聚、低耦合",内部细节自己完成;仅暴露少量方法给外部使用。

属性私有,get/set

// private : 私有
public class Student {
	// 属性私有
    private String name; // 名字
    private int id;  //学号
    private char sex; //性别
    // get 获取数据
    public String getName(){
        return this.name
    }
    // set 设定数据
    public void setName(name){
        this.name = name;
    }
}

2.继承(对类的抽象)

​ 类之间有父子关系,通过extends来继承,也可理解为子类是父类的扩展。

​ 继承有两个成员,一个子类(派生类),一个父类(基类);

​ 2.1.子类可以继承父类的所有的方法;

​ 2.2.父类私有的无法继承;

​ 2.3.Java中所有的类都继承Object类;

3.Super详解(与this相似,this指当前,Super指父类)

public class Student extends Person{
    public Student(){
        // 隐藏代码  super()  //会先执行父类的构造函数
        System.out.println("student 执行了")
    }
}

​ 1.super调用父类的构造方法,必须在构造方法第一行

​ 2.super只能出现在子类的方法或者构造方法中

​ 3.super和this不能同时在构造方法中

4.方法重写(子类中同名同参方法可以替代父类中的同名同参方法)

​ 4.1 父类的引用可以指向子类,方法重写后,调用的是子类的方法

​ 4.2 重写只于非静态的方法、公有有关

​ 4.3 重写只存在于子父类中

​ 4.4 重写的原因:子类的方法和父类需求不一致

5.多态(同一个方法根据发送对象的不同而采取多种不同的行为方式)

​ 5.1 可以实现动态编译

​ 5.2 一个对象的实际类型是确定的,但父类的引用可指向子类,引用类型可以有很多。

// 对象执行的那些方法,主要看左边的类型
// student 能调用自己和父类的方法
Student s1 = new Student();
// 父类可以指向子类,但是不能调用子类的方法
Person  s2 = new Student();
Object  s3 = new Student();

​ PS: static(属于类,不属于实例),final,private 都没有多态

6.instanceof 和 引用类型转换

​ 1.instanceof 可判断类之间又没有父子关系;

System.out.println(x instanceof y);  //x,y 之间是否父子关系

​ 2.引用类型强制转换 父高子低 类型可以由低到高

Person p = new student();

​ PS:父类转成子类,可能会丢失方法;

7.static 关键字详解

​ 1.静态属性(变量):类变量,可以通过类直接访问

​ 2.静态方法:类方法,可以通过类直接访问,非静态方法可以直接调用静态方法

​ 3.静态代码块:加载初始化数据,在构造函数之前,永久只执行一次

public class Person {
	{
		//匿名代码块
	}
	static {
		//静态代码块
	}
	public person{
		// 构造函数块
	}
}

// 静态->匿名->构造函数

​ 4.静态导入包

import static java.util.Math.roandom.

8.抽象类

​ 1.通过abstract来修饰类

// abstract
public abstract class Action{
    // 抽象方法,只有约束,不用实现
    public abstract void doSomething();
}

​ PS:不能new出来,只是一个约束;抽象类可以写抽象方法;抽象的方法必须在抽象类里

9.接口的定义和实现

​ 1.关键字interface,只有约束

public interface UserService {

    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}


public class UserSerivceImpl implements UserService{

    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }
}

​ 2.可以实现多继承

​ 3.接口的属性就是常量

​ PS:一个好的架构师,就会抽象完成整个项目的接口定义

10.N中内部类(在类的内部定义一个类)

​ 1.类中内部类

public class Outer {

    private int id;
    public void out(){
        System.out.println("outer function");
    }

    public class Inner{
        public void in(){
            System.out.println("Inner function");
        }

        // 内部类可以获取外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
    }
}

Outer outer = new Outer();

​ 2.方法内部类

public void method(){
	class person{
		//方法内部类
	}
}

​ 3.匿名内部类

new Apple.eat()