第十七天 面向对象之多态

今日内容:

1.继承的注意事项:

1)子类继承父类,继承的是非私有成员变量/方法,私有成员变量/方法只能通过间接方法访问

例如:创建一个父类一个子类,父类有私有和共有成员变量,私有和共有成员方法,代码如下

 分别访问父类的成员变量:

分别访问父类的成员方法:

若要强行访问则可以通过间接的方式:

 私有成员变量通过公用方法访问

public void show (){

System.out.println(b);

System.out.println(show fu);

}

私有成员方法通过公用方法访问:

public void showMsg(){

method();

}

结果如下:

2)子类继承父类,构造方法不能继承,只能通过super()(每个子类构造方法都默认第一句有super();)访问

面试题:继承关系中, 父类中如果没有无参构造方法,子类会出现什么情况?如何解决呢?
 
          子类全部报错,子类的所有构造方法都默认访问父类的无参构造方法(子类的所有构造方法的第一句话super();,可以省略不写)
 
 1)解决方案1:永远给出父类的无参构造方法
 2)如果现在不给出父类无参构造方法,如何解决呢?
                   让子类的所有构造方法显示的访问父类的有参构造方法!(只要父类出现初始化 :执行构造方法就是初始化)

super();强行访问父类有参构造方法

代码如下:

 结果:


 3)子类的所有构造方法中的某一个只要能够让父类初始化即可!
 
                       创建Zi zi = new Zi() ; 在执行Zi类的无参构造方法的时候
                       让它先执行子类的有参构造方法 this(xx) ;
                       让后在子的有参构造方法中,让它先让父类初始化 super(xx) ; 访问父类的有参构造方法

 
 
         使用继承关系 编码的时候:----idea生成  alt+ins---->constructor--->
               子类的无参构造方法 访问父类的无参构造方法
               子类的有参构造方法 直接访问父类的有参构造方法

继承的成员变量访问问题

1)子类变量和父类变量名称不一样,分别访问即可

代码如下:

运行结果:

2)子类成员变量名称和父类一致采用就近原则访问

:

 结果:

 就近原则:

1)先是子类的成员位置成员变量,如果有就访问

2)再是父类成员位置找,如果有就访问

3)如果还是没有就继续往上(父类的父类)找

如果局部位置也有同名变量

则看输出位置在哪,子类方法中输出则访问局部变量,在主类中输出则先按就近原则访问

二.super和this区别

1)概念的区别
    this:代表的当前类对象的地址值引用
    super:代表的父类的空间表示(父类对象的地址值引用)
2)使用不同
    2.1)针对成员变量访问
        this.变量名 ; 访问的本类的成员变量
        super.变量名; 访问的父类成员变量
    2.1)访问构造方法
        this() ; 访问本类的无参构造方法
        this(xx); 访问本类的有参构造方法
        super() ;访问父类的无参构造方法
        super(xx);访问父类的有参构造方法
        
    2.2)访问成员方法
        this.方法名() ;访问本类的成员方法
        super.方法名() ;访问父类的成员方法

三.方法重写

定义:子类方法名和父类方法名相同,目的就是子类的方法覆盖/复写父类的方法

注意:重写时子类方法权限不能低于父类

实例:

 结果:

 四.final关键字

特点:

1)final修饰类,该类不能被继承

2)final修饰成员变量,该成员变量不能重新赋值(即常量)

static和final在一起出现

面试题:

public static final int a=20;//称为编译时期常量:(jvm不需要加载)   public static final 基本数据类型 变量名 = 值;

public static final Integer  i=  new Integer(20)//称为运行时期常量:(jvm需要加载) 指的是修饰的引用类型地址值不变(无法开辟新的堆内存空间)    public static final 引用数据类型 变量名 = new  xxx();

3)final修饰成员方法,该成员方法不能被重写

五.多态

多态的前提条件
    1)必须有继承关系
    2)存在方法重写
    3)必须父类引用指向子类对象 
            父类名 对象名 = new  子类名();
                    class Fu{
                        //属性私有化
                        //无参/有参构造方法
                    }
                    class Zi extends Fu{
                        //无参访问父类无参
                        //有参访问父类有参
                    }
成员访问特点:
父类名 对象名 = new  子类名();
    1)成员变量(非静态):编译看左,运行看左!
    2)成员方法(非静态):编译看左,运行看右(因为子类存在重写)
      静态的成员方法:算不上方法重写,跟类相关,类名.静态方法名() ;  编译看左,运行看左!
    3)构造方法: 由于存在继承关系,分层初始化(先让父类初始化,然后再是子类初始化!)  

六.多态的弊端

多态的好处:
    1)提高代码扩展性(父类引用指向子类对象),多态保证
    2)提高代码的维护性以及复用性(由继承保证)
多态的弊端:
    无法访问子类的特有功能!
    解决方案:
            1)直接创建具体的子类对象
                    子类名 对象名 = new 子类名() ; (不推荐),从内存角度考虑,又需要开辟堆内存空间
            2)推荐向下转型---前提条件:必须存在向上转型((父类引用指向子类对象))    
                    父类名 对象名 = new  子类名(); 
                    
                    子类名 子类引用 =  (子类名)对象名; 强转类型转换的格式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值