java面向对象笔记

  1. 面向对象程序设计的重点是类的设计

  2. 类的设计, 其实就是类的成员的设计

  3. 类的访问机制:

    • 在一个类中的访问机制: 类中的方法可以直接访问类中的成员变量。 (例外: static方法访问非static,编译不通过。 )
    • 在不同类中的访问机制: 先创建要访问类的对象, 再用对象访问类中定义的成员。
  4. 对象的创建和使用:(内存层面)

    • 堆(Heap) , 此内存区域的唯一目的就是存放对象实例, 几乎所有的对象实例都在这里分配内存。 这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
    • 通常所说的栈(Stack) , 是指虚拟机栈。 虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、 byte、char 、 short 、 int 、 float 、 long 、double) 、 对象引用(reference类型,它不等同于对象本身, 是对象在堆内存的首地址) 。 方法执行完, 自动释放。
    • 方法区(Method Area) , 用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据
  5. 匿名对象 的使用情况 :

    • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个方法调用。
  6. 成员变量(属性)和局部变量的区别 :

    成员变量局部变量
    声明的位置直接声明在类中方法形参或内部、代码块内、构造器内等
    修饰符private、 public、 static、 final等不能用权限修饰符修饰,可以用final修饰
    初始化值有默认初始化值没有默认初始化值,必须显式赋值,方可使用
    内存加载位置堆空间 或 静态域内栈空间
  7. Java的实参值如何传入方法呢?

    Java里方法的参数传递方式只有一种: 值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

    • 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
    • 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
  8. 包的作用:

    • 包帮助管理大型软件系统: 将功能相近的类划分到同一个包中。 比如: MVC的设计模式
    • 包可以包含类和子包, 划分项目层次, 便于管理
    • 解决类命名冲突的问题
    • 控制访问权限
  9. 方法的重写(override/overwrite ):

  • 定义: 在子类中可以根据需要对从父类中继承来的方法进行改造, 也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
  • 要求:
    • 子类重写的方法必须和父类被重写的方法具有相同的方法名称、 参数列表
    • 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
    • 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
      • 子类不能重写父类中声明为private权限的方法
    • 子类方法抛出的异常不能大于父类被重写方法的异常
  • 注意: 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写) 。因为static方法是属于类的,子类无法覆盖父类的方法。
  1. 面向对象的多态性:
  • 多态性,是面向对象中最重要的概念, 在Java中的体现:对象的多态性:父类的引用指向子类的对象

    • 可以直接应用在抽象类和接口上
  • Java引用变量有两个类型:编译时类型运行时类型。 编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定。 简称:编译时, 看左边;运行时, 看右边

    • 若编译时类型和运行时类型不一致, 就出现了对象的多态性(Polymorphism)
    • 多态情况下, “看左边” : 看的是父类的引用(父类中不具备子类特有的方法)
      “看右边” : 看的是子类的对象(实际运行的是子类重写父类的方法)
  • 对象的多态 —在Java中,子类的对象可以替代父类的对象使用

    • 一个变量只能有一种确定的数据类型
    • 一个引用类型变量可能指向(引用)多种不同类型的对象
    Person p = new Student();
    
    Object o = new Person();//Object类型的变量o, 指向Person类型的对象
    
    o = new Student(); //Object类型的变量o, 指向Student类型的对象 
    
    • 子类可看做是特殊的父类, 所以父类类型的引用可以指向子类的对象:向上转型(upcasting)
  • 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法

