Android_开发_Day11_内部类与类的继承
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();
}
}
}
}
实际使用效果:
![](https://img.haomeiwen.com/i18962565/6872980bee8099ed.jpg)
![](https://img.haomeiwen.com/i18962565/b1056061a5a51115.jpg)
![](https://img.haomeiwen.com/i18962565/25a128ff82759aca.jpg)
总结:
类的内部类保证了安全,类的继承方便了程序员不用再去写一些重复的东西,类的多态从一定层面上解决了一些问题。