【JAVA进阶】多态,内部类

📃个人主页:个人主页

🔥系列专栏:JAVASE基础

目录

一、多态

1.多态的概述

2.多态的优势

3.类型转换问题

二、内部类

1.内部类概述[了解]

2.静态内部类[了解]

3.成员内部类[了解]

4.匿名内部类概述[重点]


一、多态

1.多态的概述

什么是多态?

指对象可以有多种形态。 多态的常见形式

父类类型 对象名称 = new 子类构造器;

多态中成员访问特点

  • 方法调用:编译看左边,运行看右边。
  • 变量调用:编译看左边,运行也看左边。(注意)

多态的前提

  • 有继承/实现关系;有父类引用指向子类对象;有方法重写(多态侧重行为多态)。

2.多态的优势

 优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

  •  定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。

多态下会产生的一个问题:

  • 多态下不能使用子类的独有功能

3.类型转换问题

自动类型转换(从子到父):

Animal c = new Cat();

强制类型转换(从父到子):

  • 从父到子( 必须进行强制类型转换,否则报错):  子类 对象变量 = (子类)父类类型的变量  
  • 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。  
  • 注意: 有继承/实现关系的类就可以在编译阶段进行强制类型转换;但是,如果转型后的类型和对象真实对象的类型不是同一种类型,那么在运行代码时,就会出现ClassCastException
Animal c = new Cat();
Dog d = (Dog)c; // 出现异常 ClassCastException

Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换

变量名 instanceof 真实类型 判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之。

二、内部类

1.内部类概述[了解]

内部类

  • 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
public class People{
// 内部类
 public class Heart{
    }
}

内部类的使用场景  

  • 场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。

基本作用

  • 内部类通常可以方便访问外部类的成员,包括私有的成员。
  • 内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。

2.静态内部类[了解]

什么是静态内部类?

  • 有static修饰,属于外部类本身。
  • 它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。
public class Outer{
// 静态成员内部类
public static class Inner{        
  }
}

静态内部类创建对象的格式:

格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;

范例:Outer.Inner in =  new Outer.Inner();

 静态内部类的访问拓展:    

1、静态内部类中是否可以直接访问外部类的静态成员?

  • 可以,外部类的静态成员只有一份可以被共享访问。

2、静态内部类中是否可以直接访问外部类的实例成员?

  • 不可以的,外部类的实例成员必须用外部类对象访问。

3.成员内部类[了解]

什么是成员内部类?

  • 无static修饰,属于外部类的对象。
  • JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
public class Outer {
// 成员内部类
public class Inner {   
    }
}

成员内部类创建对象的格式:  

格式:外部类名.内部类名 对象名 = new  外部类构造器.new 内部类构造器(); 范例:Outer.Inner in =  new Outer().new  Inner();

成员内部类的访问拓展: 

1、成员内部类中是否可以直接访问外部类的静态成员?

  • 可以,外部类的静态成员只有一份可以被共享访问。

2、成员内部类的实例方法中是否可以直接访问外部类的实例成员?

  • 可以的,因为必须先有外部类对象,才能有成员内部类对象,所以可以直接访问外部类对象的实例成员。

4.匿名内部类概述[重点]

匿名内部类:

  • 本质上是一个没有名字的局部内部类。
  • 作用:方便创建子类对象,最终目的是为了简化代码编写。

格式:

new 类|抽象类名|或者接口名() {     重写方法; };

eg:

Employee a = new Employee() {
public void work(){
   }
};
a. work();

特点总结:

  • 匿名内部类是一个没有名字的内部类,同时也代表一个对象。
  • 匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值