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

※、继承的概念、方法重写的概念

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

※、继承的概念、方法重写的概念

※继承

子类继承父类,目的子类扩展父类的属性以及方法,就是为了实现代码的复用(继承在Java中只能单继承,不能多继承)

--子类可以继承父类中有 权限访问的属性以及方法

--所有的引用类型都默认继承了超类Object

--继承的概念



// 如果多个类是相似,但是没有做优化处理,当后期维护更新,则修改修改所有代码
// 继承是类与类之间的关系  可以理解为is a
// Student is a Person
public class Person {
	String name;
	String sex;
	int age;

	void eat() {
		System.out.println("普通的吃饭行为!");
	}
	void sleep() {
		System.out.println("普通的睡觉行为!");
	}
}
 class Student extends Person{

//操作一:
// 子类会继承父类的东西【属性、方法】
public void test() {
	System.out.println(name);
	System.out.println(sex);
	System.out.println(age);
	eat();
	sleep();
    }
}

--继承的注意事项


public class Person {
	//操作一:
	//私有化一个属性;
	private String name;
	String sex;
	int age;
 }
 // Student去扩展、继承
class Student extends Person {
	public void test() {
		// 操作一:
		// 这个人类里面类的名字不可见
		// The field Person.name is not visible
		// System.out.println(name);

		// 操作二:
		// 输出一个hascode的方法,并查看源码,发现hashcode()方法在Object类型里面
		System.out.println(hashCode());
	}
	// 细节:
	// 1、私有化属性和方法不能继承的,非私有化的看权限【default需要查看是否在同一个包内、protected可以、public可以】
	// 2、继承中只有单继承,没有多继承,所有的引用类型的超父类为Object
	// 3、继承链的概念:Student-->Person-->Object

}

※方法的重写(两同、一大、两小)

子类重写父类的方法(子类覆盖父类的方法),凸显出子类的行为特征

--方法名相同、方法参数列表相同

--和方法修饰符、返回值类型有关

--子类重写父类的方法,子类方法的权限修饰符比父类的大或者相等

--子类重写父类的方法,子类的返回值类型比父类的小或者相等【引用类型】【基本数据类型要一致或者类型提升兼容】

--子类重写父类的方法,子类的抛出的异常类型要比父类的小或者相等

--当子类中有和父类一样的私有化方法,那么子类的私有化方法是一个普通方法,并不是重写了父类的方法


public class Person{
	
	public int demo() {
		return 1;
	}
	
	public Person demo1() {
		return new Person();
	}
	
	// 引用类型
	public String demo2() {
		return "";
	}
	
	public Person demo3() throws NullPointerException {
		return new Person();
	}
	
	private void demo5() {
		
	}
	
    void eat() {
		System.out.println("人吃饭的行为");
  }

}
class Student extends Person {
//	// 两同
//	// 操作一:
//	// 子类要和父类的方法名相同
//	@Override
//	public void eat1() {
  报错: The method eat1() of type Student must override or implement a supertype method
//		System.out.println("学生在饭堂吃饭");
//	}
//
//	// 操作二:
//	// 子类的方法参数列表和父类的方法参数列表要一致
//	@Override
//	public void eat(String name) {
      报错:The method eat(String) of type Student must override or implement a supertype method
//		System.out.println("学生在饭堂吃饭");
//	}
//
//	// 一大
//	// 操作一:
//	// 因为子类的权限修饰符要比父类的大
//	private void eat() {
//		System.out.println("学生在饭堂吃饭");
//	}
//
//	// 而现在父类使用的修饰符是default 子类使用的是private 权限修饰符比它要小一个级别
//
//	// 操作二:
//	// 但要是我使用public 和 protected的时候就可以了,因为比它大一个级别和两个级别
//	// 所以子类的权限修饰符要比父类的权限修饰符要大
//	@Override
//	protected void eat() {
//		System.out.println("学生在饭堂吃饭");
//	}
//
//	@Override
//	public void eat() {
//		System.out.println("学生在饭堂吃饭");
//	}
//
//	// 一小:
//	// 基本数据类型--类型提升 【基本数据类型要一致或者类型提升兼容】
//	// 操作一:
//	public int demo() {
//		return 1;
//	}
//
//	// 操作二:
//	// 编译运行成功 因为子类的基本数据类型都比父类的数据类型相等或者小于它
//	public int demo() {
//		int item = 1;
//		return item;
//	}
//
//	public int demo() {
//		short item = 1;
//		return item;
//	}
//
//	// 操作三:
//	// long类型比int类型大
//	public int demo() {
  报错:Type mismatch: cannot convert from long to int
//		long item = 1;
//		return item;
//	}
//
	
//	--子类重写父类的方法,子类的返回值类型比父类的小或者相等
	// 操作一:
//	public Person demo1() {
//		return new Person();
//	}

