面向对象概述:
面向对象程序设计(OOP),面向可以理解为找、拿,对象是东西。面向对象编程可以理解为:
找或拿东西来编程。
一、类和对象
1、类是构造对象的模板或蓝图。我们可以将类想象成制作小甜饼的模具,将对象想象成小饼干。
由类创建对象的过程称为创建类的实例。
2、类由属性和方法构成:
属性:相当于一个个的特征。
方法:相当于一个个行为。
3、创建对象:
类名称 对象名称 = new 类名称() ;
4、类的构造方法:它是用来初始化对象的;
构造方法是一种特殊的方法,在对象被创建时用来初始化对象,分为有参构造和无参构造。它的方
法名和类名一样;没有返回值类型;如果你没有定义任何构造方法,系统会有一个默认的无参构
造,但是如果你定义了一个构造方法,系统默认的就无效了,所以一般情况下我们都最少定义两个
构造方法。
5、this:代表当前所在类的对象,即本类对象,用于解决变量的命名冲突和不确定性问题;在没有
同名的情况下,可以直接使用属性的名字。
注意:一个.java文件中,可以存在N个类,但是只能存在一个public修饰的类;所以一般情况我们
都是一个文件写一个类。
6、内存机制:
先是创建一个Car类,包含价格,名字和两个方法(这里省略了get、set和构造方法)。
再来一个测试类,它会先把Test类加载到方法区,然后虚拟机把main方法加载到栈内存,再执行
main方法的第一行代码,第一行会接触到Car类,会马上把Car类加载到方法区,然后才开始执行
第一行左边的代码,它会定义一个引用类型的变量c1(对象名),它会加载到栈内存,接着再执行
右边的代码,它会新建一个对象,把new出来的东西放在堆内存里,开辟一个空间,代表一个汽车
对象,对象里面又会开辟一些区域去放属性信息,但是由于没有赋值,它们都是默认值null和0.0,
它不会把对象的方法也放在堆内存中,而是加载到方法区,它会再堆内存中放方法的地址,称为引
用地址,最后把开辟空间的地址赋给c1,让c1指向这个对象。
再执行第二行,它会根据c1储存的地址找到对应的对象,再给name赋值,接着是第三行给price赋
值,往下走,再去访问c1对象的name和price;接着通过c1的地址去找对象,再通过方法的引用找
到start方法,run方法也是同样。
权限修饰符:
二、类的三个特点:
1、封装:
核心思想就是将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方
法来访问这些数据和方法,保证了数据的安全和程序的稳定。
2、继承:
(1)、子类可以继承父类的属性和方法,并对其进行拓展。将其他的功能继承下来继续发展 。不
可以多继承但是可以多层继承。
在Java中,关键字“extends”表示继承,后面紧跟父类的类名,如下 :
public class Person {
private String name;// 姓名
private int age;// 年龄
private String gender;// 性别
//省略get和set方法
}
class Teacher extends Person {
private double salary;// 工资
private String department;// 部门
//省略get和set方法
}
class Student extends Person {
private double score;// 成绩
private String grade;// 年级
//省略get和set方法
}
(2)、final:
特点:
a、final用于修饰类、成员变量和成员方法。
b、final修饰的类,不能被继承,其中所有的方法都不能被重写。
c、final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法。
d、final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不
能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的
对象,但是对象当中的内容是允许改变的。
(3)、super和this:
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
3、多态:
(1) 、同一种类型的对象执行同一个方法时可以表现出不同的行为特征。通过继承的上下转型、
接口的回调以及方法的重写和重载可以实现多态。方法的重载本身就是一个多态性的体现。
(2)、多态的定义与使用格式:
父类类型 变量名=new 子类类型();
(3)、多态的特点:
调用成员变量以及静态方法时,“编译看左边,运行看左边”。
三、抽象类
(1)、抽象类必须使用abstract关键字声明
一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或者接口中。
(2)、格式:
abstract class 类名{
}
(3)抽象方法:
只声明而未实现的方法称为抽象方法(未实现指的是:没有“{}”方法体),抽象方法必须使用
abstract关键字声明。
注意:abstract不能与final同时修饰一个类;因为abstract修饰的类必须要继承而final修饰的类不能
被继承。继承抽象类的类必须要重写所以抽象方法。
四、接口
(1)、Java是单继承的语言,利用接口可以模拟多继承;
(2)、接口是对抽象类的进一步抽象,是方法声明和常量的定义集合;
(3)、接口是一种行为规范,是一种契约;
定义:
修饰符 interface 接口名 {
}
使用:
修饰符 class 类名 implements 接口{
}
五、方法重写
(1)、@Override是放在重写后的方法上,作为重写是否正确的校验注解。
(2)、加上改注解后如果重写错误,编译阶段会出现错误提示。
(3)、建议重写都加上@Override注解,代码安全、美观!
方法重写的注意事项和要求:
a、方法重写也就是子类中出现和父类中一模一样的方法(包括返回值类型,方法名,参数列表)
b、从重写的要求上看:
重写的方法和父类的要一致(包括返回值类型、方法名、参数列表)
方法重写只存在于子类和父类之间,同一个类中只能是方法重载
c、从访问权限上看:
子类方法不能缩小父类方法的访问权限
子类方法不能抛出比父类方法更多的异常
父类的私有方法不能被子类重写
d、从静态和非静态上看:
父类的静态方法不能被子类重写为非静态方法
子类可以定义于父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法(满足
重写约束)
父类的非静态方法不能被子类重写为静态方法
e、从抽象和非抽象来看:
父类的抽象方法可以被子类通过两种途径重写(即实现和重写)
父类的非抽象方法可以被重写为抽象方法
六、静态变量和方法
定义:由static修饰的变量和方法称为静态变量和静态方法。
(1)、静态变量在类中的作用如下:
a、静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之
间的交互性。
b、如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而
节省内存空间。
(2)、静态方法的作用:
a、静态方法不需要通过它所属的类的任何实例就可以被调用,因此在静态方法中不能使用 this 关
键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态
方法。
b、类的静态变量和静态方法,在内存中只有一份,供该类的所有对象共用。
七、Object类
Object类是所有类的顶级父类,在Java体系中,所有类都是直接或间接的继承了Object类,Object
类包含了所有Java类的公共属性和方法,这些属性和方法在任何类中均可以直接使用,其中较为重
要的方法如下表所示:
方法名 功能说明
boolean equals(Object obj) 比较两个类变量所指向的是否为同一个对象,是则返true
Class getClass() 获取当前对象所属类的信息,返回Class对象
String toString() 将调用toString()方法的对象转换成字符串
Object clone() 生成当前对象的一个备份,并返回这个副本
int hashCode() 返回该对象的哈希代码值
注意:
a、继承是面向对象编程技术的基础,它允许创建分等级层次的类
b、任何类只能有一个父类,即Java只允许单继承
c、除构造方法,子类继承父类的所有方法和属性
d、overload(重载)是多态性的静态展示,override(重写)是多态性的动态展示
e、super有两种通用形式:调用父类的构造方法、用来访问被子类的成员覆盖的父类成员
f、final修饰符可应用于类、方法和变量
g、Object是所有类的最终父类,是Java类结构的基础
八、类型转换
(1)、子类转换成父类可以自动完成
(2)父类转化成子类需要强制类型转换;强制转换可能会丢失一些方法,此时只能调用父类的方
法,子类的方法无法调用。