Student m = new Student();
m.school = “pku”; //合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”; //非法,Person类没有school成员变量属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误
  • 虚拟方法调用(Virtual Method Invocation)

    • 正常的方法调用

      Person e = new Person();
      e.getInfo();
      Student e = new Student();
      e.getInfo(); 
      
    • 虚拟方法调用(多态情况下)

    子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。

    Person e = new Student();
    e.getInfo(); //调用Student类的getInfo()方法
    
    • 编译时类型和运行时类型

      编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。 ——动态绑定

  • 多态小结

    • 多态作用: 提高了代码的通用性,常称作接口重用 。
    • 前提: 需要存在继承或者实现关系;有方法的重写 。
    • 成员方法:
      • 编译时:要查看引用变量所声明的类中是否有所调用的方法。
      • 运行时: 调用实际new的对象所属的类中的重写方法。
    • 成员变量: 不具备多态性,只看引用变量所声明的类。
  1. 对象类型转换 (Casting )

    • 基本数据类型的Casting:

      • 自动类型转换:小的数据类型可以自动转换成大的数据类型

        //ex:
        long g=20;
        double d=12.0f
        
      • 强制类型转换: 可以把大的数据类型强制转换(casting)成小的数据类型

        //ex: 
        float f=(float)12.0;
        int a=(int)1200L
        
    • 对Java对象的强制类型转换称为造型

      • 从子类到父类的类型转换可以自动进行
      • 从父类到子类的类型转换必须通过造型(强制类型转换)实现
      • 无继承关系的引用类型间的转换是非法的
      • 在造型前可以使用instanceof操作符测试一个对象的类型
  2. 基本类型、包装类与String类间的转换
    在这里插入图片描述

  3. 类属性、类方法的设计思想 :

    • 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性,相应的方法设置为类方法。
    • 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
    • 使用范围: 在Java类中, 可用static修饰属性、 方法、 代码块、 内部类
    • 被修饰后的成员具备以下特点:
      • 随着类的加载而加载
      • 优先于对象存在
      • 修饰的成员,被所有对象所共享
      • 访问权限允许时,可不创建对象,直接被类调用
  4. 代码块:

    • 代码块(或初始化块)的作用:对Java类或对象进行初始化
    • 代码块(或初始化块)的分类: 一个类中代码块若有修饰符, 则只能被static修饰, 称为静态代码块
      (static block), 没有使用static修饰的, 为非静态代码块
    • static代码块通常用于初始化static的属性
    • 静态代码块用static 修饰的代码块
      • 可以有输出语句。
      • 可以对类的属性、类的声明进行初始化操作。
      • 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
      • 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
      • 静态代码块的执行要先于非静态代码块。
      • 静态代码块随着类的加载而加载,且只执行一次。
    • 非静态代码块没有static修饰的代码块
      • 可以有输出语句。
      • 可以对类的属性、 类的声明进行初始化操作。
      • 除了调用非静态的结构外, 还可以调用静态的变量或方法。
      • 若有多个非静态的代码块, 那么按照从上到下的顺序依次执行。
      • 每次创建对象的时候, 都会执行一次。 且先于构造器执行。
  5. 程序中成员变量赋值的执行顺序
    在这里插入图片描述

  6. 在Java中声明类、 变量和方法时, 可使用关键字final来修饰,表示“最终的” 。

    1. final标记的类不能被继承。 提高安全性, 提高程序的可读性。

      ex : String类、 System类、 StringBuffer类

    2. final标记的方法不能被子类重写。

      ex : Object类中的getClass()。

    3. final标记的变量(成员变量或局部变量)即称为常量。 名称大写, 且只能被赋值一次。

      • final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值, 然后才能使用。
      • static final:全局常量
  7. 接口(interface) :

  • 接口(interface)是抽象方法常量值定义的集合。
  • 接口的特点:
    • 用interface来定义。
    • 接口中的所有成员变量都默认是由public static final修饰的。
    • 接口中的所有抽象方法都默认是由public abstract修饰的。
    • 接口中没有构造器。
    • 接口采用多继承机制。
     public interface Runner {//接口样例
     public static final int ID = 1;
     public abstract void start();
     public abstract void run();
     public abstract void stop();
     } 
  • 定义Java类的语法格式: 先写extends,后写implements
    class SubClass extends SuperClass implements InterfaceA{ }
    
  • 一个类可以实现多个接口, 接口也可以继承其它接口。
  • 实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。
  • 接口的主要用途就是被实现类实现。 (面向接口编程)
  • 与继承关系类似,接口与实现类之间存在多态性
  • 接口和类是并列关系, 或者可以理解为一种特殊的类。 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义(JDK7.0及之前), 而没有变量和方法的实现。
  1. 接口和抽象类之间的对比 :
区别点抽象类接口
定义包含抽象方法的类主要是抽象方法和全局常量的集合
组成构造方法、抽象方法、普通方法、常量、变量常量、抽象方法、 (jdk8.0:默认方法、静态方法)
使用子类继承抽象类(extends)子类实现接口(implements)
关系抽象类可以实现多个接口接口不能继承抽象类,但允许继承多个接口
常见设计模式模板方法简单工厂、工厂方法、代理模式
对象都通过对象的多态性产生实例化对象都通过对象的多态性产生实例化对象
局限抽象类有单继承的局限接口没有此局限
实际作为一个模板是作为一个标准或是表示一种能力
选择如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值