这一阶段主要学习了面向对象编程思想,通过具体的例子理解了面向对象和面向过程的思想。其中重点学习了面向对象,掌握了对象、属性、方法等相关的知识点并加以实际应用。
面向对象重点笔记
面向对象和面向过程编程思想
面向对象和面向过程的区别与联系:
面向过程POP,所有步骤依次执行,注重执行的细节。
面向对象OOP:创建解决问题的对象,让各个对象调用各自的方法配合执行。
面向对象编程思想中,类中定义的方法,具体的实现过程,也是面向过程的。
面向对象以对象为核心,强调事件的角色、主体,比如把事情指定给某个对象去操作;而面向过程以过程为核心,强调事件的流程、顺序,每一步操作都要顺序进行。
面向对象三大特性
继承
类B使用extends(延伸)类A,就能访问类B中的非私有(没有使用private修饰)成员变量和成员方法。
这个过程称为类B继承类A。
java
calss A{
private String secret="父类中的私有属性";
String name="父类"
}
clss B extends A{
void fun(){
System.out,println(secret);//无法访问父类中的私有成员变量
System.out,println(name);
}
}
继承可以减少代码冗余,将多个类中的公共代码提取出来保存到一个类中,这些类使用extends“继承”这一个公共类。
子类中就无需再写出这些公共代码,可以直接访问。
特点
如果多个类中有相同的代码,可以将这些代码提取出来到一个公共的类中,这个类就是父类。再让那些类去extends继承这个父类,那些类就是子类,子类就无需再写重复代码。
子类中或子类对象可以直接访问父类中非私有(不用private修饰)属性和方法。
创建子类对象时,会现执行父类中相应的构造方法。
子类继承父类后,通常会对父类中的方法进行拓展或覆盖,这种方法称为重写。重写后,子类再调用该方法时,执行的是重写后的内容。
Java中是单继承,一个子类只能extends一个父类,一个父类可以有很多个子类。
Java中可以多重继承,类A可以继承类B,类B继承类C,这是类A既是类B的子类,也是类C的子类,类A可以访问类B和类C中的非私有成员。
任何类都是object类的子类。
方法重写override
当子类继承父类后,可以对父类中的方法进行拓展或覆盖。这个过程称为方法重写。
方法重写要求
方法名、返回值、参数列表必须和父类一直
访问权限不能比父类更严格(访问修饰符的范围要么一致要么更大)。
不能抛出比父类更大的异常
IDEA中如果要重写方法,使用快捷键Ctrl+O在弹出的窗口中选择要重写的方法。
方法重载overload
在一个类中,如果多个方法的方法名不同,参数;列表不同时,这些方法称为重载。
同名不同参
重载用于,在一个类中,某个方法在不同条件下,执行不同的内容。
方法重载要求
方法名相同
参数必须不同(数量、类型)
重载和重写相关面试题
说出重载与重写的异同
相同点:方法名不变
不同点:
重载在一个类中,重写在继承关系中子类重写父类。
重载时参数必须不同,重写参数必须相同
重载返回值无要求,重写返回值必须相同
构造方法能重载吗?能重写吗?
构造方法可以重载。构造方法不能重写。
构造方法执行时,一定会创建对象吗?
不一定。创建子类时会自动执行父类构造方法,但不会创建父类对象。
this和super
都可以当做对象和构造方法使用。
当做对象:this表示当前类的对象,super当前类的父类对象。
this和super当做对象使用时,只能用在非静态方法中。
当做构造方法
this()表示当前类中的无参构造方法,如果带参数就表示对应参数的构造方法
super()表示当前类的父类无构造方法,如果带参数就表示对应参数的构造方法。
this或super只能用在另一个构造方法的首行。
在继承后,如果子类和父类都没有写出任何构造方法时,子类中有一个隐藏的无参构造方法,会自动调用父类的无参构造方法。
包package
通过包可以将.java源文件进行结构化管理,相当于Windows中的文件夹。
不同包中,可以保存相同的.java源文件
某个类在某个包中时,会在该类的代码最上面加上package 包名;
包的命名
包名通常使用该公司域名的倒序形式。
如baidu.com是百度的域名,有一个test的项目,包名写为com.baidu.test。
包名中的“.”,相当于进入文件夹
如com.baidu.test,会创建3个文件夹:com下有baidu,baidu下有test。
导入包
如a包中的类要使用b包中的类时,需要在a包中的类中,导入b包或b包中的某个类。
如在使用scanner时,就需要导入scanner所在的java.util包,impoert.util.scanner;
在idea中,如果是通过自动补全的形式写的代码,会自动导入该类,或者自动导包删包。
如果需要手动导入包,在报错的位置上按下快捷键 alt+回车。
如果多个类,类名相同但在不同的包中,使用该类时选择合适的包。
访问修饰符
访问修饰符可以限制某个类、属性或方法的访问权限
用法:
修饰类:访问修饰符class
修饰属性:访问修饰符 数据类型 变量名
修饰方法:访问修饰符 返回值类型 方法名(){}
访问修饰符 | 含义 | 可以修饰 |
public | 公共的 | 类、方法、属性 |
protected | 受保护的 | 方法、属性 |
不写 | 默认的 | 类、属性、方法 |
private | 私有的 | 方法、属性 |
同一个类中 | 同一个包中不同类 | 不同包中的子类 | 不同包中的非子类 | |
publi(公共的) | √ | √ | √ | √ |
protected(受保护的) | √ | √ | √ | × |
不写(默认) | √ | √ | × | × |
private(私有的) | √ | × | × | × |
访问权限从大到小:
public>protected>default(默认)>private
final 关键字
修饰属性
当final修饰属性时,该属性值不可更改
如果一个变量被final修饰,称为常量,常量是程序运行中不能更改的量,所以定义常量时必须要赋值,常量名使用大写字母,多个单词之间用下换线隔开。
final数据类型常量名;
finalintNUM=123;
finaldoublePI=3.14;
修饰方法
当final修饰方法时,该方法不能被重写。
在方法的返回值前加上final。
修饰类
当final修饰类时,该类不能被继承。
定义类,在class前加上final。
Object类
是java中所有类的父类,每个类都是这个类的子类,但没有使用extends体现出来。
该类中定义了很多方法,通常需要进行重写。
![](https://i-blog.csdnimg.cn/blog_migrate/0731da24d1a058398dce2f3cf487f36a.png)
instanceof 检测对象是否属于指定类型。(对象 instanceof 类)
比较对象相同不能使用==
比较对象之间是否相等要使用重写后的equals方法,重写时选择要比较的属性。
如果两个对象的属性全部相同,在日常的业务逻辑中,可以视为这两个对象是同一个对象。
如果用==比较,比较的是对象的内存地址,地址不同,就是属性相同,返回false。
如果比较的是同一个对象,直接return true
对象造型/对象转型/cast
类似于原始类型中的数据类型转换。对象A转换为对象B的过程,称为对象转型。
在非继承关系的两个对象中,无法转型。
向下转型
父类对象转换为子类对象的过程,称为向下转型。强制转换
向上转型
子类对象转换为父类对象的过程,称为向上转型。自动转换
在IDEA中自动生成equals方法
在类中右键generate或快捷键alt+ insert,选择equals and hashcode,选择属性。
如果两个对象的id相同就视为同一个对象,可以只选择id属性。
如果两个对象的所有属性相同才视为同一个对象,选择全部属性。
同时生产的hashcode()可以删除。
nextLine 接收回车前输入的所有内容
next()接收空格前的输入的所有内容
sc.nextLine();消除上次输入的回车
重难点
构造方法能重载吗?能重写吗?为什么?
构造方法能重载,不能重写。
构造方法都是重载关系,构造方法在一个类中,名字都是类名,参数各不相同,这就是重载的要求。
重写发生在继承中,子类重写父类 的方法。子类和父类名称不同,构造方法不同。违反了重写的要求:方法三要素相同。
成员变量、局部变量、静态常量
成员变量:定义在类中的变量,类的属性,有默认值,可以通过调用对象使用。
局部变量:定义在方法中的变量,没有默认值,只能在方法中赋值使用。
静态常量:被final、static修饰的成员变量
JDK1.8后,接口中可以有什么方法?
抽象方法、被default修饰的默认方法、被static修饰的静态方法