目录
前言
随着对java学习的深入,接下来要学习的内容是基于java编程语言的面向对象知识。主要介绍了什么是面向对象、类和对象的创建、构造器详解、创建对象内存分析、封装、继承、多态、代码块、抽象类、接口、内部类等内容。
一、什么是面向对象?
面向过程 & 面向对象
面向过程思想
●步骤清晰简单,第一步做什么,第二步做什么....
●面对过程适合处理一些较为简单的问题
面向对象思想
●物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
●面向对象适合处理复杂的问题,适合处理需要多人协作的问题
对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去解决。
面向对象
面向对象编程(OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
抽象
三大特性:封装、继承、多态
从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
从代码运行角度考虑,是先有类后有对象。类是对象的模板
二、回顾方法的定义和调用
方法的定义
修饰符 返回类型
break:跳出switch,结束循环和return的区别
方法名:注意规范就ok 见名知意
参数列表:(参数类型 参数名)...
方法的调用
静态方法 非静态方法
形参和实参(需要注意的是实际参数和形式参数的类型要对应)
值传递和引用传递
this关键字(在类里面this关键字就是指向目前对象的指针)
三、类与对象的创建
类和对象的关系
类是一种抽象的数据类型,它是对某一事物整体描述/定义,但是并不能代表某一个具体的事物。
●Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的书屋应该具备的特点和行为
对象是抽象概念的具体事例
●张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
●能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
创建与初始化对象
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化以及对类中构造器的调用。
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点:
1、必须和类的名字相同
2、必须没有返回类型,也不能写void
构造器必须要掌握
四、构造器详解
打开Student的class文件会发现比我们所写的代码多了一个Student()方法,这就是构造器,编译器会默认生成一个无参构造方法
无参构造与有参构造的简单介绍
五、创建对象内存分析
类与对象小结
1、类与对象 类是一个模板:抽象,对象是一个具体的实例
2、方法 定义、调用
3、对应的引用 引用类型: 基本类型(8) 对象是通过引用来操作的:栈---->堆
4、属性:字段Field 成员变量 默认初始化 数字:0 0.0 char:u0000 boolean:false 引用:null 修饰符 属性类型 属性名=属性值
5、对象的创建和使用
必须使用new 关键字创造对象,构造器 Person kuangshen=new Person();
对象的属性 kuangshen.name
对象的方法 kuangshen.sleep()
6、类:
静态的属性 属性
动态的行为 方法
六、封装详解
该露的露,该藏的藏
程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
封装(数据的隐藏)
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
记住这句话:属性私有,get/set
访问控制权限
在Java中,针对类、成员方法和属性,Java提供了4种访问控制权限,分别是private、default、protected和public。下面通过一张图将这4种访问控制权限按级别由小到大依次列出,如下图所示。
(1)private:private属于私有访问权限,用于修饰类的属性和方法,也可以修饰内部类。类的成员一旦使用了private关键字修饰,则该成员只能在本类中进行访问。
(2)default:default属于默认访问权限,如果一个类中的属性或方法没有任何的访问权限声明,则该属性或方法就是默认的访问权限,默认的访问权限可以被本包中的其他类访问,但是不能被其他包的类访问。
(3)protected:protected属于受保护的访问权限。如果一个类中的成员使用了protected访问权限,则只能被本包及不同包的子类访问。
(4)public:public属于公共访问权限。如果一个类中的成员使用了public访问权限,则该成员可以在所有类中被访问,不管是否在同一包中。
访问控制权限的访问范围
访问范围 | private | default | protected | public |
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
全局范围 | √ |
当属性为私有属性时,无法直接通过对象调用,而是只能通过方法(“接口”)调用,而属性为公有属性时则可以通过对象调用。
提供一些可以操作私有属性的方法
封装的意义
1、提高程序的安全性,保护数据
2、隐藏代码的实现细节
3、统一接口
4、系统可维护增加了
七、什么是继承?
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
extends的意思是“扩展”。子类是父类的拓展
JAVA中类只有单继承,没有多继承
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上将应该具有“is a”的关系
子类Student继承了父类Person的属性与方法(但无法继承父类的私有属性或者私有方法)
Ctrl+H
Object类
在创建了一个Person对象后,除了本身规定的方法以外,该对象 还有许多不是我们设置的属性
这是因为 在java中 所有的类都默认继承object类
这也是为什么,Ctrl+H所出现的树状图里面object是第一层
注:
Java中使用final关键字修饰的类不可以被继承,也就是不能派生子类
八、Super详解
super用法
使用super关键字访问或调用父类的非私属性或非私有方法
super.属性
super.方法(参数1,参数2…)
使用super关键字调用父类中指定的构造方法
super(参数1,参数2…)
子类实例化过程
• 1.产生对象并对成员变量默认初始化
• 2.对构造方法中的形式参数赋值
• 3.构造方法中是否有this语句调用
• 4.super语句调用或隐式调用父类的构造方法
• 5.去当前类中的成员变量显式初始化
• 6.执行当前构造方法中的代码
Super注意点
1、super调用父类的构造方法,必须在构造方法的第一个,并且只能出现一次。
2、super必须只能出现在子类的方法或者构造方法中
3、super和this不能同时调用构造方法
VS this
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提:
this:没有继承也可以使用
super:只有在继承的条件下才可以使用
构造方法:
this():本类的构造
super():父类的构造
注:this和super不可以同时出现,因为使用this和super调用构造方法的代码都要求必须放在构造方法的首行
九、方法重写
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限。例如,父类中的方法是public权限,子类的方法就不能是private权限。如果子类在重写父类方法时定义的权限缩小,则在编译时将出现错误。
静态的方法和非静态的方法区别很大
静态方法
静态方法:方法调用只和左边定义的数据类型有关
非静态方法
非静态方法:方法调用只和右边创建的对象类型有关
注:
当一个类的方法被final关键字修饰后,该类的子类将不能重写该方法
总结
重写:需要有继承关系,子类重写父类方法
1、方法名必须相同
2、参数列表必须相同
3、修饰符:范围可以扩大但不能缩小
4、抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException-->Exception(大)
重写,子类的方法和父类必要一致,方法体不同
十、什么是多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件
有继承关系 子类重写父类方法 父类引用指向子类对象 Father f1=new Son();
注意:多态的方法的多态,属性没有多态性
static 方法,属于类,它不属于实例
final 常量
private 方法
父类对象指向子类,那么只能够调用子类重写的父类的方法,而无法调用子类独有的方法
十一、Instanceof关键字和类型转换
instanceof关键字
Java中可以使用instanceof关键字判断一个对象是否是某个类(或接口)的实例,语法格式如下所示。
对象 instanceof 类(或接口)
上述语法格式中,如果“对象”是指定的类的实例对象,则返回true,否则返回false。
A(对象)instanceof B(类)
A和B比较之前会先判断A能不能转换成B类型,能则通过,不能则编译报错
person instanceof String之所以编译会报错,是因为person是Person类型,而String是final类型,两者不能转换。
而object instanceof Strinf中object是Object类型,String是Object的子类也继承了Object类型,所以能进行类型转换,编译通过。object这个对象不是String的本类或者子类,所以是false
编译通过后会把A和B比较,如果A是B本类或者子类的对象,结果就是true,反之就是false
类型转换
对象向上转型
对象向上转型,父类对象可以调用子类重写父类的方法,这样当需要新添功能时,只需要新增一个子类,在子类中对父类的功能进行扩展,而不用更改父类的代码,保证了程序的安全性。对于向上转型,程序会自动完成,对象向上转型格式如下所示。
对象向上转型:父类类型 父类对象 = 子类实例;
对象向下转型
除了向上转型,对象还可以向下转型。向下转型一般是为了重新获得因为向上转型而丢失的子类特性。对象在进行的向下转型前,必须先进行向上转型,否则将出现对象转换异常。
向下转型时,必须指明要转型的子类类型。对象向下转型格式如下所示。
对象向下转型:
父类类型 父类对象 = 子类实例;
子类类型 子类对象 = (子类)父类对象;
在向下转型时,不能直接将父类实例强制转换为子类实例,否则程序会报错
Student student = (Student)new Person();//编译错误
十二、static关键字详解
static关键字
如果在Java程序中使用static修饰属性,则该属性称为静态属性(也称全局属性),静态属性可以使用类名直接访问,访问格式如下。
类名.属性名
static关键字只能修饰成员变量,不能修饰局部变量,否则编译器会报错。
如果想要使用类中的成员方法,就需要先将这个类实例化。而在实际开发时,开发人员有时希望在不创建对象的情况下,通过类名就可以直接调用某个方法,这时就需要使用静态方法,要实现静态方法只需要在成员方法前加上static关键字。
同静态变量一样,静态方法也可以通过类名和对象访问,具体如下所示。
类名.方法
实例对象名.方法
注意:静态方法只能访问静态成员,因为非静态成员需要先创建对象才能访问,即随着对象的创建,非静态成员才会分配内存。而静态方法在被调用时可以不创建任何对象。
代码块
代码块,简单来讲,就是用{}括号括起来的一段代码。
普通代码块就是直接在方法或是语句中定义的代码块。
匿名代码块是在类中 { 代码段 } 格式写的一段代码,在使用关键字new创建一个类时被执行,一般用于初始化赋值操作。每次new创建新的对象都会执行一次匿名代码块
静态代码块是写在类中,使用 static{ 代码段 } 格式定义的一段代码块,由于类只加载一次,所以静态代码块只执行一次。通常使用静态代码块对类的成员变量进行初始化
在程序中,代码块与类的构造方法执行先后顺序如下:
静态代码块>匿名代码块>类的构造方法
十三、抽象类
定义一个类时,常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。对此,Java提供了抽象方法来满足这种需求。抽象方法是使用abstract关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。抽象方法的语法格式如下。
abstract 返回值类型 方法名称(参数列表);
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。声明抽象类和抽象方法时都要使用abstract关键字修饰
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
抽象类不能使用new关键字来创建对象,它是用来让子类继承的。
抽象方法只有方法的声明没有方法的实现,它是用来让子类实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
当一个类包含了抽象方法,该类就是抽象类。抽象类和抽象方法一样,必须使用abstract关键字进行修饰。抽象类的语法格式如下。
abstract class 抽象类名称{
属性;
访问权限 返回值类型 方法名称(参数){ //普通方法
return [返回值];
}
访问权限 abstract 返回值类型 抽象方法名称(参数);//抽象方法,无方法体
}
十四、接口
接口是一种用来定义程序的协议,它用于描述类或结构的一组相关行为。接口是由抽象类衍生出来的一个概念,并由此产生了一种编程方式,可以称这种编程方式为面向接口编程。面向接口编程就是将程序的业务逻辑进行分离,以接口的形式去对接不同的业务模块。接口中不实现任何业务逻辑,业务逻辑由接口的实现类来完成。当业务需求变更时,只需要修改实现类中的业务逻辑,而不需要修改接口中的内容,以减少需求变更对系统产生的影响。
普通类:只有具体的实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范!自己无法写方法
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想。
接口的本质是契约,就像法律一样,制定好后大家都遵守。
OOP的精髓是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论涉及模式都只针对具备了抽象能力的语言,就是因为设计模式所研究的实际上就是如何合理的去抽象。
声明类的关键词是class,声明接口的关键字是interface
接口的定义与实现
接口使用interface关键字声明,语法格式如下
[public] interface 接口名 [extends 接口1,接口2...] {
[public] [static] [final] 数据类型 常量名 = 常量;
[public] [abstract] 返回值的数据类型 方法名(参数列表);
[public] static 返回值的数据类型 方法名(参数列表){}
[public] default 返回值的数据类型 方法名(参数列表){}
}
在很多的Java程序中,经常看到编写接口中的方法时省略了public ,有很多读者认为它的访问权限是default,这实际上是错误的。不管写不写访问权限,接口中方法的访问权限永远是public。
需要注意的是,一个类可以同时实现多个接口,实现多个接口时,多个接口名需要使用英文逗号(,)分隔。
定义接口的实现类,语法格式如下。
修饰符 class 类名 implements 接口1,接口2,...{
...
}
如果在开发中一个子类既要实现接口又要继承抽象类,则可以按照以下语法格式定义子类
修饰符class 类名 extends 父类名 implements 接口1,接口2,... {
...
}
在Java中,接口是不允许继承抽象类的,但是允许接口继承接口,并且一个接口可以同时继承多个接口。
接口的作用
1、约束
2、定义一些方法,让不同的人实现
3、public abstract
4、public static final
5、接口不能被实例化,接口中没有构造方法
6、implements可以实现多个接口
7、必须要重写接口中的方法
十五、N种内部类
内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
一个java类中可以有多个class类,但是只能有一个public class类
局部内部类
总结
以上就是本文要介绍的内容,主要介绍了什么是面向对象、类和对象的创建、构造器详解、创建对象内存分析、封装、继承、多态、代码块、抽象类、接口、内部类等内容。