面向对象是什么?
回顾方法
方法的调用
静态方法:加了static
非静态方法:未加static
Java是值传递
代码:
运行结果:😦 啥?
1
1
运行结果:😦 哈? 不是null?
秦疆
类与对象的关系
创建与初始化对象
New的本质:调用构造方法
走进代码
实例化类/对象保存到变量中(new)
构造器
老规矩进代码看
构造器实质也是一种特殊形式的方法
定义有参构造方法后有参构造器方法就会覆盖默认的无参构造器必须显示的定义一个无参的构造器,要不然无法new对象(实例化)
看代码就知道了
显示定义一个无参构造器
Alt + Insert 构造器快捷键
有参对象调用有参构造
构造方法注意点
小结
1.类与对象
类是一个模板:抽象,对象是一个具体的实例
2.方法
要知道定义与调用
3.对应的引用
引用类型:基本类型(8)
对象是通过引用来操作的:栈-->堆
4.属性:字段 Field 成员变量
默认初始化
数字: 0 0.0
char: u0000
booLean: false
引用: null
修饰符 属性类型 属性名 = 属性值!
5.对象的创建和使用
必须使用new关键字 创造对象,需要构造器 Person Vis.Yang= new Person();
对象的属性 Vis.Yang.name 调用属性
对象的方法 Vis.Yang. sleep() 调用方法
6.类
静态的属性 属性
动态的行为 方法
1.封装
看代码
采用get/set方法
Alt + Insert get/set方法快捷键
get/set可以自动生成方法有啥用? (正常情况下get/set方法不会采用方法重载)
2.继承
final和private定义的类无法继承!
看代码
关系
继承过程(前提父类定义的是公有方法,公有方法可继承)
在Java中,所有的类,都默认直接或者间接继承Object类(超类:万类之源)
Ctrl+h 看继承列表 在父类/主方法里使用
Super(前提:公有方法)
This调用当前类的东西 | this.name相当于当前类名.name | this.print()相当于当前类名.print() 调用当前类写的print()方法
Super调用父类的东西 | super.name相当于父类类名.name | super.print()相当于父类类名.print() 调用父类里写的print()方法
看代码
总结
super注意点:
1. super调用父类的构造方法,必须在构造方法的第一个
2. super必须只能出现在子类的方法或者构造方法中!
3. super和this不能同时调用构造方法!
Vs this
调用的对象不同:
this调用当前类的东西 哪个对象调用的方法这个this就是指向哪个对象
super调用父类的东西
this:没有继承也可以使用 哪个对象调用的方法这个this就是指向哪个对象
super:只能在继承条件才可以使用
构造方法
this(); 调用本类的无参构造
super(); 调用父类的无参构造!
构造器的先后使用,若存在继承,则先完成父类的构造器,在完成子类的构造器
父类若没有无参构造器,super不能调用父类的无参构造,子类连写无参构造都写不了,子类默认的无参构造器也失效
解决办法:以后每写一个类都把无参构造器写上 (防止自己写了有参构造器覆盖了无参构造器却没注意)
只new对象(会调用无参构造器)不进行其他操作:
存在继承,则先完成父类的构造器,在完成子类的构造器 如下:
方法重写
需要有继承关系,子类才能重写父类的方法!
重写时,子类的方法和父类的方法一致;仅方法体不同!
子类重写了父类的方法,则执行子类的方法(覆盖父类原有的方法)
注意点:
1.方法名必须相同
2.参数列表列表必须相同
3.修饰符: 范围可以扩大但不能缩小 public > Protected > Default > private
4.抛出的异常: 范围,可以被缩小,但不能扩大 ClassNotFoundException--> Exception(大)
为什么需要重写
父类的功能,子类不一定需要,或者不一定满足! 子类可以扩展更多的功能!!
Alt Insert 选择Override Methods 重写快捷键 Ctrl + O 重写快捷键
3.多态
什么类型的对象就执行什么类写的方法
多态注意事项:
多态是方法的多态,属性没有多态
父类和子类,有联系 类型转换异常 ClassCastException
存在条件: 继承关系,方法需要重写,父类引用指向子类对象! Father f1= new Son();
以下无法重写:
1. static方法,属于类,它不属于实例
2. final常量
3.private方法
instanceof 可否转型 关键字
判断这个对象与某个类是否有关系,有则为true,否则为false,有关系才能进行引用类型的转换
引用类型的转换 示例为直转 (子类型转父类型)
解决办法
父类引用指向子类(向上转型)
(1)向上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了一些功能)
(2)向上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法
(3)如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了这个重写的方法,因为程序在运行时知道,这个上转型对象的实体是子类创建的,只不过损失了一些功能而已
(4)对象的向上转型对象再强制转换到该子类的一个对象,这时又具备了子类所有的属性和功能
父--->子 强制转换
已转变的引用类型 新的变量名(任取)=(要转换的引用类型) 要转变的的变量名;
子--->父 直接转换类型
想转变的引用类型 新的变量名(任取)=要转变的的变量名
引用类型转换意义:方便方法的调用,减少重复的代码!简洁
复习static
一句话总结:非静态的属性和方法不能直接通过类名访问
静态代码块?
运行结果:
静态导入包?
抽象类
1.不能new这个抽象类,只能靠子类去实现它
2.抽象类中可以写普通的方法
3.抽象方法必须在抽象类中
意义:提高开发效率
接口
看代码 (implements:实现) 发音: ˈɪmplɪments
接口的作用:
1.约束
2.定义一些方法,让不同的人实现
3.属性默认修饰符: public static final 可以省略不写
4.方法默认修饰符: public abstract 可以省略不写
5.接口不能被实例化,接口中没有构造方法
6. implements关键字可以实现多个接口
7.必须要重写接口中的方法
内部类