目的

今天的学习是关于继承关系、代码块和内部类的学习。具体的是完成了一个Person父类,借父类编码了一个Salary组,话不多说,开始今天的学习。

继承关系

在Java中,我们创建的一个类,再进行创建类时需要用到上个类的属性以及变量,可以使用继承来获得上个类的内容。继承的关键字是extants ,具体的使用方式为A extants B,A获得B的属性和变量/A继承B(A为子类,B为父类)。我们在使用是要注意,Java 中只存在单继承关系,要实现多继承只能变相完成,即A想继承B、C属性变量只能通过A继承B,而B继承C的方式完成。下面创建一个Person类为父类,用Students类为子类完成实践。

class Person{
String name;
int age;
public void walk() {
}
public void eat() {
}
}
class Students extends Person1{
private int salary;
@Override
public String toString() {
return "Salary{" +
"hobby='" + name + '\'' +
", age=" + age +
'}';
}
}

代码块

代码块是什么?

代码块是一种常见的代码形式。他用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。

普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块

构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行,都会先执行构造代码块。

静态代码块:他在类中的成员位置,用“{}”括起来的代码。只不过他用了static修饰了,,且执行一次

代码块有什么用?

简单的说,封装。把需要多次使用的属性和方法封装起来,使用时直接调用,或者设置在某些环境下的特殊功能

内部类学习

我们创建一个类之后,在类的内部在定义一个新的类。这个类就是内部类,这个类含有内部类的类称为外部类。内部类可以调用外部类的属性和变量,外部类不能直接使用内部类的东西。需要使用时要通过创建一个新的对象来间接使用。简单的说内部类就是 一个类定义在另一个类的内部

我们使用内部类的原因是:

一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

对于同一个包中的其他类来说,内部类能够隐藏起来。

匿名内部类可以很方便的定义回调。

使用内部类可以非常方便的编写事件驱动程序

image.png

设计一个简单的继承关系

要求:

image.png

具体代码为:

public class Person2 {
protected String name;
protected int age;
public Person2(String name, int age){
this.name = name;
this.age = age;
}
public void walk(){
}
public void eat(){
}
}
class CivilServant extends Person2{
private int salary;
private int count;
public CivilServant(String name, int age,
int salary, int count){
super(name, age);
this.salary = salary;
this.count = count;
}
@Override
public void walk() {
System.out.println("慢慢地走");
}
@Override
public void eat() {
System.out.println("大吃大喝");
}
public void cShow() {
System.out.println("CivilServant{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", count=" + count +
'}');
}
}
class Worker extends Person2{
private int salary;
private String tec;
public Worker(String name, int age, int salary,
String tec){
super(name, age);
this.salary = salary;
this.tec = tec;
}
@Override
public void walk() {
System.out.println("快跑呢");
}
@Override
public void eat() {
System.out.println("急匆匆吃");
}
public void wShow() {
System.out.println( "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", tec='" + tec + '\'' +
'}');
}
}
class Test3{
public static void main(String[] args){
// Person[] peoples = new Person[6];
ArrayList peoples = new ArrayList<>();
Person2 c1 = new CivilServant("小王", 30, 5000, 30);
Person2 c2 = new CivilServant("小李", 32, 7000, 34);
Person2 c3 = new CivilServant("张三", 33, 2000, 32);
//peoples.add((Person2)c1);
peoples.add(c1);
peoples.add(c2);
peoples.add(c3);
Person2 w1 = new Worker("Jack",23,8922, "Android开发");
Person2 w2 = new Worker("Rose",22,10323, "iOS开发");
Person2 w3 = new Worker("Merry",20,8123, "web开发");
peoples.add(w1);
peoples.add(w2);
peoples.add(w3);
for (Person2 p: peoples){
//找到p到底是哪个类型的对象
if(p instanceof CivilServant){
//公务员
CivilServant c = (CivilServant)p;
c.cShow();
c.walk();
c.eat();
}else{
//员工
Worker w = (Worker)p;
w.wShow();
w.walk();
w.eat();
}
}
}
}