Java初识
**
继承
前言
这个系列是根据B站UP主:刘二大人的“Java编程语言入门”的系列视频,将所讲的内容手打出来的( 类似课堂笔记 ),配合视频食用效果更佳。
PS:萌新第一次写博客,如发现了错误,请帮忙指出,万分感谢!最后,希望大家食用愉快,一起进步!
一、代码简介
共有两个包:
inherit:分为2个类:Student,Teather
inherit2:分为3个类:Main,Person,Student
二、Package: inherit
Student
代码如下:
package inherit;
public class Student {
private String name;
private int age;
private double grade;
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;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
this.grade = grade;
}
}
Teather
代码如下:
package inherit;
public class Teather {
private String name;
private int age;
private double salary;
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;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
三、Package: inherit2
Main
package inherit2;
public class Main {
public static void main(String[] args) {
Student student = new Student("5",88,8.3);
//student.setGrade(3.5);
Person p1 = new Person();
Person p2 = new Student();//这个是沿着继承树往上走,是向上转型
//因为student属于person,但person不属于student
//所以 Student n1 = new Person();是错的
//p1.setGrade(3.6);
//这是不允许的,因为p1是一个Person类型的数,而person里面没有setGrade
//可以进行转换://之所以成功,是因为p2本身就是 new Student()
((Student)p1).setGrade(3.6);
//或者
Student s2 = (Student) p2;
/**
Student s1 = (Student) p1;
s1.setGrade(3.6);*/
//这个属于从上往下走,是向下转型,是有风险的
//除非一开始像p2一样定义的是Student();否则会报错
//注意! s1.setGrade(3.6);虽然表面上没有问题,但。。
//运行的时候会报错:类型转换错误;
//因为在编译(进行类型转换的时候,第18行)的时候,
// 编译器不会看p1到底是什么类型的,只有运行的时候才会发现是new Person();
//不含有setGrade
//如果要确切知道到底p1,p2是什么类型的,可以用
System.out.println(p1 instanceof Student);
//instanceof 回复的是 sure或者false;
//这个答案是false
System.out.println(p2 instanceof Student);
//true
System.out.println(p2 instanceof Person);
//true//因为student属于person
}
}
//关于为什么继承的规则这么麻烦
//举个例子:要建立一个核酸的系统,但师生有相同,不同的操作
//用继承就可以放在一起,更好的操作
/*比如:
for(Person p:ps){
if(p instanceof Student){student 的操作}
else (p instanceof Teather){}
else{}
}
* */
Person
package inherit2;
public class Person {
//private String name;
//private int age;
protected String name;
protected int age;
//protected 的作用是允许和它有关系的子类或者子类的子类进行访问
public Person(){}
public Person(String name,int age){
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;
}
}
Student
package inherit2;
public class Student extends Person{
//如果省略了包名,编译器会先在import里找, //看完“包和作用域”补充
// 再在当前的包下找,再到项目下去找, 再去库中去找
//如果没有写extends +类名,编译器会默认继承Object
//只允许从一个类中继承
//Super Parent Base +Class都是被继承类的别名
//subclass extends 是继承类的别名
/*public static void main(String[] args) {
//inherit.Student student;
//inherit2.Student student2;
//包名加类名
}*/
private double getGrade;
public Student(){}
public double getGrade() {
return getGrade;
}
public Student (String name,int age,double getGrade){
super(name, age);
//super就是最直接的联系的父类
//为什么用super呢,因为在Person中已经写明了name和age的this关系
//为了防止代码冗余,用super代替;
//同时super里面不应该是空的,应该加上对应的字段
this.getGrade=getGrade;
}
public void setGrade(double getGrade) {
this.getGrade = getGrade;
}
/*
public String msg(){
return name +age +grade;
}
***如果按照注释的内容来进行的话,编译器会报错,
***因为name和age在Person里面是private的
***但如果设为public,其他的类也可以随机访问,达不到封装的目的
***所以使用protected
*/
public String msg(){
return name+age+getGrade;
}
}
总结
阳光明媚,万物可期!