黑马程序员java学习日记九 面向对象的理解

1. 理解面向对象
   (1) 类:是对现实生活中事物的描述
        对象:对这类对象事物,实实在在的个体
   (2) 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象是将功能进行封装,强调具备了功能的对象。
   (3) 当多个引用指向同一个对象时,那么他们的内存地址值是相同的;在内存中,成员变量存在于堆内存,而局部变量存在于栈内存中。
   (4) 匿名对象格式:
             —— new Person().getName()
             —— new Person().getAge()
             —— new Person().eat()
   这是三个不同的对象,在内存中都有各自的空间/地址,独立存在
   (5) 封装:隐藏内部实现,对外提供功能
         —— 好处:将变化隔离,便于使用,提高安全性,提高重用性
         —— 实现:通过get/set方法对属性进行封装
         —— 成员变量如果不赋值,会有默认初始化值;而局部变量必须赋值,否则不能进行运算
   (6) 构造代码块 {...} —— 作用:给所有对象初始化,并对不同对象初始化共性内容,构造代码块优先于构造函数执行
   (7) this关键字 : 在类中使用,调用的是当前对象,且this是一个引用;在构造函数中使用this()可调用其他构造函数,但必须在第一行,和super()类似
 
2. 静态 static
    (1)定义:常用于修饰成员变量、成员函数,它在内存中存在于方法区中,并随着类的加载而存在,可以称其为类变量
    (2)特点:随着类的加载而加载、优先于对象的存在、被所有对象共享、直接被类名调用(类名.成员)
    (3)使用范围:被多对象调用,如果过多使用static变量,会消耗大量内存。
    (4)类变量和实例变量的区别
         ——存放位置:类变量随着类的加载而加载,并存在方法区中;而实例变量是随着对象的建立而存在堆内存中。
         ——生命周期:类消失则类变量随着消失;而实例变量消失的前提是,对象消失
    (5)使用static的注意事项
         ① 静态方法只能访问静态成员
         ② 静态方法中不可以存在this、super关键字
         ③主函数是静态的
    (6)主函数:优先加载到方法区中,重载它
    (7)什么时候使用静态?
        ①什么时候使用静态变量? ——在多对象中出现共享数据时,可将该数据用静态修饰
        ②什么时候使用静态函数? ——当功能内部没有访问到非静态数据且没有使用到对象的特有数据时,可将该功能用静态修饰
   (8)静态工具类:私有化构造函数,使其不能被实例化,并提供公有、静态的功能。
   (9)帮助文档的制作:javadoc  -d  文档名  -author  -version
   (10)静态代码块 :static{...},特点是随着类的加载而加载,且只需加载一次。
         一个类中包含静态代码块、代码块、成员,他们的执行顺序是:
           ①new一个类,类先加载到内存
            ②执行static代码块
           ③在内存中开辟空间、分配内存地址
           ④在堆内存中建立对象特有属性并默认初始化值
            ⑤对属性显示初始化
            ⑥对对象进行构造代码块初始化
            ⑦对对象的构造函数初始化
            ⑧将内存地址赋给栈内存中的引用变量
   (11)单例设计模式:保证对象唯一
              ——步骤:①将构造函数私有化 ②在本类中建立一个本类对象 ③提供一个公有、静态的方法获取实例  
              ——饿汉式(推荐使用)
              public class Single {
               private Single(){}
 
               private static Single s=new Single();
 
               public static Single getInstance(){
                            return s;
          }
 
}
              ——懒汉式 
              public class Single {
               private Single(){}
 
               private static Single s=null; 
               public static Single getInstance(){
                         if(s==null){
                               synchnoized(Single.class){//加上同步,防止多线程创建多个实例,使用的锁是字节码文件对象
                                   if(s==null){
                                       return s;
                                    }
                               }
                       }
              }
 
}
 
3.继承(extends)
   (1)概述:必须有所属关系(is a),java中支持多层继承,调用时,应该创建最子类的对象
    (2)子父类中变量的特点:子类可以使用super.属性名方法父类的属性,super只能在第一行
  子父类中构造函数的特点:子类一定会访问父类中的构造函数
    (3)重写(覆盖):子类的方法名、参数列表、返回值类型必须和父类的一致且子类的访问权限不能小于父类,且静态不能覆盖非静态。
    (4)重载:如果两个函数的方法名相同,参数列表不同,且与返回值无关,那么他们是重载关系
    (5)结论:
       ①子类中所有的构造函数,默认都会访问父类的空参数构造函数
       ② super()只能在第一行
       ③子类实例化,都会走父类且this、super不能同时在第一行
   (6)final修饰符
       final修饰类:类不能被继承
       final修饰方法:方法不能被重写
       final修饰变量:变量变成常量,不能再次赋值,常量名应全部大写
   (7)抽象类:不能实例化的类
        抽象类可以包含非抽象方法
        抽象方法只能存在抽象类中
        子类继承抽象类必须覆盖抽象方法,若子类未覆盖所有抽象方法,那么子类还是一个抽象类
  (8)模版方法模式——将变化的代码封装成模版
  (9)接口:是一个特殊的抽象类
       特点:在接口中包含全局静态常量,全局抽象方法,不能被实例化;子类用implemens来实现接口,可实现多个接口;接口可以继承多个接口。
 
4.多态:事物存在的多种体现形态
  (1)多态的基本体现:父类的引用指向子类对象,Person p=new Student()
   (2)多态的前提:多子类继承父类,子类覆盖父类的方法
   (3)多态的好处:提高代码复用性、程序扩展性
   (4)多态的应用:成员函数在多态调用中,编译时参考左边,运行时参考右边;而成员变量无论编译、运行都参考左边
   (5)多态的扩展示例(PCI主板示例)
   (6)Object类:所有类的父类,提供了最基本的方法
         equals():用于两个对象的比较(比较内存地址值)
         toString():返回该对象的字符串
         hashCode():获取对象的哈希值
         getClass():获取类的示例
         getMethod():获取对象的方法组       

你可能感兴趣的:(黑马程序员java学习日记九 面向对象的理解)