黑马程序员训练营--------java对象及对象特征

        ---------------------------  中关村黑马程序员训练营 --------------------------------

                                 面向对象及对象的特征 
.------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
   

1.Java语言特点
简单性 
解释性
面向对象 
高性能
分布式处理
多线程
健壮性
动态
结构中立
安全性
开源
跨平台

 

2.什么是面向对象?
      把许许多多相似的功能方法函数封装在一起,组成一个对象,由这个对象来调用它里面的所有的功能方法


3.类与对象关系

 类:  是一组对事物的相关的属性(变量)和行为(方法)的集合。  是个抽象的概念(车设计图纸)
对象:是该类事物的一个具体存在的实列 。                 是个具体的实例对象  (A汽车B汽车C汽车)

 

 4.JAVA的开发,设计,特征
  面向对象开发      就是不断的创建新对象,使用对象,指挥对象做事情。
  面向对象设计      其实就是在管理和维护对象与对象之间的关系。
  面向对象三大特征      封装(encapsulation)     继承(inheritance)      多态(polymorphism)


A.封装(encapsulation)
  定义: 是指隐藏 本类的成员(变量,方法)(私有化了)和实现细节, 只对外提供公共访问方法 。
   好处: 隐藏本类的实现细节,只对外提共公共访问方法。提高代码安全性(避免外人篡改)。提高复用性
 设计原则: 把不想让外界知道的实现细节给隐藏起来,只提供公共的访问方式
  封装的体现:类(封装成员变量,方法);方法(封装代码),private修饰成员变量(封装成员变量)

  B.继承(inheritance)      // 使用继承体现is  a关系。   谁(子类)是(is a)谁(父类)的一种
    (1)定义:将多个类中 相同的  内 容抽取到 另一个类中,
                   那么多个类(子类)无需再定义这些内容 ,只要继承另一个类(父类)即可。
       (2)继承的好处:
  A:提高了代码的复用性(代码可多次使用)
  B:提高了代码的维护性(便于代码的方便修改)
  C:让类与类产生了一个关系(父子关系),是多态的前提 (双刃剑,即使好处又是弊端)
    (3)继承的弊端:
         A:让类与类之间的耦合性(关系)增强。(设计程序要:要低耦合(降低类与类的关系),高内聚(提升程序自身的独立性))
        
    (4) Java中继承的特点 
               A. 只能单继承, 不支持多继承。(只有一个老爹)
               B.支持多层继承
       (5)   Java中继承的注意事项
               A.子类只能继承父类所有非私有的成员方法和成员变量
           B.  子类不能继承父类的构造方法,但是可以通过super 关键字去访问父类构造方法
  
    (5.5)Java继承中的成员关系
  A:成员变量
   a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
   b:子类的成员变量名称和父类中的成员 变量名称一样,这个怎么访问呢?
    子类的方法访问变量的查找顺序: //就近原则
     在子类方法的局部范围找,有就使用。
     在子类的成员范围找,有就使用。
     在父类的成员范围找,有就使用。
     找不到,就报错。
  B:构造方法
   a:子类的构造方法默认会去访问父类的无参构造方法 super()
    是为了子类访问父类数据的初始化
   b:父类中如果没有无参构造方法,怎么办?
    子类通过super(..)去明确调用父类的带参构造,再手动添加一个super()
    子类通过this(...)调用本身的其他构造方法,但是一定会有一个构造方法去访问了父类的构造
    让父类提供无参构造
  C:成员方法
   a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
   b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
    通过子类对象访问一个方法的查找顺序:
     在子类中找,有就使用
     在父类中找,有就使用
     找不到,就报错 

       (6)继承中子类的构造方法与父类的构造方法关系--1
                             (子)类中所有的构造方法(不带参,带参)默认都会访问父类中空参数的构造方法 super()
                            因为子类要继承父类,就要使用父类的数据,
                             所以子类在初始化之前,一定要先完成对父类的数据的初始化,才能使用父类的数据
                              所以 子类的所有的构造方法里的第一条语句上有一个默认 的:super(); ,
                               super()是子类构造方法调用父类的空参构造方法,   以完成对父类的数据的初始

  (7) .继承中子类的构造方法与父类的构造方法关系___2
                                                              
                   如果父类中没有空构造方法(被我搞没了),该怎么办呢?
                               
                          报错  无法将父类的构造器应用到给指定类型
                           改错   1. 在父类人为定义一个空构造方法 ,在定义一个有带参构造方法(覆盖了默认空构造方法)
                                  2.在父类不定义构造方法,用系统默认的空构造方法
                                      
                             
                           所以我们定义父类的构造方法,一定要定义父类的空构造方法(可以是自定义的,也可以是默认的空构造方法)
                            不能单独定义有参构造方法,(而把默认的空构造方法给覆盖了)+在加个自定义的空构造方法

                                 
                                  3.子类的构造方法里通过调用  super(参数name) ,去显示的调用父类的相对应的带参构造方法
            这样也能达到对父类的数据的初始化
                                   
                                    
                                  4.子类一个构造方法里有this()或this(有参)去调用本类的其他构造方法
                                    (其他的构造方法(有super()或super(有参))能访问父类的对应的构造方法,也能初始化父类的数据)
                            总之,子类中一定要有一个能访问 父类的构造方法,否则父类数据就没有初始化。
                                  
                               5. 注意:super(…)或者this(….) 必须出现在构造方法内的第一条语句上,
                                         就会有父类数据的多次初始化

           (8) 子类成员方法复写父类的方法 注意事项
                               A 父类中私有成员方法不能被子类重写
                           (子类(外类)根本无法访问父类的私有方法)(子类父类都有相同的成员方法,子类会复写父类的成员方法,输出子类的方法体内容)
                               B子类的访问权限>=父类的访问权限
                                C父类静态方法,子类也必须通过静态方法进行重写。
      (9)
      方法重写和方法重载的区别?方法重载能改变返回值类型吗?

             
    Override重写
               在子类中出现一个方法,和父类的一个方法一模一样(返回值类型,方法名,参数列表都一样), 就是方法体内容不同,
       子类对象调用此方法时,以使用子类的方法体为主(把父类的方法体内容给覆盖掉,编译看左边,运行看右边(多态表现))
 
    /*子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。
        子类方法的访问权限只能比父类的更大,不能更小。
     如果父类的方法是private类型,那么,子类则不能覆盖重写,相当于子类中增加了一个全新的方法。
*/
 

               Overload重载(load 加载)
                   同一个类中,出现多个方法,方法名相同, 参数列表不同 (参数类型,参数个数不同) ,与返回值类型无关                        
            
                  并且,方法重载能改变返回值类型,因为与返回值类型无关   

 

