JAVA - 面向对象编程

面向对象是在之前基本实现的基础上的又一抽象,这里的 “高内聚,低耦合” 体现的更加明显,有抽丝剥茧、不断总结的感觉了。
学习的时候真的会有拨开云雾见月明的感觉,这种感觉真的会上瘾。你慢慢发现所有的东西都在以自己的规律运转,发现 验证 使用,真的很有《实践论》的味道。
我能做些什么?知道这些能帮助我做好什么?

前言

面向过程像是对事不对人,这件事情到底要如何完成?
面向对象更在乎发挥人的主观能动性,对象的属性和方法,对象之间是如何组织起来的,如何能够协作得更好。
当然,这两者不可分割,发挥人的主观能动性也是去做事情的。【有管理那味道了哈哈哈】

类是抽象的模板,对象(实例)是模板下真正出来的作品。

Java 中用类 class 来描述事物也是如此。类是一组相关属性和行为的集合,这也是类最基本的两个成员。
属性:该类事物的状态信息。对应类中的成员变量 成员变量 属性 <=>Field
行为:该类事物要做什么操作, 或者基于事物的状态能做什么。对应类中的成员方法 (成员)方法 函数 <=>Method

定义一些东西一定要知道这些东西所需要的元素,权限限制、类型、名字、需要接收什么。
一定要清楚他们的特点,才能不漏不缺。这很重要。
匿名方法:直接创建一个没有名字的对象。【如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。我们经常将匿名对象作为实参传递给一个方法调用。】

UML图

在描述类和属性之间的关系时,常用UML图。
一些常见的符号:+ 表示 public,- 表示 private,# 表示 protected

参考链接:https://www.jianshu.com/p/0cefd8137681

内存分析

这一段很重要,要好好总结体会。

方法重载

方法重载: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。参数列表不同,意味着参数个数或参数类型的不同
重载的特点: 与修饰符、返回值类型无关,只看参数列表 且参数列表必须不同。(参数个数或参数类型)。调用时根据方法参数列表的不同来区别
重载方法调用:WVM通过方法的参数列表, 调用匹配的方法先找个数、类型最匹配的,再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错。
【可以找很多个,但最终只能找到一个,否则就会报错】

可变个数的形参

格式:
方法名(参数的类型名···参数名)
举例:
//JDK5.0以前采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a, String[] books);
//JDK5.0,采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a String...books);
特点:
可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
可变个数形参的方法与同名的方法之间,彼此构成重载。
可变参数方法的使用与方法参数部分使用数组是一致的,二者不能同时声明,否则报错。
方法的参数部分有可变形参,需要放在形参声明的最后在一个方法的形参中,最多只能声明一个可变个数的形参。

参数的传递机制


传地址是一件很重要的事情

递归

自己调用自己,回归本源 一步一步变化,关键是找到相邻项之间的关系。一定要注意设置迭代结束方式,否则写出来的就是死循环!!

递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。
在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。考虑使用循环迭代。

封装

实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权限修饰符来控制。

对应的 get set 方法修改对应的属性实现封装。

那么在构造一个类对象时,难道要一直一个属性一个属性调用set方法赋值吗?这就是构造器的来源。
在创建对象时给定属性值去赋值。也就是new对象,并在new对象的时候为实例变量赋值。
构造器名必须与它所在的类名必须相同。
它没有返回值,所以不需要返回值类型,也不需要void。
构造器的修饰符只能是权限修饰符,不能被其他任何修饰。比如,不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。
构造器是可以重载的。

this

this在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象
它在构造器内部使用,表示该构造器正在初始化的对象。
this可以调用的结构:成员变量、方法和构造器(this()就是在调用无参构造器)
很像 python 中的self。

另外,使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。

继承

继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了 is-a 的关系,为多态的使用提供了前提。继承意味着子类的对象除了看子类的类模板还要看父类的类模板。(有基因的味道了)
继承描述事物之间的所属关系,父类更通用、更一般,子类更具体。抽象的绝佳选择。

通过extends关键字,可以声明一个类B继承另外一个类A

类B,称为子类、派生类(derived class)、SubClass
类A,称为父类、超类、基类(base class)、SuperClass

顶层父类是Object类。所有的类默认继承Object,作为父类。

重写

继承是得到父类的属性和方法,如果自己有了不一样的想法呢?那就可以进行方法重写~
override

重写要求

子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型。(例如:Student< Person,子类和父类)
注意:如果返回值类型是基本数据类型和void, 那么必须相同

子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。(public > protected > 缺省 > private)
注意:父类私有方法不能重写,跨包的父类缺省的方法也不能重写,子类方法抛出的异常不能大于父类被重写方法的异常
此外,子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
注意区分方法的重载和重写。

权限修饰符

public 缺省 protected private
参考链接:https://blog.csdn.net/I_r_o_n_M_a_n/article/details/119024516

super

在Java类中使用super来调用父类中的指定操作:
super可用于访问父类中定义的属性,super可用于调用父类中定义的成员方法,super可用于在子类构造器中调用父类的构造器。
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员。super的追溯不仅限于直接父类。
super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。

多态

多态可以理解为多种形态,我现在扔给你一个动物,你只知道它是动物,但不知道是什么动物。只有真的到了你手里,你才真的知道到底是猫还是狗。
这里就划分出了编译时类型和运行时类型,编译时看的是你定义的时候是怎么定义的,运行时看的是实际上运算的变量是什么。也衍生出了类型转换,向上还是向下
下转上有共同点自然可以,上转下(调用特有方法)就要看 isinstanceof 了

posted @ 2023-04-07 19:30  芋圆院长  阅读(17)  评论(0编辑  收藏  举报