Android day8

来源:互联网 发布:高程测量记录表的算法 编辑:程序博客网 时间:2024/06/01 10:32

些天考了UML,里面就有一道题问:面向对象的特征是什么?(答案是:抽象、多态、封装、泛化(继承)),而我们这次课就基本都学习了这四大特征的内容了。

知识点:

1、继承

(1)JAVA类具有单继承特点,每个子类只有一个直接父类
(2)继承父类使用extends关键字
(3)定义一个类未显式声明,默认扩展java.lang.Object类
(4)Object类是所有类的父类

实现一个Bird类和Ostrich类(鸵鸟),Ostrich继承Bird
要求鸵鸟只能在地方奔跑,而其他鸟能够在天上飞

public class Bird {public void behavior(){System.out.println("一般的鸟都会FLY");}public void name() {System.out.println("鸟");}}

public class Ostrich extends Bird{public static void main(String[] args) {Ostrich niao = new Ostrich();niao.name();
niao.behavior();}public Ostrich(){super();}
public void name() {System.out.println("我是鸵鸟");}
public void behavior() {super.behavior();System.out.println("可我只会run");        }}
输出结果为:

我是鸵鸟 

一般的鸟都会FLY

 可我只会run

2、Super限定

(1)用于调用父类被覆盖的实例方法,不能是静态方法(static)(2)例如上面例子的 super.behavior();(3)用于调用父类的构造函数,例如 super(value1,value2)

(子类若想调用父类的构造函数,就必须在子类的构造函数里面调用,如上面的例子)(4)用于调用父类的实例变量,例如 super.val

实现一个BaseClass类和SubClass类,要求重写实例变量和实例方法

