二、java面向对象

第三章

一:java面向对象基础

1.1什么叫面向对象:是一个软件开发方法,指的是把相关的数据和方法作为一个整体来看待

面向对象的三大思想:

  • OOA:面向对象分析
  • OOD:面向对象设计
  • OOP:面向对象程序

面向对象的三大特征:

  • 封装性:所有的内容对外部不可见
  • 继承性:把其他的功能继承下来并且继续发展
  • 多态性:方法的重载本身就是一个多态性的体现
1.2类与对象

1.两者的关系:相当于图纸和实物的关系

2.类的组成:属性(类似于人的特征)和方法(类似于人的行为)

3.类的定义格式

​ class 类名{

​ 属性

​ 方法

​ }

4.对象的创建和使用:

①创建:通过 类名 对象名 = new 类名();

②使用:

  • 访问类中的属性:对象名.属性名;
  • 调用类中的方法:对象名.方法名(实际参数列表);
1.3创建对象的内存分析
  1. 栈:是先进后出,是根据指针进行释放的,同时用来保存对象名、基本数据类型、引用数据类型

  2. 堆:用来保存类里面的对象,同时,堆内存通过GC(垃圾回收器)释放

    ps:new关键字创建对象是为了告诉JVM要开辟一个新的内存空间,因此在每一次用new关键字的时候实际上都在堆内存当中用了一个新的空间去进行存储

1.4构造方法(构造器)

特点:java中所有的java类都至少会存在一个构造方法,而如果没有的话,编译器则会自动生成一个无参的构造方法

创建:Person p = new Person();(同时类里面也会有一个自己定义的Person方法)

**建议:**推荐在进行构造方法的时候自定义两个构造方法,一个方法里面是无参构造方法,一个方法里面是全参构造方法(相当于重载不会冲突)

1.5方法的重载

一个类中的是允许重载的,但是有条件

​ ①方法名称必须相同

​ ②参数列表长度,参数列表类型,参数顺序

​ 注意:是否构成重载与返回的数据类型是无关的

示例:
在这里插入图片描述

1.6构造方法的重载

基本上和方法的重载是一样的都在类里面进行

1.7匿名对象

匿名对象实际上就是将Math m=new Math();中**new Math()**直接当作对象来用

注意:如果一个对象要调用两次以上一定要定义对象名不然会找不到(原因是存储时每使用一次new实际上是创建了一个新的空间,因此不可能输出正常)

1.8阿里巴巴编程规约(目前所需)

1.不能用_,$开头

2.拼音加英文绝对不行

3.类名的每个单词首字母都必须大写,方法,参数,成员变量,局部变量等除了第一个单词的首字母不用大写其他的都必须首字母大写,常量的每个字母都要大写而且每个单词之间要用"_"隔开

二、java面向对象进阶

1.1封装

①意义:保护或防止代码(数据)被破坏

②使用:用private修饰属性即可封装,在外部不可以设置

1.2this关键字

①this指的是调用的对象即比如一个叫Cat,Cat c = new Cat;这里面的c即是this所指代的对象

1.3static关键字

①静态修饰的属性是储存在类中的,可以直接用类名.属性名=""; 进行设置属性

②静态修饰的方法内容实际上也是是储存在类里的,因此它可以直接用类进行调用 如:类名.方法名="";

③静态修饰的方法被调用时,可能对象还未被创建

⑤static加载类的动作只发生一次

⑥静态方法只能够通过类来调用(也就是说静态变量无法并入构造方法)

重要!:在访问时静态资源不能访问非静态资源,只有非静态资源可以访问静态资源(如静态方法里想调用非静态方法是不可能的(main方法里调用非静态方法))

1.4代码块

①普通代码块:正常的

②构造代码块:在类中的成员代码块,每次类的加载都会调用这个代码块

③静态代码块:在类加载时会调用一次,此后都不会调用

1.5包

①包的介绍:

  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用(例如调用用户输入时用到的scanner就是java包下的util包下的scanner)
  • 包也限定了访问权限,拥有包访问权限的类才能访问包中的某个类

②包的命名:一般来说在进行命名时基本格式为com.公司名.项目名.模块名…为主

1.6权限修饰符

pubic和private用的较多

1603439471205.png
学习总结:

①封装时用到的private只能在类中调用(也就是说不能用对象名.属性名直接赋值,一定要用到属性所在的类的方法来进行赋值)

