大数据最全JavaSE学习----(五)面向对象三大特征:封装、继承(2),讲的真透彻

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

注:只要构造函数就会创建对象,并且一定是在堆内存中开辟内存空间。
例子二:

public class User{
			//无参数的构造方法
			public User(){
					System.out.println("User's Default Constructor Invoke!");
			}	
			public User(int i){
					System.out.println("带有int类型参数的构造器");
			} 
			public User(String name){
					System.out.println("带有String类型的构造器");
			}
			public User(int i,String name){
					System.out.println("带有int,String类型的构造器");
			}
}

//测试类
public class ConstructorTest01{
		public static void main(Stirng[] args){
				
				//创建User对象
				//调用User类的构造方法来完成对象的创建
				User u1 = new User();
				User u2 = new User(10);
				User u3 = new User("zhangsan");
				User u4 = new User(10,"zhangsan");
		}
}

在这里插入图片描述

二.继承

1 .继承是面向对象三大特征之一,三大特征分别是:封装、继承、多态。

2 .继承的基本作用是:代码复用。但是继承最“重要”的作用是:有了继承,才有了以后的“方法覆盖”和“多态机制”。

3 .继承语法格式:
[修饰符列表]   class类名  extends父类名{
   类体 = 属性+方法
}

4 .Java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类,在c++中支持多继承

5 .关于继承的一些术语
   B类继承A类,其中:
     A类称为:父类,基类,超类。superclass
     B类称为:子类,派生类。 subclass

6 .在Java语言中子类都继承哪些父类?

  • 私有的不支持继承
  • 构造方法不支持继承
  • 其他数据都可以被继承

7 . 虽然java语言中只支持单继承,但是一个类也可以间接继承其他类:
例如:
   C extends B{
    }
    B extends A{
    }
    A extends T{
    }
C类直接继承B类,但是C类间接继承T、A类。

8 . java语言中假设一个类没有显示继承任何类,该类默认继承JavaSE库当中提供的Java.lang.Object 类.
java语言中任何一个类都有Object类特征。
在这里插入图片描述

三.方法的覆盖

1.回顾Java语言中的方法重载
  • 方法重载又被称为overload
  • 方法重载何时使用?
    当在同一个类当中,方法完成的功能是相似的,建议方法名相同,这样方便程序员编程,就像在使用一个方法似的,代码美观
  • 什么条件满足之后构成方法重载?
    在同一个类中    方法名相同
    参数列表不同:类型,个数,顺序
  • 方法重载和什么无关?
    和方法的返回值无关
    和方法的修饰符列表无关
2.概念:

方法覆盖又被称为方法重写,英文单词:override【官方】/overwrite

3.什么时候使用方法重写?

当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类继承过来的方法进行重新编写,这个重新编写的过程就成为方法重写/方法覆盖。

4.什么条件满足时会发生重写?【代码满足什么条件之后】
  • 方法重写发生在具有继承关系的父子类之间
  • 方法名相同,返回值类型相同,形参列表相同
  • 访问权限不能更低,可以更高
  • 抛出异常不能更多,可以更少【后续讲异常后解释】
5.注意:

私有方法不能继承,所以不能覆盖
构造方法不能继承,所以不能覆盖
静态方法不存在覆盖【讲完多态后解释】
覆盖只针对方法,不谈属性
在这里插入图片描述

四.多态

1.Animal、Cat、Bird之间的关系:

Cat继承Animal
    BIrd继承Animal
    Cat和Bird之间没有任何继承关系

2.关于多态中涉及到的几个概念;

(1)向上转型(upcastng):
子类型–>父类型
又被称为:自动类型转换。

(2)向下转型(downcasting):
父类型–>子类型
又被称为:强制类型转换【需要加强制类型转换符】

需要记忆:无论是向上转型,还是向下转型,两种类型之间必须要有继承关系,没有继承关系,编译无法通过。

3.Java中允许这种语法:父类型指向子类型对象

以前编写:
        Animal a1 = new Animal();
    现在使用多态:
        Animal a2 = new Cat();

  • Java程序永远都分为编译阶段和运行阶段。
  • 先分析编译阶段,在分析运行阶段1,编译无法通过,根本无法运行。
  • 编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class字节码当中有more()这个方法,所以编译通过了。这个过程我们称为静态绑定,编译阶段绑定,只有静态绑定成功之后才有后续的运行。
  • 在程序运行阶段,JVM堆中真实创建的对象是Cat对象,那么以下程序在运行阶段一定会调用Cat对象的more()方法,此时发生了程序的动态绑定,运行阶段绑定。
  • 无论是Cat类有没有重写more方法,运行阶段一定调用的是Cat对象的more方法,因为底层真实对象是Cat对象。
  • 父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这两种机制可以成为一种多态语法机制。