	// 操作二:
//	public Student demo1() {
//		return new Student();
//	}
	
	
//	// 引用类型 【引用类型,前提是要有继承链,子类的返回值类型比父类的小或者相等】
//	// 操作一: 
//	public String demo2() {
//		return "";
//	}
//
//	// 操作二:
  报错:The return type is incompatible with Person.demo1()	
  原因:Person类不是String类里的,也没有产生继承链
//	public Person demo2() {
//		return new Person();
//	}
	

//	// 操作三:
  报错:The return type is incompatible with Person.demo1()
  原因:	Student类不是String类里的,也没有产生继承链
//	public Student demo2() {
//		return new Student();
//	}
//	
	
	// --子类重写父类的方法,子类的抛出的异常类型要比父类的小或者相等
	// 操作一:  
//	public Person demo3() throws NullPointerException {
//		return new Person();
//	}
	
	// 操作二: 
	// 报错:Exception Exception is not compatible with throws clause in Person.demo3()
    // 这里重写的方法的异常比父类的大,不兼容,所以报错
//	public Person demo3() throws Exception {
//		return new Person();
//	}
	
	// --当子类中有和父类一样的私有化方法,那么子类的私有化方法是一个普通方法,并不是重写了父类的方法
	// 操作一:
	// 这里相当于重写在子类里面定义一个新的方法【并不是方法重写】
//	private void demo5() {
//
//	}
	
	// 操作二:
	// 加上重写注解
	// 报错:The method demo5() of type Student must override or implement a supertype method
	// 原因是因为父类中私有化了方法,子类中无法重写父类的私有化方法
//	@Override
//	private void demo5() {
	
//	}

}

-- 方法重写练习:

《一》 --定义一个动物类Animal

--属性name、sex

--定义eat方法()

《二》定义一个鸟类Bird,继承动物类的属性,子类重写父类的eat方法,定义一个移动move【飞行】的方法

《三》在鸟类中定义一个移动方法move()

--定义一个鸵鸟类ostrich 继承鸟类 ,重写鸟类的移动move【奔跑】方法



public class Animal {

	// 测试
	public static void main(String[] args) {
		Animal a = new Animal("动物", "未知");
		a.eat();// 动物在进食... 性别:未知

		Bird b = new Bird("小鸟", "公");
		b.eat();// 小鸟在进食... 性别:公
		b.move();// 小鸟通过飞行进行移动...
		Ostrich o = new Ostrich("鸵鸟", "母");
		o.eat();// 鸵鸟在进食... 性别:母
		o.move();// 鸵鸟通过飞行进行移动...

	}

	String name;
	String sex;

	public Animal(String name, String sex) {
		super();
		this.name = name;
		this.sex = sex;
	}

	public void move() {
	}

	public void eat() {
		System.out.printf("%s在进食... 性别:%sn", name, sex);
	}
}

class Bird extends Animal {
	public Bird(String name, String sex) {
		super(name, sex);

	}

	@Override
	public void eat() {
		System.out.printf("%s在进食... 性别:%sn", name, sex);
	}

	public void move() {
		System.out.printf("%s通过飞行进行移动...n", name);
	}
}

class Ostrich extends Bird {
	public Ostrich(String name, String sex) {
		super(name, sex);
	}

	@Override
	public void eat() {
		System.out.printf("%s在进食... 性别:%sn", name, sex);
	}

	@Override
	public void move() {
		System.out.printf("%s通过飞行进行移动...n", name);
	}
}

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

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

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