这里将自己学习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()+"在圆外");
}
}
}