Android开发成长史

Android_开发_Day11_内部类与类的继承

2019-08-10  本文已影响1人  不要问我问就是百度

Android_开发Day11内部类

目的:

了解什么是内部类,什么是类的继承,以及什么时候用内部类,什么时候需要继承。

技术:

<1> 内部类:内部类顾名思义就是在一个类的内部在写一个类,该类一般是非静态的类,目的就是为了实现良好的封装性,也就是说外部是无论如何都无法访问该内部类,除非该内部类是静态的,但如果是静态的那就失去意义了。但是如果想用该内部类就可以间接的去掉用。

<2> 类的继承:继承用extends关键字,继承父类后可以将父类的方法重写,通常为了规范要写之前加上@override,在调用子类的构造方法的时候会掉用父类的构造方法,当父类的构造方法有参数时需要显示的调用父类的构造方法,用super关键字,这里的super就代表父类,并且是直接父类,而不是间接父类,因为继承会一层一层往上调用super。

<3> 多态:同一个方法在不同的子类中有不同的实现方法。如果有继承关系那么子类的对象可以使用父类变量接收。也就是父类兼容子类。

技术如何使用:

为了了解内部类我们可以看一个示例:
先创建一个布局类,再到这个布局类里面写一个内部类,代码如下:

public class RelativeLayout {
    String view;
    LayoutParams layoutParams1 = new LayoutParams();
    public void show(float left, float right, float top, float bottom){
        LayoutParams layoutParams = new LayoutParams(left,top,right,bottom);
        layoutParams1 = layoutParams;
    }
    //定义一个内部类
    class LayoutParams {
        float leftMergin;
        float topMergin;
        float rightMergin;
        float bottomMergin;
        LayoutParams(){}
        LayoutParams(float leftMergin, float topMergin, float rightMergin, float bottomMergin){
            this.leftMergin = leftMergin;
            this.topMergin = topMergin;
            this.rightMergin = rightMergin;
            this.bottomMergin = bottomMergin;
        }
    }
}

然后在里面写一个show方法间接创造这个类,然后在main方法中掉用该方法创建一个内部类,然后就可以访问这个类了,如果没有这个show方法那是无论如何也调用不了这个方法的。因此main方法的代码如下:

class Test{
    public static void main(String[] args){
        RelativeLayout rl = new RelativeLayout();
        rl.show(10,20,50,36);
        System.out.print("left:"+rl.layoutParams1.leftMergin+" right:"+rl.layoutParams1.rightMergin+" top:"+rl.layoutParams1.topMergin+" bottom:"+rl.layoutParams1.bottomMergin);
    }
}

接下来就是类的继承,我们也可以看一个示例:
首先创建一个人类,大家都有姓名,有年龄,会走会吃,代码如下:

public class Person {
    String name;
    int age;
    public Person(int i){
        //空
    }
    public void walk(){
        //空
    }
    public void eat(){
        //空
    }
}

学生也是人类,学生也有年龄,姓名,会走会吃,但学生还可以有学号,有所属的学校,因此可以让学生继承这个人类,代码如下:

class Student extends Person{
    int num;
    String school;
    public Student(int i) {
        super(10);
        i = 0;
    }
    @Override
    public String toString(){
        return name+":"+school+" "+age+"岁"+" "+"学号是:"+num;
    }
}

好当写好学生构造方法时你就会发现出错了,原因就是,上面所说的“在调用子类的构造方法的时候会掉用父类的构造方法,当父类的构造方法有参数时需要显示的调用父类的构造方法,用super关键字,这里的super就代表父类,并且是直接父类,而不是间接父类,因为继承会一层一层往上调用super。”,因此这个地方需要注意一下。因此我们就可以在main方法中写了,代码如下:

class Test1{
    public static void main(String[] args){

        Student xw = new Student(10);
        xw.name = "李四";
        xw.age = 18;
        xw.num = 10086;
        xw.school = "xx大学";
        System.out.print(xw);
   }
}

接下来就来感受一下类的多太的用处,假设一家公司有公务员和员工若干,员工和公务员都是继承于人类的,现在要将他们的信息 公务员:薪水 每日看报数 员工:薪水 从事的技术 保存到数组中并且要能取出来,因此类里面尽量写一个show方法。因此创建这两个类,代码如下:

class CivilServant extends Person{
    int salary;
    int num;
    public CivilServant(String name,int age,int i,int j) {
        super(i);
        salary = i;
        num = j;
        super.name = name;
        super.age = age;
    }
    public void show(){
        System.out.print(name+" "+age+"岁"+" "+"salary:"+salary+" "+"paper:"+num);
    }
}
class Clerk extends Person{
    int salary;
    String tec;
    public Clerk(String name,int age,int i,String tec) {
        super(i);
        salary = i;
        this.tec = tec;
        super.name = name;
        super.age = age;
    }
    public void show(){
        System.out.print(name+" "+age+"岁"+" "+"salary:"+salary+" "+"从事"+tec);
    }
}

接下来就是要在main方法中用一个ArrayList来存放这些信息,同时因为ArrayList只能存放一种类型,因此就要用到多态,因此主函数可以写成:

class Test1{
    public static void main(String[] args){
        ArrayList<Person> persons = new ArrayList<>();
        Person cs1 = new CivilServant("张三",30,5000,30);
        persons.add(cs1);
        Person cs2 = new CivilServant("李四",32,6000,20);
        persons.add(cs2);
        Person cs3 = new CivilServant("王五",35,7000,30);
        persons.add(cs3);
        Person c1 = new Clerk("小明",25,8000,"android开发");
        persons.add(c1);
        Person c2 = new Clerk("小芳",24,9000,"ios开发");
        persons.add(c2);
        Person c3 = new Clerk("小李",30,10000,"web开发");
        persons.add(c3);
        for (Person person:persons) {
            if (person instanceof CivilServant){
                CivilServant cs = (CivilServant)person;
                cs.show();
            }
            else{
                Clerk c = (Clerk)person;
                c.show();
            }
        }

    }
}

实际使用效果:

内部类最后的运行效果 类的继承最后的运行效果 多态最终的运用效果

总结:

类的内部类保证了安全,类的继承方便了程序员不用再去写一些重复的东西,类的多态从一定层面上解决了一些问题。

上一篇 下一篇

猜你喜欢

热点阅读