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

Day09 继承 super

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

Day09 继承 super

1 继承 1.1 场景
package com.zhiyou100.day09;

public class Demo01 {
	public static void main(String[] args) {
		   Student student=new Student(11,"张一",18);
		   Teacher teacher=new Teacher(31, "张二", 10000);
		   Worker worker=new Worker(43, "张三", "律师");
		   System.out.println(student.toString());
		   System.out.println(teacher.toString());
		   System.out.println(worker.toString());
		   
	}
}
class Student{
	int age;
	String name;
	double score;
	public String toString() {
		return age + ", " + name + ", s" + score;
	}
	void show() {}
	void add() {}
	public Student(int age, String name, double score) {
		super();
		this.age = age;
		this.name = name;
		this.score = score;
	}
}

class Teacher{
	int age;
	String name;
	double salary;
	public String toString() {
		return age + ", " + name + ", " + salary;
	}
	void show() {}
	void teach() {}
	public Teacher(int age, String name, double salary) {
		super();
		this.age = age;
		this.name = name;
		this.salary = salary;
	}
	
}
class Worker{
	int age;
	String name;
	String job;
	@Override
	public String toString() {
		return  age + ", " + name + ", " + job ;
	}
	void show() {}
	void work() {}
	public Worker(int age, String name, String job) {
		super();
		this.age = age;
		this.name = name;
		this.job = job;
	}
}
//总结:这三个类:相同内容很多 复用性比较差
    改进:可以定义一个类Person:具有这三个类的共同的成员  然后让Person类被这三个类使用(继承) 
         此时这三个类就不需要再定义Person类中定义的所有内容了 此时就提高了类的复用性
  	继承:在类与类之间创建关联关系
1.2 概念

当一个新类拥有一个现有的类的所有成员时 此时可以让此新类从现有的类 派生、衍生
新类:子类
现有的类:父类、根类、超类
继承关键字:extends
继承格式:class 子类 extends 父类{
子类成员
}

特点:
1 子类继承父类 父类没有任何影响
2 子类中拥有父类中定义的所有成员
3 子类不能继承父类的构造方法
4 子类可以拥有一些父类没有的成员–子类特有成员
5 子类继承了父类的私有成员 但不能直接使用 只能通过父类的方法间接来使用
6 子类可以根据需求 重新定义父类的已有成员
子类重新定义父类的成员变量 要求:变量名相同即可
子类重新定义父类的成员方法 要求:返回值类型相同 方法名相同 参数列表相同(方法声明完全相同) 重写override
类似于::进化
7 一类如果没有继承其他类 默认继承Object类 :Object类–上帝类
8 java只支持类与类之间的单继承:一个类只能有一个直接父类 但可以有多个间接父类

继承:类与类之间创建关联关系 实现类的复用

public class Demo02Extends {
   
	public static void main(String[] args) {
		Fu02 f1=new Fu02(); //父类对象
		Zi02 z1=new Zi02(); //子类对象
		System.out.println(z1.a+":"+z1.b+":"+z1.c);
		z1.show();
		System.out.println(z1.a);
		z1.smoke();
	}
}
class Fu02 extends Object{//一类如果没有继承其他类 默认继承Object类 
	int a=11;
	int b=13;
	void show() {
		System.out.println(this.k);
	}
	void hai() {}
	public Fu02() {
		super();
	}
	public Fu02(int a, int b) {
		super();
		this.a = a;
		this.b = b;
	}
	private int k=1;//私有成员:只能在本类中访问
	
    String enjoy="打牌";//此属性要被子类重新定义
	void smoke() {//此方法要被子类重新定义--重写
		System.out.println("水烟袋!");
	}
}

class Zi02 extends Fu02{
	//int a=-1;//子类重新定义
	String a="aaaa";
	int c=14;//子类特有
	void hehe() {}
	void show() {//子类重新定义
		System.out.println(a+":"+b+":"+c);
	}
	
	 String enjoy="打游戏";//子类重新定义:属性名相同即可
	//父类的方法 无法满足子类的需求  子类对父类的方法进行改进--修改方法体
	void smoke() {//从新定义父类的方法(不能满足子类需求)---重写--方法声明相同
		System.out.println("过滤嘴!");
	}
}

1.3 继承练习1

父类的创建:抽取所有子类的共同成员 形成父类父类存在的意义:为所有的子类定义规范

//刚学习继承:先写子类  再写父类  让子类继承父类
//           父类:把子类的共同成员提取出来 形成父类
// 一定使用eclipse: 
//*创建三个类
//*正方形 square
//*长方形 rect
//*圆形 circle
//*必须属性:三个方法:show +qiuZC+qiuMJ  提供一些必须的构造方法
//1 定义子类
//3 让所有的子类继承父类
class Square  extends Shape{
	//1.1 创建 变量 描述数据
	double bianChang;
	String type="正方形";
	//1.2 创建 方法 描述功能
	void show() {
		System.out.println(type+":bianChang="+bianChang);
	}
	double qiuZC() {
		return 4*bianChang;
	}
	double qiuMJ() {
		return bianChang*bianChang;
	}
	//构造方法重载:满足不同对象的需求:
	Square(){}
	Square(double bianChang){
		this.bianChang=bianChang;
	}
	
}
class Rect extends Shape{
	double chang;
	double kuang;
	String type="长方形";//重新定义父类的成员变量
	void show() {//子类重写
		System.out.println(type+":chang="+chang+",kuang="+kuang);
	}
	double qiuZC() {//子类重写
		return 2*(chang+kuang);
	}
	double qiuMJ() {//子类重写
		return chang*kuang;
	}
	//alt+shift+s
	Rect(double chang, double kuang) {
		this.chang = chang;
		this.kuang = kuang;
	}
	Rect() {}
}

