Java学习笔记(18)——继承

这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。


一、继承

1.1 概述

  • 作用:代码重用、复用
  • 单继承

一个子类,只能继承一个父类

一个父类,可以有多个子类

  • 不继承:

构造方法

私有(private)成员

1.2 子类对象

先新建父类对象

再新建子类对象

两个对象绑定,整体作为一个对象

  • 调用成员

先找子类

再找父类

1.3 方法重写 Override

子类中,重新定义、重新编写从父类继承的方法。

调用该方法时,现在子类中找到这个方法,执行

super.xxxx(),重写方法时,调用父类中同一个方法的代码

1.3.1 练习:人类包括学生、员工

父类Person,对共性的内容进行了描述,例如人的姓名、性别、年龄。子类Student与Employee,分别在父类的基础上,结合子类的具体使用场景,对特性内容进行了描述,例如Student的学校,Employee类的薪水。

package day0704;
public class Person {
	String name;
	String gender;
	int age;
	public Person() {
	}
	public Person(String name,String gender,int age) {
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	public String toString() {
		return name+", "+gender+", "+age;
	} 
}
package day0704;
public class Student extends Person {
	String school;

	/*
	 * 重写 toString() 方法。父类代码不满足子类需要
	 * 在子类中,重新定义,重新编写理解成“覆盖”、“改写”
	 */
	@Override
	public String toString() {
		return super.toString()+", "+school;
	} 
}
package day0704;
public class Employee extends Person {
	double salary;

	@Override
	public String toString() {
		return super.toString()+", "+salary;
	} 
}
package day0704;
public class Test1 {
	public static void main(String[] args) {
		Person p = new Person("张三","男",21);
		Student s = new Student();
		Employee e = new Employee();
		s.name = "李四";
		s.gender = "女";
		s.age = 21;
		s.school = "家里蹲大学";
		e.name = "王五";
		e.gender = "女";
		e.age = 23;
		e.salary = 8000;
		System.out.println(p.toString());
		System.out.println(s.toString());
		System.out.println(e.toString());
	} 
}

1.4 父类的构造方法

创建子类对象时,先创建父类对象,也要先执行父类的构造方法

默认执行父类的无参构造 super()

或者可以手动调用父类有参构造 super(...)

  • super

super.xxxx()        重写时,调用父类同一个方法的代码

super(...)             调用父类的构造方法,且必须是首行代码

1.4.1 练习:坐标点

package day0802;
public class Point {
	int x;
	int y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public double distance() {
		return Math.sqrt(x*x + y*y);
	}
	public String toString() {
		return "("+x+", "+y+")";
	} 
}
package day0802;
public class Point3D extends Point {
	int z;

	public Point3D(int x, int y, int z) {
		//父类不存在无参构造时,
		//必须手动调用有参构造
		super(x, y);
		this.z = z;
	}

	@Override
	public double distance() {
		return Math.sqrt(x*x + y*y + z*z);
	}
	@Override
	public String toString() {
		return "("+x+", "+y+", "+z+")";
	} 
}
package day0802;

public class Test1 {
	public static void main(String[] args) {
		Point a = new Point(3, 4);
		System.out.println(a.toString());
		System.out.println("距原点距离:"+a.distance());

		System.out.println("-------------------");

		Point3D b = new Point3D(3, 4, 5);
		System.out.println(b.toString());
		System.out.println("距原点距离:"+b.distance());
	} 
}

1.4.2 练习:电子宠物

package day0803;
public class Pet {
	String name;
	int full;
	int happy;
	public Pet(String name) {
		this(name, 50, 50);
	}
	public Pet(String name,int full,int happy) {
		this.name = name;
		this.full = full;
		this.happy = happy;
	}
	public void feed() {
		if(full == 100) {
			System.out.println(name+"已经吃饱了");
			return;
		}
		System.out.println("给"+name+"喂食");
		full += 10;
		System.out.println("饱食度:"+full);
	}
	public void play() {
		if(full == 0) {
			System.out.println(name+"已经饿得玩不动了");
			return;
		}
		System.out.println("陪"+name+"玩耍");
		happy += 10;
		full -= 10;
		System.out.println("快乐度:"+happy);
		System.out.println("饱食度:"+full);
	}
	public void punish() {
		//子类不同的代码,改成调方法
		System.out.println(
				"打"+name+"的pp,"+name+"哭叫:"+cry());
		happy -= 10;
		System.out.println("快乐度:"+happy);
	}

	public String cry() {
		//无意义代码
		//cry()方法需要在子类中重写,返回具体哭叫声
		return "此处有哭叫声";
	}
}
package day0803;
public class Dog extends Pet {
	public Dog(String name, int full, int happy) {
		super(name, full, happy);
	}
	public Dog(String name) {
		super(name);
	}

	@Override
	public String cry() {
		return "汪~";
	}
}
package day0803;
public class Cat extends Pet{
	public Cat(String name, int full, int happy) {
		super(name, full, happy);
	}
	public Cat(String name) {
		super(name);
	}

	@Override
	public String cry() {
		return "喵~";
	} 
}
package day0803;
import java.util.Random;
import java.util.Scanner;
public class Test1 {
	public static void main(String[] args) {
		System.out.println("1. 狗");
		System.out.println("2. 猫");
		System.out.print("选择:> ");
		int c = new Scanner(System.in).nextInt();
		System.out.print("给宠物起个名字:");
		String n = new Scanner(System.in).nextLine();
		//定义猫狗变量
		Dog dog = null;
		Cat cat = null;
		if(c == 1) {
			dog = new Dog(n);
			play(dog);
		} else {
			cat = new Cat(n);
			play(cat);
		}
	}
	private static void play(Dog dog) {
		System.out.println("按回车执行");
		while(true) {
			new Scanner(System.in).nextLine();
			int r = new Random().nextInt(6);
			switch(r) {
			case 0: dog.feed(); break;
			case 1: dog.play(); break;
			default: dog.punish(); break;
			}
		}
	}
	private static void play(Cat cat) {
		System.out.println("按回车执行");
		while(true) {
			new Scanner(System.in).nextLine();
			int r = new Random().nextInt(6);
			switch(r) {
			case 0: cat.feed(); break;
			case 1: cat.play(); break;
			default: cat.punish(); break;
			}
		}
	} 
}

1.4.3 练习:判断某坐标点是否在圆内

Point类:

成员变量:x,y

方法:toString()

Circle类:

成员变量:Point o;

方法:inCircle(Point P), toString()

package day0901;
public class Point {
	int x;
	int y;
	//使用成员变量生成构造方法
	//alt + shift + s
	//选 generate constructor using fields...
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {
		return "("+x+", "+y+")";
	} 
}
package day0901;
public class Circle {
	Point o;//默认null
	int r;
	public Circle(Point o, int r) {
		this.o = o;
		this.r = r;
	}
	public boolean inCircle(Point p) {
		//圆心o,与参数点p的距离,小于等于r
		int dx = o.x - p.x;
		int dy = o.y - p.y;
		double d = Math.sqrt(dx*dx + dy*dy);
		return d <= r;
	}
	public String toString() {
		return "圆心:"+o.toString()+",半径:"+r; 
	}
}
package day0901;
public class Test1 {
	public static void main(String[] args) {
		Point a = new Point(3, 4);// 圆心
		Point b = new Point(6, 10);

		Circle c = new Circle(a, 3);
		System.out.println(c.toString());
		//b点是否包含在圆内
		if(c.inCircle(b)) {
			System.out.println(b.toString()+"在圆内");
		} else {
			System.out.println(b.toString()+"在圆外");
		}
	} 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值