public class BaseClass {//实例变量public String name="龙";public void accessOwner(){System.out.println("BaseClass:"+name);}}
public class SubClass extends BaseClass {//子类实例变量将隐藏父类的同名变量public String name="张天爱";                   //将会隐藏BaseClass的name实例变量@Overridepublic void accessOwner() {//super.accessOwner();System.out.println("SubClass:"+name);}public void accessBase(){//访问父类的实例变量System.out.println(super.name);        /*子类中定义了与父类相同的实例变量,         在子类中要调用父类的则需要通过super 限定词进行访问*/}public static void main(String[] args) {SubClass sc=new SubClass();sc.accessOwner();sc.accessBase();}}
输出结果为:
SubClass:张天爱

系统创建SubClass对象时,实际上会为SubClass对象分配两块内存,一块用于存储在SubClass类中定义的name实例变量,一块用于存储从BaseClass类继承得到的name实例变量。


3、多态

(1)Java引用变量有两类:编译时类型和运行时类型
编译时类型:由声明该变量时候用的类型决定
运行时类型:由实际赋值给该变量的对象决定

(2)相同类型的变量、调用同一个方法时呈现出多种不同的行为特征
(3)对象的实例变量不具备多态性
(4)引用变量只能调用它编译时类型的方法,而不能调用运行时类型的方法

public class SubClass2 extends BaseClass2{public String book="Thind in java";public void name() {System.out.println("SubClass2的名字");}public void xuehao() {// TODO Auto-generated method stubSystem.out.println("SubClass2的学号");}public void banji() {// TODO Auto-generated method stubSystem.out.println("SubClass2的班级");}public static void main(String[] args) {// TODO Auto-generated method stubBaseClass2 bcs= new SubClass2();if(bcs instanceof BaseClass2){System.out.println("bcs属于BaseClass2");}if(bcs instanceof BaseClass2){System.out.println("bcs属于SubClass2");}bcs.name();bcs.xuehao();bcs.age();((BaseClass2)bcs).xuehao();   System.out.println("类型:"+bcs.getClass().getName());}}
public class BaseClass2 {public void name() {System.out.println("BaseClass2的名字");}public void xuehao() {// TODO Auto-generated method stubSystem.out.println("BaseClass2的学号");}public void age() {// TODO Auto-generated method stubSystem.out.println("BaseClass2的年龄");}}
输出结果为:

bcs属于BaseClass2
bcs属于SubClass2
SubClass2的名字
SubClass2的学号
BaseClass2的年龄
SubClass2的学号
类型:lesson8.SubClass2


4、引用变量的强制类型转换
//编译类型为Object,实际类型是Integer
Object obj=new Integer(100);
//存在继承关系,可以强制转换
//Integer a=(Integer)obj;
//下面的代码会报错吗?
String str=(String)obj;

报:java.lang.Integer cannot be cast to java.lang.String

可使用instanceOf验证:

if(obj instanceof String){String str=(String)obj;}

5、软件复用:继承

继承带来一个坏处:破坏封装(能否访问和改变父类的状态)
继承应注意:
尽量隐藏父类的内部数据
不要让子类可以随意访问、修改父类方法
尽量不要在父类构造器中调用被子类重写的方法

public class Base {public Base() {//调用test方法test();}public void test(){System.out.println("将要被子类重写的方法");}}
public class Sub extends Base {private String name;@Overridepublic void test() {System.out.println("name字符串长度:"+name.length());}public static void main(String[] args) {Sub s=new Sub();}}
输出结果为:

Exception in thread "main" java.lang.NullPointerException
at lesson8.Sub.test(Sub.java:12)
at lesson8.Base.<init>(Base.java:8)
at lesson8.Sub.<init>(Sub.java:5)
at lesson8.Sub.main(Sub.java:15)


当创建Sub对象时,会先执行Base类中的构造器,里面调用了test()方法,并不是调用Base的test方法,而是调用了Sub的test方法,此时对象的name 实例变量是null,所以就会导致空指针异常


6、初始化块

(1)类的第四种成员:初始化块(变量,方法,构造器)
(2)使用static修饰的叫做静态初始化块

创建java对象时,系统总是先调用类里的初始化块
初始化块的修饰符只能是static
静态初始化块最先执行
初始化块不接收任何参数
多个普通初始化块按顺序执行

public class InitBlock {{int a=6;System.out.println("a="+a);}{String name="龙";System.out.println("name="+name);}//静态初始化块static{boolean isFinished=true;System.out.println("Finish the job:"+isFinished);}public InitBlock() {System.out.println("对象初始化");}public static void main(String[] args) {InitBlock ib=new InitBlock();}}
输出结果为:

Finish the job:true
a=6
name=龙
对象初始化



作业:定义普通人、老师、班主任、学生、学校这些类,提供适当的成员变量、方法用于描述其内部数据和行为特征,并提供主类运行。
场景1:学生在学校上课
场景2:老师给学生布置作业
场景3:班主任要求学生参加学校的文体比赛

要求尽量抽象,封装好各个对象的职责

运行主类:

public class Run {public static void main(String[] args) {// TODO Auto-generated method stubRun run=new Run();run.test1();run.test2();run.test3();}private void test1() {student wang = new student();school zhku = new school();wang.setname("王同学");zhku.setname("学校");wang.setbehavior("上课");System.out.println(wang.getname()+"在"+zhku.getname()+wang.getbehavior());}private void test2() {// TODO Auto-generated method stubstudent song = new student();teacher yu = new teacher();song.setname("宋同学");yu.setname("余老师");yu.setbehavior("布置作业给");System.out.println(yu.getname()+yu.getbehavior()+song.getname());}private void test3() {// TODO Auto-generated method stubstudent xuesheng = new student();mainTeacher laoshi=new mainTeacher();school xuexiao=new school();laoshi.setbehavior("要求");xuesheng.setbehavior("参加");xuexiao.setactivite("文体比赛");System.out.println(laoshi.name+laoshi.getbehavior()+xuesheng.name+xuesheng.getbehavior()+xuexiao.name+xuexiao.getactivite());}}
学生类:(其他类与此类似,所以就只列出一个student类)
public class student {private int age;protected String name = "学生";private String gender;private String banji;private int id;private String behavior;//public student(){//System.out.println("我是:"+name+","+gender+",年龄:"+age+"岁,"+"班级:"+banji+",学号:"+id);//}public void setbehavior(String behavior) { this.behavior = behavior;}public String getbehavior(){return behavior;}public void setbanji(String banji) { this.banji = banji;}public String getbanji(){return banji;}public void setid(int id) { this.id = id;}public int getid(){return id;}public void setname(String name) { this.name = name;}public String getname(){return name;}public void setgender(String gender) { this.gender = gender;}public String getgender(){return gender;}public void setage(int age) { this.age = age;}public int getage(){return age;}}
输出结果为:

王同学在学校上课
余老师布置作业给宋同学
班主任要求学生参加学校文体比赛

0 0
原创粉丝点击