②static进行修饰时定义的是一个不能动的变量,只储存在类中,可以通过类来赋值

③构造代码块的执行在每次进行类加载时都会调用这个代码块,因此可以用这个做一个循环的作用

④this关键字在使用的时候实际上指代的就是构建的对象

⑤static在修饰一个东西的时候强调只有一个而且会固定放在内存中

三、面向对象高级

1.1继承

①分类:分为单继承和多重继承,无多继承

②继承概念:继承父类的一切同时自己也可以添加内容

1.2子类调用父类时的内存分析

首先创建子类的对象在栈中,此时对象会去找子类中的内容,没有找到对应内容时则会去用super(不是一定要super)进入父类中继续寻找(子类和父类都在堆中)

在这里插入图片描述

1.3super关键字

作用:可以调用父类的构造方法,属性,方法

使用时间:在你需要使用super时才用,不用super对子类调用父类并无影响

注意:super调用构造方法时一定要放在子类中的第一行,不然会报错(this也是一样)

(图中的student为子类,使用构造方法并且将super调用构造方法放在第一行,此时它调用的是父类的构造方法;同时super指代的也是对象名称,只是多了调用父类,和this的区别就在这里。换句话说就是super连接了父类和对象

在这里插入图片描述

1.4重写(override)重载(overload)(!!!面试很有可能遇到的题型)

区别:

①发生位置

  • 重写(override)是发生在子类和父类当中的
  • 重载(overload)是发生在一个类当中的

②参数列表

  • 重写时参数列表必须一致
  • 重载时参数列表必须不同

③访问权限

  • 重写时访问权限子类一定不能比父类的访问权限低
  • 重载没有访问权限的限制

④返回值类型

  • 重写必须返回值类型一致
  • 重载返回值类型可以不同

⑤异常处理

  • 重写(override)时子类中的异常可以减少或者删除但是不能出现新的异常
  • 重载(overload)时与异常无关
1.5final关键字(一定无法重新赋值)

①用于修饰属性或者变量:

  • final修饰局部变量时可以先声明再赋值,且只能赋值一次(final int a;a=1;
  • final修饰成员变量时必须直接赋值(final int a =1;
  • 全局变量:public static final

②用于修饰类:

用final修饰的类不能被继承

③用于修饰方法

用final修饰的方法不可以被子类重写

ps:final修饰的内容是放在常量池当中的,当用static修饰的时候就表示唯一的而且是放在内存中一个固定位置的(可以假设说这个位置时方法区),所以才说全局变量用public static final

1.6抽象类(Abstract)

①抽象类里面可以有正常的属性、方法、构造方法

②抽象类不可以直接创建对象(抽象类是不可以被实例化的)

③不能使用final声明(因为final声明的类是不可以被继承的,而抽象类必须通过继承才能实现其中的内容),因此它也必须有子类

抽象方法:

概念:只声明但是未实现的方法称之为抽象方法(未实现指的是没有方法体{}

注意:抽象方法一定要用abstract进行修饰

**!问:**抽象类是否能有构造方法

**!答:**可以,虽然它自身不可以实例化,但是由于子类的实例化的流程和普通类的继承是一样的(都是先调用父类的构造方法再调用子类的构造方法),同时子类在创建对象的时候,抽象父类也会被JVM实例化(这是核心原因)

抽象类与普通类的区别:

如果一个类继承抽象类,这个子类必须继承抽象类的所有抽象方法,不然的话这个子类也必须有abstract修饰使其也变成抽象类(子类重写的抽象方法不需要加上abstract修饰)

1.7接口(可与抽象类进行对比)

①接口:

interface 接口名{ 全局常量; 抽象方法;}

②接口的实现:

class 子类 implements 父接口1,父接口2....{}

(若需要实现既要实现接口又要继承抽象类的话)

class 子类 extends 父类 implements 父接口1,父接口2....{}

③接口的继承:(由于接口都是抽象部分不存在具体的实现,所以可以多继承)

interface C extends A,B {}

④接口的优点:

  • 降低程序的耦合性
  • 有利于程序的维护和扩展

**注意:**一个接口想要实现必须依靠子类,且子类(非抽象类)要实现接口中的所有抽象方法

!!!接口和抽象类的区别:

  • 抽象类是要被子类继承,而接口则是要由类实现
  • 接口只能声明抽象方法,而抽象类可以声明抽象方法和非抽象方法
  • 接口里定义的只能是全局常量,而抽象类中的变量是普通变量
  • 抽象类通过继承来使用且无法多继承,接口通过实现来使用,且可以多实现如“②接口的实现:”所示
  • 抽象类中可以有静态方法,而接口中不行(静态方法不可以被子类重写,但是抽象类在子类继承之后会被实例化此时这个子类是可以调用静态方法的,因此接口中不能声明静态方法但是抽象类可以)
  • 接口不能有构造方法,抽象类可以有

总的来说这两者的区别就在于(实现方式上,是否可以多继承,变量的差异和三种方法上的不同)

1.8多态

概念:对象的多种表现形式就叫多态

体现:方法的重载和重写也是多态的一种,只不过是方法的多态

多态的使用:(类似于基本数据类型的转换)

  • 子类实例到父类实例:父类 父类对象 = 子类实例;(student–>person)
  • 父类实例到子类对象:子类 子类对象 = (子类)父类实例:(person–>student)
1.9instanceof(判断某个对象是否是指定的类(子类)的实例)

格式:实例化对象 instanceof 类 //此操作返回的是boolean类型的数据

注意:instanceof这个判断在equals中很重要

2.0 toSting(返回对象的内存地址)

建议:以后在类中建议都重写(因为Object类中已经有这个方法)Object的toString方法(这个重写后的方法的作用可以返回对象的字符串的表现形式)

2.1 equals

①equals的自我重写方法(通俗)

在这里插入图片描述

②通过快捷键创建:
eclipse:shift+alt+s
idea:alt+insert

注意:

  • 字符串的比较必须用equals:首先equals本身是没有任何意义的,它和==确实没有区别,但是,String是一个类!!,他的这个类里面已经重写了equals方法,这个时候当然可以比较了啊!!,但是如果是自定义的类的对象那么此时是没有重写equals的方法的,当然就不能进行比较的!
  • 在equals的方法重写中,有个强转的过程是为了防止多态
2.1内部类

①成员内部类(无条件访问外部类的任何属性或者方法)

内部类的调用(先new一个外部类对象,再利用对象名.new 内部类名称()进行创建)

在这里插入图片描述

②局部内部类:在程序的入口中新建一个类(一般的用法实际上就是在需要调用接口时没办法创建对象,只能通过构建一个新的类来创建对象从而进行这个接口中的方法)(下图中正是因为没有办法实现person也就没办法调用方法,所以需要构建一个类实现接口再创建对象再实现方法)

在这里插入图片描述

注意:局部内部类使用时不能在里面出现修饰符及static(不包括default)

③匿名内部类(和局部内部类的差别只在于只使用一次且不需要创建类)
1603521966386.png
)]

注意:

  • 这个内部类必须继承一个类或者实现一个接口
  • 只能访问final类型的局部变量(下面有讲)
  • 局部内部类的限制在这儿一定也会被限制(权限修饰符以及static都不能出现,除了本身需要的抽象方法)
  • 不能够定义构造函数
  • 不能是抽象的

局部内部类和匿名内部类都必须使用final参数:(面试的时候如果问)
因为JVM会将类编译成class(字节码)文件,此时已经进行了存储,为了保证外部的变量和局部内部类里的变量永远保持一致,系统就直接设置了局部内部类里的这个变量一定不可以更改,也就是一定要使用final型变量

④静态内部类(就是成员内部类加了一个static修饰)

  • 它不需要依赖于外部类对象(成员内部类需要),与类中的静态成员变量类似

  • 它只能使用外部类中的静态变量或者方法(原因:因为你在创建内部类的时候外部类可能还没有被加载,因此你只能使用静态的变量或者方法)
    1603522897774.png

2.2包装类(包含八种数据类型的包装类)

八种数据类型的包装类的介绍(注意Integer和Character):

1603525824024.png

如何使用包装类(装箱和拆箱):

在这里插入图片描述

字符串转换:

将字符串类型的数字转化为int类型:int a = Integer.parsrInt("字符串对象");

2.2可变参数

如何使用可变参数的代码(循环体中的则是对应的操作,nums是一个数组,中间的…则是nums数组中的内容)
1603526176232.png

注意:只能让可变参数放在参数列表中的最后

2.3递归

下图两张图就是递归的思想,总的来说就是自身方法的不断调用,调用到该方法出现结束有了返回值之后再从最后开始不断回归自身

1604125015661
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值