面向对象笔记

本文深入解析了面向对象编程的核心概念,包括类与对象的关系、封装、继承、多态、构造方法(构造器)、静态与非静态方法的区别,以及抽象类、接口、内部类和多态的实践应用。理解了这些,将有助于更好地设计和实现复杂软件系统。
摘要由CSDN通过智能技术生成

面向对象 oo

三大特性(+抽象)

方法回顾及加深(静态方法和非静态方法)

对类,对象,方法,属性的理解

对象的创建与初始化(构造方法/构造器)

创建对象内存分析

封装

继承

objec

super

与this的类比

方法重写(区别于重载)

不能方法重写的方法:

多态

多态注意事项:

instanceof

类型转换

多态总结

抽象类

接口

普通类\抽象类\接口

N种内部类

成员内部类

局部内部类

 匿名内部类

静态内部类


面向对象 oo

1-面向过程:步骤清晰简单,一步一步往下做,适合处理简单的问题

2-面向对象:属性+方法=类,物以类聚,用分类的思维模式,首先将解决问题的方法进行分类,然后对这些分类进行独立思考,最后对每个类进行面向过程的思考,适合处理复杂的问题

ps:宏观上用面向对象的思路分析整个系统,具体到微观的类用面向过程的思路处理

面向对象编程oop的本质:以类的方式组织代码,以对象的形式组织(封装)数据

三大特性(+抽象)

抽象:把对象的共同点抽取出来形成一个类

1-封装:
2-继承:
3-多态:

方法回顾及加深(静态方法和非静态方法)

静态方法(有static):直接用 类名.方法名 来调用

非静态方法(无static):静态方法不能直接调用非静态方法,先将类实例化new,对象类型 对象名=对象值,再调用 对象名.方法名

 static和类一起加载的(早),非静态方法在对象new实例化以后才存在(晚),所以静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。

对类,对象,方法,属性的理解


 什么是类?

类,是一类事物的代表 ,不如说人、桌子、树、等都是类,类有属性和方法;

什么是对象?

对象,是某个类中特别指出的一个,比如说人,人是一个类吧, 小明就是一个对象,那么小红也是啦;某个类中的一个就是对象;
什么是方法?

方法,是一个类的动态行为;

什么是属性?

属性,是一个类的静态属性;

比如人,因为人是个类,小明是类的对象; 人这个类中,可以包括的方法有: 跑步()、吃饭();

那么属性就是静态的比如是:性别,名字,年龄了;


这些方法和属性都是属于人这个类的;说一个调用方法和属性时要用,它的对象吗,所以说用
小明.跑步();
或小明.性别;

对象的创建与初始化(构造方法/构造器)

1、使用new关键字创建对象时,除了分配空间内存外,还会给创建好的对象进行默认初始化以及对类中构造方法的调用

默认初始化:数字---0  0.0    char----u0000     boolean----false    引用类型-----null  

2、构造方法在创建对象的时候必须要调用,特点有
         1-必须与类的名字相同
         2-必须没有返回类型,也不能写void

3-构造方法作用
      1-使用new关键字,本质就是在调用构造方法;
      2-用来初始化对象的值

4、一旦定义了有参构造,无参就必须显示定义,有参构造原理是---方法重载

创建对象内存分析

封装

该露的露,改藏的藏------程序追求“高内聚,低耦合”
高内聚:类内部的数据操作操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用

封装(数据的隐藏):通常禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问,这被叫做信息隐藏

总结:属性私有,get/set

作用:
1-提高程序的安全性,保护数据
2-隐藏代码的实现细节
3-统一接口
4-增加系统的可维护性

继承

继承的本质:对某一批类的抽象,从而实现对世界更好的建模

extends的意思是扩展。子类是父类的扩展

java中只有单继承,没有多继承(一个儿子只能有一个爸爸,一个爸爸可以有多个儿子)

继承是类和类之间的一种关系。除此之外类之间的关系还有依赖、组合、聚合
继承关系的两个类,一个是子类(派生类),一个是父类(基类)子类继承父类用extends表示
子类和父类之间,从意义上讲具有“is  a”的关系

子类对父类的继承

所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性,但无法访问父类的private方法)。同时子类可以对继承的方法进行重写(@Override),并且新建自己独有的方法。
 

objec

在java中,所有的类都默认直接或者间接继承object类(祖宗类)

super