class Circle extends Shape{
	double r;          //子类特有
	double pi=3.1415926;//子类特有
	String type="圆形";//重新定义父类的成员变量
	void show() {      //子类重写
		System.out.println(type+":r="+r);
	}
	double qiuZC() { //子类重写
		return 2*pi*r;
	}
	double qiuMJ() { //子类重写
		return pi*r*r;
	}
	public Circle(double r) {
		this.r = r;
	}
	public Circle() {}
	public void hehe() {}//子类特有
}
//父类的作用:为子类定义规范:如果是Shape类的子类:必须有type属性和qiuZC、qiuMJ、show方法
//2 定义父类
class Shape{
	String type="形状";
	void show() {
		System.out.println(type);
	}
	double qiuZC() {//信息不完整:无法求周长
		return 0;
	}
	double qiuMJ() {//信息不完整:无法求面积
		return 0;
	}
}
1.4 继承练习2

定义子类时:分清此成员是子类特有 还是 子类重新定义子类对象调用成员时:分清是子类特有、子类重新定义、父类继承

package com.zhiyou100.day09;
public class Demo04 {
	public static void main(String[] args) {
		Demo04Zi zi=new Demo04Zi();
		System.out.println(zi.a);//子类重写定义的a:::从父类继承的a被隐藏
		System.out.println(zi.b);//子类从父类继承的b
		System.out.println(zi.c);//子类特有的 c
		
		zi.show();//子类重写后的show:::从父类继承的show被隐藏
		zi.hai();//子类从父类继承的hai
		zi.hehe();//子类特有
	}
}
//创建父类:提取子类的共同成员 形成父类
class Demo04Fu{
	int a=1;
	int b=2;
	void show() {
		System.out.println("父类:::show");
	}
	void hai() {
		System.out.println("父类:::hai");
	}
	Demo04Fu(int a){}
}
class Demo04Zi extends Demo04Fu{
	int a=11;//子类重新定义
	int c=12;//子类特有
	void show() {//重写
		System.out.println("子类:::show");
	}
	void hehe() {//子类特有
		System.out.println("子类:::hehe");
	}
	Demo04Zi(int a){
		super(a);//调用父类的构造方法
	}//Implicit super constructor Demo04Fu() is undefined. Must explicitly invoke another constructor
	Demo04Zi(){
		super(1);//所有的子类构造方法第一个语句必须是super(参数列表) 来调用父类的构造方法
	}
}
2 super

this: 当前对象
使用场景1:方法中当成员变量与局部变量重名时 变量名默认指向局部变量
通过this.变量名来指向成员变量
注意:方法中成员前面默认有this.
使用场景2: 构造方法之间的相互调用 通过this(参数列表);
// this(参数列表)必须是当前方法的第一个语句

super: 父类的; 超级的
使用场景1:当子类重新定义父类成员时 从父类继承的成员会被隐藏 (子类方法中调用这些成员时 默认指的是重新定义后的)
通过super.成员来调用父类被隐藏的成员
子类方法中调用父类成员:前面默认有super.
使用场景2: 所有的子类构造方法的默认通过super()调用父类无参数的构造方法
如果父类没有无参数的构造方法 需要显式通过super(参数列表)来调用父类有参数的构造方法
// 注意:super(参数列表)必须是第一个语句

package com.zhiyou100.day09;
public class Demo05Super {
	public static void main(String[] args) {
		//Demo05Zi  zi=new Demo05Zi();
		//zi.hehe();
		Demo05Zi zi=new Demo05Zi(1.1);
	}
}
class Demo05Fu{
	int a=1;
	int b=2;
	void show() {
		System.out.println("父类:::show");
	}
	void hai() {
		System.out.println("父类:::hai");
	}
    //-----------构造方法
	Demo05Fu(int a){}
	Demo05Fu(){
		System.out.println("Demo05Fu()");
	}
}
class Demo05Zi extends Demo05Fu{
	int a=11;//子类重新定义
	int c=12;//子类特有
    
	void show() {//重写
		System.out.println("子类:::show");
	}
    
	void hehe() {//子类特有
		//System.out.println("子类:::hehe");
		System.out.println("a="+a);
		System.out.println("super.a="+super.a);//调用父类的a
		show();//调用的子类
        //重写后的show
		super.show();//调用父类的show
		System.out.println(b+":"+super.b);
		super.hai();
	}
    //------------构造方法
	Demo05Zi(int a){
		super(a);//调用父类的构造方法
	}//Implicit super constructor Demo04Fu() is undefined. Must explicitly invoke another constructor
	Demo05Zi(){
		super(1);//所有的子类构造方法第一个语句必须是super(参数列表) 来调用父类的构造方法
	}
	Demo05Zi(double d){
		//默认super()调用父类无参数的构造方法
		System.out.println("Demo05Zi(double d)");
	}
}

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

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

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