封装继承(代表性代码)
Posted penguin1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装继承(代表性代码)相关的知识,希望对你有一定的参考价值。
1.定义一个Person类
public class Person { private String name; // 姓名 private int age; // 年龄 public Person() { // 无参构造 super(); } public Person(String name, int age) { // 有参构造 super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override // 重写toString()方法 public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void show() { System.out.println("Person类中的show()方法"); } }
2.写一个Student 学生类
public class Student extends Person { private int id; // 学号 public Student() { // 无参构造 super(); } public Student(String name, int age,int id) { // 有参构造 super(name,age); // 调用父类中的构造方法 this.id = id; } //提供供外界访问的 get/set()方法 public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public String toString() { return "Student [id=" + id +" name="+getName()+" age="+getAge()+ "]"; } @Override public void show() { System.out.println("Student类中重写后的show()方法"); } }
3.写一个 Teacher 教师类
package com.monkey1024; public class Teacher extends Person { private double salary; // 工资 public Teacher() { super(); } public Teacher(String name, int age,double salary) { super(name, age); this.salary = salary; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Person [name=" + getName() + ", age=" + getAge() + ", salary="+salary+"]"; } @Override public void show() { System.out.println("Teacher类中重写后的show()方法"); } }
测试类:
public class Test { public static void main(String[] args) { // 创建一个学生类 Student student = new Student("小茅棚",23,01); // 姓名,年龄,学号 System.out.println(student); student.show(); System.out.println("--------------------"); // 创建一个教师类 Teacher teacher = new Teacher("马云",55,88888.8); // 姓名, 年龄, 工资 System.out.println(teacher); teacher.show(); } }
控制台结果:
Student [id=1 name=小茅棚 age=23] Student类中重写后的show()方法 -------------------- Person [name=马云, age=55, salary=88888.8] Teacher类中重写后的show()方法
测试类中写如下内容:
public class Test { // 定义一个静态的print()方法,既能打印人类的功能,又能打印老师的功能 还能能打印学生的功能
public static void print(Person p) { // 形参要的是是一个Person类型 p.show(); } public static void main(String[] args) { Test.print(new Person()); System.out.println("--------------"); Test .print(new Student()); System.out.println("--------------"); Test.print(new Teacher()); } }
控制台结果:
Person类中的show()方法 -------------- Student类中重写后的show()方法 -------------- Teacher类中重写后的show()方法
public static void print(Person p) {
该方法中要求的是一个 Person类型的引用作为方法的形参
在main()方法的代码中,把Person类的子类 Student类的引用 和 Teacher类的引用作为形参 传递 过去,并不报错。且运行阶段 调用的是他们各自的方法。
代码改进:
如 Person类中,有 name 和 age属性,其中age代表的是年龄。
生活经验告诉我们,年龄通常不能小于0,且通常不会超过150岁。
但是在以上的代码中,将age设置为负数 或 888,程序也正常运行。这显然是不符合逻辑的。
改动代码:
在setAge()方法中 对传入的 age值做合理值 判断
public void setAge(int age) {
if(age>0 && age<=150) // 判断条件
this.age = age;
else
System.out.println("年龄输入不符合常理....");
}
在构造方法中将 this.age= age; 改为setAge(age);
public Person(String name, int age) { // 有参构造 super(); this.name = name; // this.age = age; setAge(age); }
测试:
System.out.println(new Person("james",888));
控制台打印结果:
年龄输入不符合常理.... Person [name=james, age=0]
同理,像salary、id 等属性 都最好 传值前做合理值判断,来避免发生夸张不合常理的运算结果
当然也可以使用暴力点的方式处理问题,若传入不符合常理的age值,直接让程序产生异常 (暂不补充)
还有注意:
super(); // 写在子类构造方法体的首行,表示 调用父类中的无参构造
super(属性类型1,属性值1, 属性类型2 属性值2...); //表示调用父类中对应的有参构造
super.父类方法(); // 写在子类重写之后的方法体内,表示 调用父类中的该方法
this关键字 表示 --"当前对象" 谁调用该方法,this 代表的就是 谁这个对象
以上是关于封装继承(代表性代码)的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装