1、super调用父类的构造方法,必须在构造方法的第一个
2、super必须只能出现在子类的方法和构造方法中!
3、super和this不能同时调用构造方法!

与this的类比

1-代表的对象不同
this:本身调用者的这个对象
super:代表父类对象的应用

2-前提
this:没有继承也可以使用
super:只能在继承条件才可以使用

3-构造方法
this:本类的构造
super:父类的构造

方法重写(区别于重载)

(重写都是方法的重写,和属性无关)

重写需要有继承关系,子类重写父类的方法!

规范:

1-方法名必须相同
2-参数列表必须相同
3-修饰符:范围可以扩大,但不能缩小;  public>Protected>Default>private|
4-抛出的异常:范围可以缩小,但不能扩大

一句总结:重写,子类的方法和父类必须要一致,方法体不同 

为什么要重写?---父类的功能,子类不一定需要,或者不一定满足

不能方法重写的方法:

1-static方法:属于类,不属于实例
2-final方法:常量,在常量池里
3-private方法:私有的

多态

定义:同一个方法可以根据发送对象的不同而采用多种不同的行为方式

一个对象的实际类型是确定的,但是指向的引用类型有很多:父类的引用指向子类

对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!(编译看左,运行看右

=== 理解:把子类的对象赋值给父类类型的对象

子类能调用的方法都是自己的或者继承父类的  |  父类可以指向子类,但不能调用子类独有的方法

多态注意事项:

1-多态是方法的多态,属性没有多态
2-父类和子类要有联系,否则类型转换异常 ClassCastException
3-存在条件:有继承关系,子类重写父类方法,父类的引用指向子类对象  Father a= new Son();

instanceof

使用:  a instanceof B:判断对象a是否是类B的实例。如果是,返回true;如果不是,返回false

使用情景:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就向下转型;如果返回false,不进行向下转型

类型转换

高转低强制转换,低转高自动转换(父类:高   ,   子类:低)

子类转换为父类,可能丢失自己本来的一些方法

(自动)向上转型 和 向下转型

向上转型父类的变量赋值上子类的对象(下级对象赋值给上级变量)
eg:Animal a= new Dog();

赋值条件:字发生直接或间接继承关系的时候(即存在上下级关系)

调用规则:仅能调用变量类型的成员(变量+方法)     --------变量类型指的是=左面的Animal类
*****若调用的是重写的方法,则调用执行的是子类中该重写的方法***** 

向下转型:“子类对象指向父类引用"

eg:
Father f=new Son() //先向上转型
Son s=(Son) f;//再进行向下转型,进行强制转换,子类引用s,父类引用f

向下转型的条件先向上转型,再向下转型。没有经过向上转型,会提示编译错误。

向下转型后 的变化
1-关于方法:可以调用子类的所有方法,和属性,类型转为子类
2-关于属性:调用 的属性为子类 的属性。

作用:向上转型时 ,会遗失子类对象独有的其他方法;可以通过向下转型在重新转回
向下转型作用的究极通俗解释(6条消息) Java向下转型的意义_yinhuanxu-CSDN博客_java向下转型https://blog.csdn.net/xyh269/article/details/52231944?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163931664416780264060231%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163931664416780264060231&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-52231944.first_rank_v2_pc_rank_v29&utm_term=%E5%90%91%E4%B8%8B%E8%BD%AC%E5%9E%8B&spm=1018.2226.3001.4187
总结一下吧,很多时候,我们需要把很多种类的实例对象,全部扔到一个集合。(这句话很重要)
在这个例子里就是把Thinkpad笔记本,Mouse鼠标,KeyBoard键盘等实例对象,全部扔到一个Shopcar购物车集合。
但是肯定不可能给他们每个种类都用一个独立的集合去存放吧,这个时候我们应该寻找到一个标准,接口就是一个标准。这些都是各种电子产品,抽象成电子产品。然后一个Electronics接口就出来了。
在回到刚才,我们把很多种类的实例对象全部扔到一个集合。或许这样比较好理解:把很多种类的子类实例对象全部扔到存放父类实例的集合。
经过了这个过程,子类实例已经赋值给了父类引用(即完成了向上转型),但很遗憾的丢失了子类扩展的方法。
很好的是Java语言有个向下转型的特性,让我们可以重新获得丢失的方法,即强转回子类
所以我们需要用到子类实例的时候,就从那个父类集合里拿出来向下转型就可以了,一样可以使用子类实例对象

 

instanceof

定义:
instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。
应用场景:
需要用到对象的强制类型转换时,需要使用instanceof进行判断

多态总结

1、存在条件:父类的引用指向子类的对象
2、把子类转换为父类:向上转型,直接转换
3、把父类转换成子类:向下转型,强制转换---可能丢失一些方法:类比基本数据类型的丢失精度
4、方便方法的调用,减少重复的代码,使代码简洁---类比基本数据类型为了方便计算

核心思想:抽象的编程思想       (包括封装、继承、多态都是)

抽象类

抽象类:一个类中没有包含足够的信息来描述一个具体的对象,这个类就是抽象类

抽象方法:只有方法名字,没有方法的实现

本质:抽象的抽象(类就是抽象,抽象类就是抽象的抽象)

格式:abstract{       }

使用原则:
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)不能new这个抽象类,只能靠子类去实现它:约束
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
(4)子类(如果不是抽象类)则对抽象类全部的抽象方法进行重写实现,(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

作用:用来继承、约束、规范、扩展

接口

普通类\抽象类\接口

普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范,自己无法写方法-------专业的约束(抽象),作用是约束和实现分离

接口本质:接口的本质是契约,就像法律一样,制定好后大家都遵守

OO(面向对象)的精髓,是对对象的抽象,最能体现这一点的就是接口

声明类的关键字是class,声明接口的关键字是interface

官方解释:接口是一系列方法的声明是一些方法特征的集合
接口中只有一些方法的特征,没有方法的实现-----抽象方法
因此这些方法可以在不同的地方被不同的实现,这些实现具有不同的行为功能

目的:接口是为了解决java中无法实现多继承的一种手段
在实际开发中更多的作用是制定标准或规范方法

作用:
1-约束
2-定义一些方法,让不同的人实现
3-public abstract 方法
4-public static final 常量
5-接口不能被实例化------因为接口中没有构造方法
6-用implement可以实现多个接口
7-实现接口必须要重写接口中的方法

N种内部类

内部类就是在一个类的内部再定义一个类,比如,A中定义了一个B类,那么B类相对于A类来说就称为内部类,而A类相对于B类来说就是外部类了

1、成员内部类(实例内部类)
2、静态内部类
3、局部内部类
4、匿名内部类

内部类可以拥有4种访问权限:
private修饰,则只能在外部类的内部访问
public修饰,任何地方都可以访问
protected修饰,则只能在同一个包下或承接外部类的情况下访问
默认(friendly/package)访问权限,则只能在同一个包下访问

外部类只能被public和默认访问权限修饰
可以理解为:由于实例(成员)内部类看起来像是外部类的一个实例,所以可以像类的实例(成员)一样拥有多种权限修饰

成员内部类

实例(成员)内部类是依附外部类而存在的
如果要创建实例(成员)内部类对象,前提是必须存在一个外部类的对象|

局部内部类

定义:定义在一个方法或一个作用域里面的类
与成员内部类的区别:访问权限仅限于方法内或该作用域内 
ps:局部内部类就跟方法里的局部变量一样,不能有public,protected,private以及static修饰符

 匿名内部类

匿名内部类==用这个匿名的类实例化出一个对象
适合创建只需要一次的类


定义格式:父类构造器(实参列表) |   现实接口(){

                     匿名内部类的类体部分

                 }

即 :new AAA(){}
AAA=上级文件名()
从格式可以看出,匿名内部类必须且只能继承一个父类,或实现一个接口


匿名内部类的两条规则:
1-不能是抽象类
2-不能定义构造方法
由于内部类没有类名,所以无法构造定义方法,但匿名内部类可以有初始化块(代码块),可以通过初始化块来完成构造方法需要完成的工作

静态内部类

成员内部类与静态内部类的区别
1、成员内部类在类中不需要加static关键字,而静态内部类需要在类前边加上关键字
2、成员内部类的调用方式为 外部类创建对象,然后是内部类创建对象;而静态内部类是内部类调用外部类进行创建对象
3、在静态内部类中,如果方法是static类型,那么要求这个类也必须是static类型
4、静态内部类中,static类只能调用static属性

反射

TestM tb = new TestM();
实例化=正向映射----------------反射=反向映射    reflect

1-类的描述

2-创建实例

 

3-获得方法+调用方法 

 4-获得变量+赋值取值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值