面向对象
面向过程
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,
使用的时候一个一个依次调用就可以了。
面向对象
是把构成问题事务分解成各个对象,建立对象与对象之间的关系,建立对
象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步
骤中的行为。
对象
所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是
说现实世界中每一个实体都是一个对象,它是一种具体的概念。代码中的
对象就是对现实中的对象进行的模拟。
对象有以下特点:
对象具有属性和行为。
对象具有变化的状态。
对象具有唯一性。
对象都是某个类别的实例。
一切皆为对象,真实世界中的所有事物都可以视为对象。
如何创建一个对象
语法:
数据类型(类名) 对象名 = new 类名(实参列表);
创建过程:
1,在堆内存开辟一片运行内存
2,给对象的属性赋初始值(基本数据类型默认为0,引用数据类型默认为null)
3,执行构造函数中的代码
4,将栈中的引用指向堆中开辟的内存地址
本质:
调用类中的构造函数
要求:
调用构造函数时,传入的实参列表要与构造函数定义时的形参列表,
长度一致,顺序一致,数据类型一致
如何使用对象调用属性
语法:
对象名.属性名 该对象该属性的值
对象名.属性名 = 值; 给该对象的该属性设置值
如何使用对象调用方法
语法:
对象名.方法名(实参列表);
注意:在本类中可以用this代表本类对象,this此时可以忽略不写
匿名对象
概念:没有对象名的对象
语法:new 类名(实参列表);
缺点:
1,代码不好阅读
2,导致代码结构混乱
3,创建出的对象只能使用一次
类
类是对象的抽象,对象是类的具体。类是由一个或多个对象的共同点
向上抽取的的。
如何创建一个类
语法:
访问权限修饰符 class 类名{
}
访问权限修饰符:public(公共的),protected(受保护的),
default(默认),private(私有)
类名:符合大驼峰命名法,做到见名知意
定义的位置:
一般定义在类的外部,但也可定义在某一类的内部成为内部类
外部类与内部类的区别与联系:
内部类可以访问外部类所有的方法和属性,如果内部类和外部
类有相同的成员方法和成员属性,内部类的成员方法调用要优先于
外部类即内部类的优先级比较高(只限于类内部,在主方法内,内
部类对象不能访问外部类的成员方法和成员属性),外部类只能访
问内部类的静态常量或者通过创建内部类来访问内部类的成员属性
和方法。
属性
概念:用于描述对象的静态特征
别名:成员变量
本质:在类中且不在类的方法中定义的变量
定义的格式:
访问权限修饰符 数据类型 变量名;
注意:public(公共的),protected(受保护的),default(默认),
private(私有)
局部变量与成员变量的区别
1,作用区间不一样:
局部变量:声明代码块中,随着方法的调用而生成,方法的结束
而销毁
成员变量:随着对象的生成而生成,随着对象的销毁而销毁
2,默认值不一样
局部变量:没有默认值,所以想要使用必须赋值
成员变量:有默认值,基本数据类型默认为0,引用数据类型默认为 null
3.声明位置不同
局部变量:方法内部
成员变量:类中方法外
4.权限修饰符不同
局部变量:无权限修饰符
成员变量:存在权限修饰符
构造函数
概念:用于创建该类对象,因为构造函数的方法名必须与类名一致,所以 new
调用的就是构造函数
别名:构造方法
本质:一个特殊的方法
定义的格式:
访问权限修饰符 类名(形参列表){ //形参列表可有可无
方法体
}
定义位置:在类中且不在类的方法中定义
注意:当一个类中没有构造函数时,系统会为其提供一个无参的构造函数
方法
概念:用于描述对象的动态特征(行为)
别名:函数,成员方法,成员函数
本质:包装一段代码的容器
定义的格式:
访问权限修饰符 修饰符 返回值类型 方法名(形参列表){
方法体
return xxx;
}
访问权限修饰符:public(公共的),protected(受保护的),
default(默认),private(私有)
修饰符:static(静态),final(最终)
返回值类型:如果方法有返回值,那么返回值类型就是返回值的
数据类型,如果没有就写 void
方法名:自定义,符合小驼峰命名法
定义位置:
在类中且不在类的方法中定义
构造函数与方法的区别
1、格式区别
构造方法和类名相同,并且没有返回类型,也没有返回值;不可被重写、
不可被继承;可用this、super调用本类和父类的构造函数。
普通成员方法可以任意起名,必须有返回类型,可以没有返回值;可被
重写、可被继承;不可用this、super调用本类和父类的构造函数。
2、作用区别
构造方法用于创建对象,并进行初始化值。
普通成员方法是用于完成特定功能的。
3、调用区别
构造方法是在创建对象时被调用的,一个对象建立,只调用一次相应
构造函数
普通成员方法是由创建好的对象调用,可以调用多次
属性的作用:描述对象静态特征 //对象的共同特征
构造函数的作用:创建该类对象
方法的作用:描述对象的动态特征
类与对象的关系
生活中:
先有对象后有类的概念
代码中:
先创建类后,才能生成具体的对象
this关键字
一般指当前对象或当前正在创建的对象
概念:谁调用this所在的方法,this就代表谁
使用:
1,当局部变量与成员变量重名时,用于区分成员变量与局部变量,
this.属性名表示成员变量(属性)
2,在本类构造函数中,调用其他构造函数
this(实参列表);
注意:
1,必须在构造函数第一行
2,不要形成死循环
3,如果局部变量与成员变量(属性)不重名时,或者在本类其他方法
中使用本类的属性或方法,可以忽略this不写
匿名对象
概念:没有对象名的对象
语法:new 类名(实参列表);
缺点:
1,代码不好阅读
2,导致代码结构混乱
3,创建出的对象只能使用一次
面向对象的三大特征
面向对象程序设计有以下优点。
可重用性:代码重复使用,减少代码量,提高开发效率。
可扩展性:指新的功能可以很容易地加入到系统中来,便于软件的修改。
可管理性:能够将功能与数据结合,方便管理。
对于面向对象程序设计的优点主要通过面向对象的三大核心特性
(封装、继承和多态)来进行实现。
封装
封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证
了程序和数据都不受外部干扰且不被误用。封装的目的在于保护信息,简单
来说其主要思想就是对代码和数据进行包装。
优点
1,美化
2,降低耦合度
3,保护内部
4,方便使用
Java代码中的封装:
变量:封装一个可以改变的数据
数组:封装一组数据
方法:封装一段代码
类:封装多个属性与多个方法
java文件:封装一个或多个类
包:封装多个java文件
项目:封装多个包
...
包
关键字:package
本质:一个文件夹
创建包:
选择 src 文件夹,点击鼠标右键,选择 new,选择 package
填写包名
注意:
包名使用全小写,不要用数组开头,不要出现特殊符号
包名的命名潜规则:
com.公司名称缩写.作用
注意:.表示下一层文件夹
导包:
关键字:import
为什么要导包:
所需使用的类与当前类不在同一个包中
访问权限修饰符
意思:限制属性,方法,构造函数,类等的使用范围
分类:
关键字 意义 使用范围
public 公共的 当前项目中
protected 受保护的 当前包中或继承关系中
不写(default) 默认的 当前包中
private 私有的 当前类中
总结
一般情况下:
属性用 private 修饰,方法与类用 public 修饰
属性用 private 修饰后需提供 get 与 set 方法才能操作数据
继承
概念
生活中的继承:晚辈获取长辈留下的财产与精神
代码中的继承:
多个类(B1,B2)抽取其共同点形成了一个类(A)
判断类A是否与类B有继承关系
如果类B与类A存在继承关系,可以让类B继承与类A,此时类B将拥有
类A的所有属性与方法
类B:称为子类
类A:称为父类
优点
1,减少代码
2,使代码结构清晰
3,降低代码冗余度
super 的使用
作用:子类中使用父类的内容
1,调用父类构造函数
super(实参列表);
注意:
1,要在子类构造函数第一行
2,子类构造函数中如果没有调用父类构造函数,那么默认在其第一行
有 super();调用父类无参构造函数
2,子类属性名与父类属性名重名时,用 super 区分是子类属性还是父类属性,
super.属性名表示父类属性(一般不用)
3,当子类方法与父类方法,
要求:
在继承关系中
方法名相同
形参列表相同
返回值类型相同
子类访问权限修饰符比父类只可增大或不变,不能减小
方法体不同
这种方法称为重写
在有重写的情况下,用于区分子类方法还是父类方法,
super.方法名(实参列表);
使用:
属性
特殊情况:子类的属性名与父类属性名相同,如何区分
子类:this.属性名
父类:super.属性名
方法
特殊情况:子类重写父类方法,在子类中使用该方法,如何区分是父类
方法还是子类方法
子类:this.方法名(实参列表);
父类:super.方法名(实参列表);
构造函数
情况:创建子类对象时,需要给父类构造函数传值
语法:
super(实参列表);
注意:
一定要在子类构造函数第一行
总结:
子类将拥有父类的所有属性与方法,构造函数除外
语法
访问权限修饰符 class 子类名 extends 父类名{
属性
构造函数
方法
}
注意
一个子类只能有一个直接父类(单继承)
Java 的最终基类是 Object ,如果一个类没有写继承,默认继承于 Object
多态
概念:
一个事物的多种形态,即允许一个接口被多个同类使用,弥补了单继承的不足。
多态概念可以用树形关系来表示,如图所示:
代码中的多态
事
方法重写与重载
物(对象)
如类A继承与类B
类A:子类
类B:父类
类名A 对象名A = new 类名A();
//子类对象转父类对象,可以自动转换
//但是子类转换为父类后无法通过父类对象调用子类中的特有方法和属性
类名B 对象名B = 对象名A;
//父类对象转换子类对象,需要强制转换,有风险
类名A 对象名A2 = (类名A) 对象名B;
//不能使用 类A 对象A3=new 类B() 来直接创建,编译时会报错
判断父类对象是否属于指定的子类的对象
关键字:instanceof
语法:boolean b = 父类对象 instanceof 子类名
如果b值为true表示该父类对象本身就是该子类的对象,可以强制转换
如果b值为false表示该父类对象不是该子类的对象,不能转换为该子类对象
重写与重载
重写:
要求:
1,继承关系中
2,访问权限修饰符:子类只能比父类大或不变
3,返回值类型:相同
4,方法名:相同
5,形参列表:相同
6,方法体:不同
重载:
要求:
1,同一个类中
2,访问权限修饰符:可变可不变
3,返回值类型:根据方法内的代码进行调整
4,方法名:相同
5,形参列表:不相同
6,方法体:不同