栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

day07

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day07

1 继承 1.1 定义
多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需在定义这些属性和行为,只要继承那个类即可
1.2 格式
public class 子类名 extends 父类名{}
1.3 好处与弊端
(1)好处:提高代码的复用性;提高了代码的维护性;让类与类直接产生了关系,是多态的前提
(2)坏处:让类与类产生了关系,增加了耦合
开发的原则:低耦合高内聚,内聚就是自己完成某件事情的能力
1.4 继承的特点
(1) java中的继承不支持多继承只支持单继承,即:
public class Son extends Father,Grandfather{} //报错
(2)java中的继承支持多层继承,即:
Father先继承Grangdfather,然后Son再继承Father
1.5 继承成员的特点
当子类的成员变量和父类的成员变量名字相同时,就近原则,此时:
A、在方法的局部范围找,如果有就使用
B、在子类的成员范围找,如果有就使用
C、在父类的成员范围找,如果有就使用
d、如果还找不到,就报错
public class Student extends Father{
	public int age = 14;
	public void printAge(){
	int age = 10;
	system.out.println(age) //此时age先在printAge()方法内找,若没找到age,则在class Student类找,若还是找不到,则在Father里找。
	}
}
1.6 构造方法的继承

有几种情况:
1、父类有无参构造方法,子类不管有没有构造方法,此时在main函数中使用子类的成员方法会先执行父类的无参构造方法
2、父类只有有参构造方法,子类不管有没有构造方法,此时在main函数中使用子类的成员方法会报错
3、子类和父类都不写构造方法,不报错

java继承中构造方法的访问特点:
(1)子类构造方法执行之前,会先执行父类的无参构造方法
	原因:因为子类继承父类,会继承父类的非私有成员。而子类在初始化的时候,可能会使用父类的数据,如果父类数据没有先初始化,子类就不能使用这些数据,所以,在子类初始化之前,一定要先完成父类数据的初始化。
问题:假如父类中没有无参构造方法但是有有参构造方法,怎么办呢?
	A:在父类中添加一个无参构造方法。
	B:可以通过super去访问父类的带参构造方法。
	public Son(){
		super(15); //父类的有参构造方法:public Father(int age){}
		System.out.println("son的无参构造方法");
	}
	建议使用第一种解决方案,其实就是要求我们写代码的时候,每次都手动的给出无参构造方法。
1.7 成员方法的继承
a:在子类中找,有就使用
b:在父类中找,有就使用
c:如果没有就报错
2 super关键字 2.1 应用场景
public class Teacher {
public int age = 48;}
public class Student extends Father{
	public int age = 14;
	public void printAge(){
	int age = 10;
	system.out.println(this.age) //我想打印出14,不想打印出10
	system.out.println(super.age) //我想打印出48,不想打印出10
2.2 如何使用
this和super均可如下使用:
A 访问成员变量
	this.成员变量
	super.成员变量
B 访问构造方法
	this(...)
	super(...)
C 访问成员方法
	this.成员方法()
	super.成员方法()
3 方法重写
1、定义:子类中出现了和父类中一模一样的方法声明的情况
2、应用场景:
当子类需要父类的功能,而功能主体子类有自己特有的内容时,
可以重写方法,如下例中newphone的call既保证了phone中的功能,又有自己独特的功能
3、注意事项
--父类中私有方法不能被重写;
--子类重写父类方法时,访问权限不能更低,建议访问权限一摸一样
--@Override表示这个方法是重写父类的方法
注:访问权限 private < 默认修饰符 < public 
private void show() < void show() < public void show()
//父类
public class Phone {
	public void call(String name){
		System.out.println("给"+name+"打电话");
	}
}
//子类
public class Newphone extends Phone{
	public void call(String name){
		System.out.println("开启视频功能");
		super.call(name); //重写父类的打电话功能
	}
}
4 多态 4.1 定义

某一个事物,在不同时刻表现出来的不同状态,如水在不同温度下,有不同的形态

4.2前提
–有继承关系
–有方法重写
–有父类引用指向子类对象
Fu f = new Fu(); 左边叫引用,右边叫对象
Zi z = new Zi();
Fu f = new Zi(); 
4.3 多态中成员的访问特点
成员变量访问特点:
——编译看左边,执行看左边,编译的意思是还没运行代码
成员方法访问特点:
——编译看左边,执行在右边
为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而变量没有。
Animal a = new Cat();
System.out.println(a.age); 输出的是animal中的age
System.out.println(a.weight); 因animal中没有weight成员变量,所以编译时报错
a.eat(); 输出的时cat中的eat
a.playGame(); 因animal中没有playgame方法,所以编译时报错
4.4 多态的好处和弊端
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
public class Animal{ //父类animal
	public void eat(){
	system.out.println("animal eat")
	}
}
public class Cat extends Animal{ //子类cat
	public void eat(){
	system.out.println("cat eat")
	}
}
public class Animaloperate(){
	public void useanimal(cat c){ //Cat c = new Cat()
	c.eat();
	}
	public void useanimal(dog d){ //dog d = new Dog()
	d.eat();
	} 
	// 如果我有很多给子类,那我需要创建很多个这个,只需写以下方法即可无需重复写以上内容
	public void useanimal(Animal a){ //Animal a = new Dog()
	a.eat();
}
测试类:
Animaloperate a = new Animaloperate()
Cat c = new Cat()
Dog d = new Dog()
a.useanimal(c); // cat eat
d.useanimal(d);// dog eat
多态的弊端:不能使用子类的特有功能
4.5 多态转型

多态的弊端:无法访问子类特有方法
要想访问需要多态转型

向上转型
	从子到父
		父类引用指向子类对象
向下转型
	从父到子
		父类引用转为子类对象
Animal a = new Cat(); //向上转型
Cat c = (Cat)a; //向下转型
4.6 多态转型的内存图解
main函数:
//向上转型
Animal a = new Cat();
a.eat(); //猫吃鱼
//向下转型
Cat c = (Cat) a;
c.eat() //猫吃鱼
c.palyGame() //猫捉迷藏
//向上转型
a = new Dog();
a.eat() //狗吃骨头
//向下转型
Cat cc = (Cat) a; //ClassCastException类型转化异常
cc.eat()
cc.palyGame()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号