Java基础——面向对象

1. 面向过程&面向对象

1.1. 面向过程

是一种线性的,第一步做什么,第二步做什么......

适合处理简单的问题。

1.2. 面向对象

运用分类的思维模式,思考问题要先进性哪些分类,然后对这些类进行单独思考。

适合处理复杂的问题。

对于复杂的问题,需要从宏观的整体上进行分析,需要使用面向对象的思路分析整个系统。但具体到微观,仍需使用面向过程的思路去处理。

2. 什么是面向对象

本质:以类的方式组织代码,以对象进行组织(封装)数据。

对象,是具体的事物,类,是一个抽象的概念。

3. 类和对象的关系

3.1. 类

类是一种抽象的数据类型,他是对某一事物进行整体描述/定义,但并不能代表一个具体的事物。

3.2. 对象

对象的抽象概念的具体实现

4. 创建与初始化对象

使用new 关键字进行对象的创建,对象的属性会被初始化为默认值。

5. 构造器/构造方法

  1. 使用new关键字,本质上是调用构造器,用于初始化值
  2. 构造器,必须和类名相同,必须没有返回值,也不能写void
  3. 分为无参构造器和有参构造器,一旦定义了有参构造,必须显示的定义无参构造
  4. alt + insert 生成构造器快捷键

6. 面向对象的三大特性

6.1. 封装

  1. 高内聚:类的内部数据操作细节由自己完成,不允许外部干涉。
  2. 低耦合:仅暴露少量的方法给外部使用。
  3. 属性私有,get/set
  4. 意义:

        4.1. 提高安全性,保护数据

        4.2. 隐藏了代码的实现细节

        4.3. 统一接口

        4.4. 增加了系统的可维护性

6.2. 继承

  1. 继承的本质是对某一批类的抽象,如老师和学生类可以抽象为人类
  2. 使用extends关键字进行扩展,子类扩展父类,子类 is a 父类
  3. Java中只有单继承,没有多继承
  4. 子类会继承父类的所有除private的属性和方法
  5. ctrl + H打开继承树的快捷键
  6. Java中所有的类,都直接或间接的继承Object类
  7. super关键字,用于在子类中访问父类的属性this关键字,调用自己的属性和方法。
  8. 实例化子类会先默认调用父类的构造器,且必须放在构造方法的第一个
  9. 方法重写,需要有继承关系,子类重写父类

        a. 方法名必须相同,参数列表相同。

        b. 修饰符的范围可以扩大,但不能缩小(public > protected > default > private)

        c. 抛出的异常,范围只能缩小,不能扩大

        d. 父类的引用可以指向子类

        e. 只能重写非静态方法

// 主类
public static void main(String[] args) {
    A a = new A();
    a.test(); // A=>test  如果是static方法 输出A=>test
    B b = new A();
    b.test();  //  A=>test 如果是static方法 输出B=>test
}
// 父类
public class B {
    public void test(){
        System.out.println("B=>test");
    }
}
// 子类
public class A extends B{
    public void test(){
        System.out.println("A=>test");
    }
}

6.3. 多态

  1. 同一方法可以根据发送对象的不同而采用多种不同的行为方式
  2. 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
  3. 多态是方法的多态,没有属性的多态
// 父类
public class Person {
    public void run(){
        System.out.println("Person");
    }
}
// 子类
public class Student extends Person{
    @Override
    public void run() {
        System.out.println("Student");
    }
    public void test(){
        System.out.println("Student => test");
    }
}
// 主方法
public static void main(String[] args) {
        Student s1 = new Student();
        s1.run();  // Student
        s1.test(); // Student => test Student能调用自己和继承自父类的方法
        // 父类型,可以指向子类,但不能调用子类的方法
        Person s2 = new Student();
        s2.run();  // Student 父类方法被重写

        // 对象能执行哪些方法,主要看左边的类型,和右边关系不大
    }
  1. 存在条件:必须有继承关系,并进行方法重写,父类的引用指向子类对象。

6.4. instanceof与类型转换

  1. A instanceof B 判断 A 是否是 B的实例对象 返回值为true/false
  2. 把子类转化为父类,向上转型,自动完成,可能会丢失一些方法
  3. 把父类转换为子类,向下转型,强制转换

7. 抽象类

  1. 使用abstract修饰的类,叫做抽象类,不能new,只能靠子类实现
  2. 使用abstract修饰的方法,为抽象方法,只进行声明,非抽象子类必须进行实现
  3. 抽象方法必须在抽象类中,抽象类中也可以有非抽象方法

8. 接口

  1. 接口只有规范,接口的本质是契约
  2. 接口中的所有方法都是public abstract的,所有属性都是静态常量
  3. 使用interface进行定义
  4. 接口必须要有实现类,使用implements进行实现,实现了接口的类,必须重写接口中的方法
  5. extends只能进行单继承,但implements可以实现多个接口
  6. 接口不能被实例化,没有构造方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值