您的位置:首页 > 移动开发 > Android开发

Android day8

2016-06-18 10:57 459 查看
些天考了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实例变量
@Override
public 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 stub
System.out.println("SubClass2的学号");
}
public void banji() {
// TODO Auto-generated method stub
System.out.println("SubClass2的班级");
}

public static void main(String[] args) {
// TODO Auto-generated method stub

BaseClass2 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 stub
System.out.println("BaseClass2的学号");
}

public void age() {
// TODO Auto-generated method stub
System.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;
@Override
public 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 stub

Run 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 stub
student 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 stub
student 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;
}
}
输出结果为:

王同学在学校上课

余老师布置作业给宋同学

班主任要求学生参加学校文体比赛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息