文章目录
-
- 第三章
-
- 一:java面向对象基础
-
- 1.1什么叫面向对象:是一个软件开发方法,指的是把相关的数据和方法作为一个整体来看待
- 1.2类与对象
- **1.3创建对象的内存分析**
- **1.4构造方法(构造器)**
- **1.5方法的重载**
- **1.6构造方法的重载**
- **1.7匿名对象**
- **1.8阿里巴巴编程规约(目前所需)**
- 二、java面向对象进阶
-
- **1.1封装**
- **1.2this关键字**
- **1.3static关键字**
- **1.4代码块**
- **1.5包**
- **1.6权限修饰符**
- 三、面向对象高级
-
- **1.1继承**
- **1.2子类调用父类时的内存分析**
- **1.3super关键字**
- **1.4重写(override)重载(overload)(!!!面试很有可能遇到的题型)**
- **1.5final关键字(一定无法重新赋值)**
- **1.6抽象类(Abstract)**
- **1.7接口(可与抽象类进行对比)**
- **1.8多态**
- **1.9instanceof(判断某个对象是否是指定的类(子类)的实例)**
- **2.0 toSting(返回对象的内存地址)**
- **2.1 equals**
- 2.1内部类
- 2.2包装类(包含八种数据类型的包装类)
- 2.2可变参数
- 2.3递归
第三章
一:java面向对象基础
1.1什么叫面向对象:是一个软件开发方法,指的是把相关的数据和方法作为一个整体来看待
面向对象的三大思想:
- OOA:面向对象分析
- OOD:面向对象设计
- OOP:面向对象程序
面向对象的三大特征:
- 封装性:所有的内容对外部不可见
- 继承性:把其他的功能继承下来并且继续发展
- 多态性:方法的重载本身就是一个多态性的体现
1.2类与对象
1.两者的关系:相当于图纸和实物的关系
2.类的组成:属性(类似于人的特征)和方法(类似于人的行为)
3.类的定义格式
? class 类名{
? 属性
? 方法
? }
4.对象的创建和使用:
①创建:通过 类名 对象名 = new 类名();
②使用:
- 访问类中的属性:对象名.属性名;
- 调用类中的方法:对象名.方法名(实际参数列表);
1.3创建对象的内存分析
-
栈:是先进后出,是根据指针进行释放的,同时用来保存对象名、基本数据类型、引用数据类型
-
堆:用来保存类里面的对象,同时,堆内存通过GC(垃圾回收器)释放
ps:new关键字创建对象是为了告诉JVM要开辟一个新的内存空间,因此在每一次用new关键字的时候实际上都在堆内存当中用了一个新的空间去进行存储
1.4构造方法(构造器)
特点:java中所有的java类都至少会存在一个构造方法,而如果没有的话,编译器则会自动生成一个无参的构造方法
创建:Person p = new Person();(同时类里面也会有一个自己定义的Person方法)
**建议:**推荐在进行构造方法的时候自定义两个构造方法,一个方法里面是无参构造方法,一个方法里面是全参构造方法(相当于重载不会冲突)
1.5方法的重载
一个类中的是允许重载的,但是有条件
? ①方法名称必须相同
? ②参数列表长度,参数列表类型,参数顺序
? 注意:是否构成重载与返回的数据类型是无关的
示例:
①封装时用到的private只能在类中调用(也就是说不能用对象名.属性名直接赋值,一定要用到属性所在的类的方法来进行赋值)
②static进行修饰时定义的是一个不能动的变量,只储存在类中,可以通过类来赋值
③构造代码块的执行在每次进行类加载时都会调用这个代码块,因此可以用这个做一个循环的作用
④this关键字在使用的时候实际上指代的就是构建的对象
⑤static在修饰一个东西的时候强调只有一个而且会固定放在内存中
三、面向对象高级
1.1继承
①分类:分为单继承和多重继承,无多继承
②继承概念:继承父类的一切同时自己也可以添加内容
1.2子类调用父类时的内存分析
首先创建子类的对象在栈中,此时对象会去找子类中的内容,没有找到对应内容时则会去用super(不是一定要super)进入父类中继续寻找(子类和父类都在堆中)
1.4重写(override)重载(overload)(!!!面试很有可能遇到的题型)
区别:
①发生位置
- 重写(override)是发生在子类和父类当中的
- 重载(overload)是发生在一个类当中的
②参数列表
- 重写时参数列表必须一致
- 重载时参数列表必须不同
③访问权限
- 重写时访问权限子类一定不能比父类的访问权限低
- 重载没有访问权限的限制
④返回值类型
- 重写必须返回值类型一致
- 重载返回值类型可以不同
⑤异常处理
- 重写(override)时子类中的异常可以减少或者删除但是不能出现新的异常
- 重载(overload)时与异常无关
1.5final关键字(一定无法重新赋值)
①用于修饰属性或者变量:
- final修饰局部变量时可以先声明再赋值,且只能赋值一次()
- final修饰成员变量时必须直接赋值( )
- 全局变量:public static final
②用于修饰类:
用final修饰的类不能被继承
③用于修饰方法
用final修饰的方法不可以被子类重写
ps:final修饰的内容是放在常量池当中的,当用static修饰的时候就表示唯一的而且是放在内存中一个固定位置的(可以假设说这个位置时方法区),所以才说全局变量用public static final
1.6抽象类(Abstract)
①抽象类里面可以有正常的属性、方法、构造方法
②抽象类不可以直接创建对象(抽象类是不可以被实例化的)
③不能使用final声明(因为final声明的类是不可以被继承的,而抽象类必须通过继承才能实现其中的内容),因此它也必须有子类
抽象方法:
概念:只声明但是未实现的方法称之为抽象方法(未实现指的是没有方法体{})
注意:抽象方法一定要用abstract进行修饰
**!问:**抽象类是否能有构造方法
**!答:**可以,虽然它自身不可以实例化,但是由于子类的实例化的流程和普通类的继承是一样的(都是先调用父类的构造方法再调用子类的构造方法),同时子类在创建对象的时候,抽象父类也会被JVM实例化(这是核心原因)
抽象类与普通类的区别:
如果一个类继承抽象类,这个子类必须继承抽象类的所有抽象方法,不然的话这个子类也必须有abstract修饰使其也变成抽象类(子类重写的抽象方法不需要加上abstract修饰)
1.7接口(可与抽象类进行对比)
①接口:
?
②接口的实现:
?
(若需要实现既要实现接口又要继承抽象类的话)
?
③接口的继承:(由于接口都是抽象部分不存在具体的实现,所以可以多继承)
?
④接口的优点:
- 降低程序的耦合性
- 有利于程序的维护和扩展
**注意:**一个接口想要实现必须依靠子类,且子类(非抽象类)要实现接口中的所有抽象方法
!!!接口和抽象类的区别:
- 抽象类是要被子类继承,而接口则是要由类实现
- 接口只能声明抽象方法,而抽象类可以声明抽象方法和非抽象方法
- 接口里定义的只能是全局常量,而抽象类中的变量是普通变量
- 抽象类通过继承来使用且无法多继承,接口通过实现来使用,且可以多实现如“②接口的实现:”所示
- 抽象类中可以有静态方法,而接口中不行(静态方法不可以被子类重写,但是抽象类在子类继承之后会被实例化此时这个子类是可以调用静态方法的,因此接口中不能声明静态方法但是抽象类可以)
- 接口不能有构造方法,抽象类可以有
总的来说这两者的区别就在于(实现方式上,是否可以多继承,变量的差异和三种方法上的不同)
1.8多态
概念:对象的多种表现形式就叫多态
体现:方法的重载和重写也是多态的一种,只不过是方法的多态
多态的使用:(类似于基本数据类型的转换)
- 子类实例到父类实例:父类 父类对象 = 子类实例;(student–>person)
- 父类实例到子类对象:子类 子类对象 = (子类)父类实例:(person–>student)
1.9instanceof(判断某个对象是否是指定的类(子类)的实例)
格式:实例化对象 instanceof 类 //此操作返回的是boolean类型的数据
注意:instanceof这个判断在equals中很重要
2.0 toSting(返回对象的内存地址)
建议:以后在类中建议都重写(因为Object类中已经有这个方法)Object的toString方法(这个重写后的方法的作用可以返回对象的字符串的表现形式)
2.1 equals
①equals的自我重写方法(通俗)
②局部内部类:在程序的入口中新建一个类(一般的用法实际上就是在需要调用接口时没办法创建对象,只能通过构建一个新的类来创建对象从而进行这个接口中的方法)(下图中正是因为没有办法实现person也就没办法调用方法,所以需要构建一个类实现接口再创建对象再实现方法)
注意:
- 这个内部类必须继承一个类或者实现一个接口
- 只能访问final类型的局部变量(下面有讲)
- 局部内部类的限制在这儿一定也会被限制(权限修饰符以及static都不能出现,除了本身需要的抽象方法)
- 不能够定义构造函数
- 不能是抽象的
局部内部类和匿名内部类都必须使用final参数:(面试的时候如果问)
因为JVM会将类编译成class(字节码)文件,此时已经进行了存储,为了保证外部的变量和局部内部类里的变量永远保持一致,系统就直接设置了局部内部类里的这个变量一定不可以更改,也就是一定要使用final型变量
④静态内部类(就是成员内部类加了一个static修饰)
-
它不需要依赖于外部类对象(成员内部类需要),与类中的静态成员变量类似
-
它只能使用外部类中的静态变量或者方法(原因:因为你在创建内部类的时候外部类可能还没有被加载,因此你只能使用静态的变量或者方法)
如何使用包装类(装箱和拆箱):
注意:只能让可变参数放在参数列表中的最后
2.3递归
下图两张图就是递归的思想,总的来说就是自身方法的不断调用,调用到该方法出现结束有了返回值之后再从最后开始不断回归自身
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树类和接口类和面向对象91719 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!