Android day8
2016-06-18 10:57
459 查看
些天考了UML,里面就有一道题问:面向对象的特征是什么?(答案是:抽象、多态、封装、泛化(继承)),而我们这次课就基本都学习了这四大特征的内容了。
知识点:
1、继承
(1)JAVA类具有单继承特点,每个子类只有一个直接父类
(2)继承父类使用extends关键字
(3)定义一个类未显式声明,默认扩展java.lang.Object类
(4)Object类是所有类的父类
实现一个Bird类和Ostrich类(鸵鸟),Ostrich继承Bird
要求鸵鸟只能在地方奔跑,而其他鸟能够在天上飞
输出结果为:
我是鸵鸟
一般的鸟都会FLY
可我只会run
2、Super限定
(1)用于调用父类被覆盖的实例方法,不能是静态方法(static)(2)例如上面例子的 super.behavior();(3)用于调用父类的构造函数,例如 super(value1,value2)
(子类若想调用父类的构造函数,就必须在子类的构造函数里面调用,如上面的例子)(4)用于调用父类的实例变量,例如 super.val
实现一个BaseClass类和SubClass类,要求重写实例变量和实例方法
系统创建SubClass对象时,实际上会为SubClass对象分配两块内存,一块用于存储在SubClass类中定义的name实例变量,一块用于存储从BaseClass类继承得到的name实例变量。
3、多态
(1)Java引用变量有两类:编译时类型和运行时类型
编译时类型:由声明该变量时候用的类型决定
运行时类型:由实际赋值给该变量的对象决定
(2)相同类型的变量、调用同一个方法时呈现出多种不同的行为特征
(3)对象的实例变量不具备多态性
(4)引用变量只能调用它编译时类型的方法,而不能调用运行时类型的方法
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验证:
5、软件复用:继承
继承带来一个坏处:破坏封装(能否访问和改变父类的状态)
继承应注意:
尽量隐藏父类的内部数据
不要让子类可以随意访问、修改父类方法
尽量不要在父类构造器中调用被子类重写的方法
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
静态初始化块最先执行
初始化块不接收任何参数
多个普通初始化块按顺序执行
Finish the job:true
a=6
name=龙
对象初始化
作业:定义普通人、老师、班主任、学生、学校这些类,提供适当的成员变量、方法用于描述其内部数据和行为特征,并提供主类运行。
场景1:学生在学校上课
场景2:老师给学生布置作业
场景3:班主任要求学生参加学校的文体比赛
要求尽量抽象,封装好各个对象的职责
运行主类:
王同学在学校上课
余老师布置作业给宋同学
班主任要求学生参加学校文体比赛
知识点:
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; } }输出结果为:
王同学在学校上课
余老师布置作业给宋同学
班主任要求学生参加学校文体比赛
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树