提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
JAVA面向对象学习日记
一、何为面向对象?
例如:下床是一个过程
其中涉及自己 梯子 地面 这些叫做对象
下床的过程叫做面向过程
如何做这些过程叫做面向对象
你在扶着梯子下床----- 也就是解析每一个对象改做的事情
二、面向对象的基本特征:封装 继承 多态
1.封装
只看字面意思 密封 包装
密封 --提高代码的隐蔽性和安全性
包装–包起来就比较方便–提高代码重用性
提高安全性
总结封装的优点:
1.隐藏实现细节,提供公共的访问方式
2.提高了代码的复用性
3.提高安全性
如何实现封装呢?
使用 private 关键字 来修饰成员变量和成员方法,将不需要对外提供的内容都隐藏起来,提供公共方法对其访问。
意义:将内部的实现细节隐藏起来,对外部的调用者来说是透明的,调用者也不用关心它内部是怎么实现的,只需要知道这个方法是干什么的就好。
2.继承
看字面意思
子类继承父类
子类拥有父类属性并且可以调用父类方法
如何调用?–过 super 关键字来实现
子类只能有一个父类–用你自己和你父亲来表示 —你只有一个父亲!
但是接口不一样 接口可以继承多个接口
代码如下(示例):
public class Animal {
private String name;
private String gender;
public Animal(){}
public Animal(String name, String gender) {
this.name = name;
this.gender = gender;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
// public void sleep(){
// //一只 ? 性别 的 ?名字 在睡觉
// System.out.println("一只"+this.gender+"的"+this.name+"碎觉");
// }
public void sleep(){
// 在睡觉
System.out.println("碎觉");
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
—继承实现
public class Cat extends Animal {
public Cat (String name,String gender,int age){
//继承动物类的属性
//继承动物类的碎觉方法
super(name, gender);
}
—测试类显示效果
public static void main(String[] args) {
Cat cat=new Cat("梨花","雌",1);
//只输出名字 也就是获取这只猫的名字
System.out.println("输出名字:"+cat.getName());
cat.sleep();
}
提到继承引入一个新的知识点 --重写
何为重写?
子类继承父类 子类重写父类方法
如何实现?
举个例子:有一个动物类(内有String name 名字和 String gender 性别 )
动物内有一个碎觉方法 输出碎觉
碎觉代码实现:
public void sleep(){
// 在睡觉
System.out.println("碎觉");
}
和一个猫类(内有String name 名字 和 String gender 性别 和 int age 年龄 )
猫类继承动物类 并重写碎觉方法
代码演示如下
动物类
public class Animal {
private String name;
private String gender;
public Animal(){}
public Animal(String name, String gender) {
this.name = name;
this.gender = gender;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
// public void sleep(){
// //一只 ? 性别 的 ?名字 在睡觉
// System.out.println("一只"+this.gender+"的"+this.name+"碎觉");
// }
public void sleep(){
// 在睡觉
System.out.println("碎觉");
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
猫类
public class Cat extends Animal {
public Animal sleep(String name,String gender) throws RuntimeException {
//重写猫的碎觉方法
//一只 ? 性别 的 ?名字 在睡觉
System.out.println("一只"+gender+"的"+name+"碎觉");
return new Animal(name,gender);
}
public Cat (String name,String gender,int age){
//继承动物类的属性
//继承动物类的碎觉方法
super(name, gender);
}
public static void main(String[] args) {
Cat cat=new Cat("梨花","雌",1);
//只输出名字 也就是获取这只猫的名字
System.out.println("输出名字:"+cat.getName());
cat.sleep("大橘","雌");
}
}
这里重写了动物的睡觉方法才可以实现重写猫的睡觉方法
因为猫是继承动物类的!–子类继承父类 子类重写父类方法
注意!!
重写和重载的区别!
重写和重载的区别是什么?
重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。
重载和重写的区别如下
1.定义不同—重载是定义相同的方法名,参数不同;重写是子类重写父类的方法。
2.范围不同—重载是在一个类中,重写是子类与父类之间的。
3.多态不同—重载是编译时的多态性,重写是运行时的多态性。
4.返回不同—重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型。
5.参数不同—重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同。
6.修饰不同—重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符。
3. 多态
多态:同一个行为具有多个不同表现形式或形态的能力。
1、 继承的存在;(继承是多态的基础,没有继承就没有多态)。
2、子类重写父类的方法。(多态下会调用子类重写后的方法)。
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)。
重载:子类重写父类 方法 参数名 参数类型 参数顺序都需要改变 并且重写父类方法内容(发生在类当中)型
//转型待更
向上转型 (这是向下转型的基础和前提)
China china=new Human() //先向上转型
这样记忆 中–中国(子类) 人–人类(父类)
中 *= new 人 简称 中人
向上转型的作用:
1.减少一些重复的代码
2.对象实例化的时候可以根据不同需求实例化不同的对象
向下转型 (向上转型是向下转型的基础和前提)
Father f=new Son() //先向上转型
Son s=(Son) f;//再进行向下转型,进行强制转换,子类引用s,父类引用f
向下转型的作用
向上转型时 ,会遗失子类对象独有的其他方法;可以通过向下转型在重新转回。
转型总结
父类类型转换为子类类型
向下转型的前提:先进行向上转型
Human man = new Chinese();//向上转型
Chinese man2 = (Chinese)man; //向下转型
(向上转型)人中 ----向下 人中 中人 人中