Java面向对象

本质

以类的方式组织代码,以对象的方式组织(封装)数据

三大特性

程序设计追求**高内聚,低耦合"。
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用

  • 封装
    即信息隐藏:通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问
    比如:类的属性私有化,仅提供get、set方法供外界访问
    好处:1. 提高系统安全性,比如set一个属性值得时候,可以加安全判断;2. 隐藏代码的实现细节;3. 统一接口,比如统一提供get、set方法操作私有属性;4. 增加系统可维护性
    封装思想:在于封装后外界无法直接操作类的属性,但提供了一些接口以便外界按照指定的方式操作封装的数据

  • 继承
    extends扩展,子类继承父类即对父类的扩展

    重写:需要有继承关系,子类重写父类的方法
    1. 方法名必须相同
    2. 参数列表必须相同
    3. 修饰符,范围可以扩大但不能缩小: public > protected > default > private
    4. 抛出的异常,范围可以缩小但不能扩大: ClassNotFoundException ---> Exception(大)
    简而言之,子类的方法和父类必须一致,方法体不同

  • 多态
    基于继承,父类引用指向子类对象
    同一对象不同类型引用,形成多态
    作用:以统一的接口(父类引用)来操纵某一类中不同对象(子类)的动态行为,实现对象之间的解耦

构造器

  • 定义有参构造器后,无参构造器必须显示定义

栈和堆

  • 对象是通过引用来操作的
  • 对象的引用即对象变量存放在栈中
  • 对象的引用指向的对象存放在堆中
  • 从这个角度可以理解:类用来组织代码,对象用来封装数据。不同对象具有不同的属性值以及方法的实现

super和this

super:
1. super调用父类构造方法,必须在构造方法的第一行
2. super必须只能出现在子类的方法或构造方法中
3. super()和this()不能同时出现在构造方法中,因为这super()或this()必须在构造器的第一句
this:
1. this表示对象本身

static

  • static修饰的变量或方法和类同时加载到内存中,所以可以通过类直接调用,也可以在所在类中直接调用
  • 非静态方法可以调用静态方法,反之则不行。因为,静态方法在调用非静态方法时,非静态方法还没有加载进内存
  • 静态代码块

抽象类和接口

  • 抽象类只能单继承,而接口可以多继承,所以接口比抽象类用的多
  • 面向接口编程:专业的约束,约束和实现分离
  • 本质:契约
  • 接口中默认修饰词,变量:public static final;方法:public abstract
  • implements实现多个接口,且必须重写其中的方法

instanceof

了解

成员内部类

package com.crazygod.oop;

public class Outer {
    private int id = 10;

    public void out() {
        System.out.println("外部类的方法");
    }

    public class Inner {
        public void in() {
            System.out.println("内部类的方法");
        }

        // 获得外部类的私有属性
        public void getID() {
            System.out.println(id);
        }
    }
}
package com.crazygod.oop;

public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        // 通过外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.getID();
    }
}

静态内部类

局部内部类

package com.crazygod.oop;

public class Outer {

    // 局部内部类(在方法中)
    public void method() {
        class inner {
            
        }
    }
}

匿名内部类

package com.crazygod.oop;

public class Test {
    public static void main(String[] args) {
        // 没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();

        UserService userService = new UserService() {
            @Override
            public void hello() {

            }
        };
    }
}

class Apple {
    public void eat() {
        System.out.println("1");
    }
}

interface UserService {
    void hello();
}
posted @ 2020-08-23 20:05  CrazyGod  阅读(108)  评论(0)    收藏  举报