C.多态(polymorphism
 
        (1)定义:多态:同一个对象(事物),在不同时刻体现出来的不同状态。
         (2)多态的前提:
          A:要有继承或实现关系。//(子父类关系)
                B:要有方法重写。 子类有特有的方法,所以要重写父类的方法。 //(子类方法(方法体内容)复写父类的方法(方法体内容))
                 C:要有 父类 或 父接口 引用指向子类对象。     //父 f =  new 子();
         
          (2.0)多态的好处:
  A:提高了代码的维护性(继承保证,方便代码的修改,只用修改父类的代码)
  B:提高了代码的扩展性(由多态保证)  //useAnimal(Animal a)
          (2.1) 多态的几种分类:
          A:具体类多态
                 class   fu{}  class zi extends fu{}
                                Fu f = new zi();  
          
                
                 
          B:抽象类多态(常用)
      abstract class   fu{}  class zi extends fu{}
                                Fu f = new zi();
          C:接口多态(最常用)(接口的具体子类,实现接口,添加自己的方法体内容)
        interface   fu{}   class zi  implements  fu{}
                                Fu f = new zi();
          (3)多态中的成员访问特点:
    A:成员变量(重点)  
   多态时成员变量编译看左边(代表父类 ),运行结果看左边(父类)。     (运行父类的成员变量值)(父类的成员变量不能被子类覆盖)
                                                                     (子类与父类的成员变量名相同,变量没有覆盖重写,所以要输出父类的变量值)
  B:构造方法(访问子类的构造方法,先访问父类的构造方法)
   创建子类对象的时候,访问子类的构造方法,先访问父类的构造方法,对父类的数据进行初始化。
  C:成员方法(重点)
   多态时成员方法编译看左边(父类)          ( 必须是父类有的成员方法才能被编译通过)(代表父类 Fu f),
              但运行结果看右边(子类)               (输出子类的方法体内容)(因为有子类的方法覆盖重写了父类的方法)。
  D:静态方法
   编译看左边(代表父类 Fu f),运行看左边。

   /*(静态方法和类相关,算不上重写,所以,访问还是左边的父类的静态方法)
    class fu{public static void show(){sop("show fu")}}
     class fu extends fu {public static void show(){sop("show zi")}}
     class test{
        fu f = new zi();
          f.show(); } //输出父类的静态方法体内容  show fu*/
            
          (4)多态的好处:
  A:提高了代码的维护性(继承保证,方便代码的修改,只用修改父类的代码)
  B:提高了代码的扩展性(由多态保证)  //useAnimal(Animal a)


                //建立一个父类的工具类
                  class AnimalTool{
                  //把类AnimalTool的构造方法,进行私有化,不能让外界建立对象,来调用这个类,
            private AnimalTool(){}
  
               public static void  useAnimal(Animal a){//多态,Animal a指向所有的具体实例子类对象
                                                    //此就是多态的扩展性表现,对任意想要的具体 动物对象,都可实现造出来
         a.eat();a.jiao();}  }
 

        (5)多态的弊端  :父类不能访问子类特有功能方法
         (6)如何才能解决访问子类的特有功能呢?    多态中的转型
           A.向上转型;
                               子---> 父    父类引用指向子类对象
                                           Fu f = new Zi();  
                             f.成员变量  //输出父类的成员变量值  //成员变量不能重写
              f.成员方法   //输出子类的方法体内容//重写覆盖了父类的方法体
               f.playGame();//输出子类的特有功能方法体内容
                   B.向下转型;         
                            父---->子     父类引用f转为子类引用Zi z
                                           Zi z  = (Zi)f;
                         z.成员变量  //输出子类的成员变量值  
              z.成员方法   //输出子类的方法体内容
               z.playGame();//输出子类的特有功能方法体内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值