//分析以下程序为什么不能调用?
a2.catchMouse();
//因为编译阶段编译器检查到a2的类型是Animal类型,从Animal.class字节码文件当中查找catchMouse()方法。最终没有找到方法,导致静态绑定失败,没有绑定成功,也就是说编译失败了,更别谈运行了


假设想让a2对象执行catMouse方法,怎么办?
    a2是无法直接调用的,因为a2的类型是Animal,Animal中没有catchMouse方法。我们可以将a2强制类型转换成Cat类型。
    a2的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型,强制类型转换。
注:
向下转型也需要两种类型之间必须有继承关系,不然会编译报错,强制类型转换符。

什么时候需要使用强制类型转换符?
当调用的方法是子类型中特有的,在父类中不存在,必须进行向下转型。

Cat c2 = (cat)a2;

4.著名异常出现

类型转换异常:
程序编译虽然通过了,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的对象是Bird类型,Bird对象无法转换成Cat对象,因为两种类型之间不存在任何继承关系,此时出现了著名异常
    java.lang.ClassCastException
类型转换异常,这种异常总是在“向下转型”中出现。

5.如何避免类型转换异常:

(1)以上异常只存在强制类型转换的时候发生,也就是说“向下转型”存在隐患(编译过了,但是运行错了)

(2)向上转型只要编译通过,运行一定不会出问题

(3)向下转型编译通过,运行可能会出错

(4)怎么避免向下转型出现的ClassCastException?
使用instanceof运算符可以避免出现以上异常

(5)instanceof运算符怎么用?
语法格式:引用  instanceof  数据类型名
以上运算符的执行结果类型是布尔类型,结果可能是true/false
关于运算结果是true/false
假设(a instanceof Animal)
    true表示:a这个引用指向的对象是一个Animal类型
    false表示; a这个引用指向的对象不是一个Animal类型

if(a3 instanceof Cat)
		{
		Cat.c3 = (cat)a3;
		c3.catchMouse();	
		}
		else if(a3 instanceof Bird)
		{
		Bird b2 = (Bird)a3;
		b2.fly();
		}

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

g-APOu22dg-1715747277198)]
[外链图片转存中…(img-7BATdpyW-1715747277198)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程是一种编程范式,它将程序的构建和设计思路以面向对象的方式进行组织和实现。在Java中,面向对象编程是基于Java SE(Standard Edition)的一种编程方式。第07主要介绍了面向对象编程中的一些基本概念和关键术语。 在面向对象编程中,我们将程序中的数据和对数据的操作(方法)封装在一起,形成一个对象。对象由两部分构成:属性和方法。属性是用来描述对象的特征,而方法则是对象可以执行的操作。对象之间通过消息(方法调用)进行通信和交互。面向对象的核心思想是通过封装继承和多态实现程序的复用和扩展。 封装面向对象编程中的一个重要概念,它指的是将类的属性和方法进行封装,使得外部无法直接访问和修改对象的内部状态,只能通过公共的方法来操作属性和执行方法。封装提供了一种将数据和行为组合在一起的方式,可以保护数据的完整性和安全性。 继承面向对象编程中的另一个重要概念,它指的是通过定义一个新的类来继承现有类的属性和方法。通过继承,子类可以继承父类的属性和方法,并可以在此基础上进行扩展和修改。继承提供了一种代码复用的机制,可以减少重复编码的工作量。 多态是面向对象编程的又一个重要概念,它指的是同一类型的对象在不同的情况下可以有不同的表现形式。多态通过方法的重写和方法的重载实现。方法的重写指的是在子类中重新定义和实现父类的方法,方法的重载指的是在同一个类中可以定义多个同名但参数列表不同的方法。 总结来说,面向对象编程是一种将程序组织和设计思路以对象为中心的编程方式。在JavaSE中,我们可以通过封装继承和多态来实现面向对象编程的目标。封装可以提高程序的可维护性和可复用性,继承可以减少重复编码的工作量,多态可以灵活地操作对象。掌握这些基本概念和关键术语,可以帮助我们更好地理解和应用面向对象编程的思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值