资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
千锋教学部,Object类 对象转型 抽象类和抽象方法 final关键字 接口的创建和使用,Object类是所有Java类的根父类(最高父类)任何一个java的类(class)都直接或者间接继承自Object类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person . 等价于: public class Person extends Object . ,在父类中定义一个构造方法,2个static,2个. 在子类中定义一个构造方法,2个static,2个. 在场景类中创建一个子类对象,观察结果,观察调用顺序.,对Java对象的类型转换称为造型 在造型前通常使用instanceof操作符测试一个对象的类型 从子类到父类的类型转换可以自动进行(多态) 从父类到子类的类型转换必须通过造型(强制类型转换)实现 子类的对象可以当做基类的对象来使用称作向上转型(多态),反之称为向下转型 无继承关系的引用类型间的转换是非法的,/Person及Student类可自行定义 public class Test public void method(Person e) System.out.println(e.getSchool(); / if(e instanceof Student) Student me = (Student)e; System.out.println(me.getSchool(); public static void main(String args) Test t = new Test(); Person m = new Student(); t.method(m); ,Object类中定义有public String toString()方法,其返回值是String类型,描述当前对象的有关信息。 /默认情况是打印的是 类名hashcode的十六进制表示 在进行String与其他类型数据的连接操作时(如:System.out.println(“info“+person)),将自动调用该对象类的toString()方法。 可以根据需要在用户自定义类型中重写toString()方法。,toString方法的列子:,Object类的方法 public int hashCode() 方法 返回该对象的哈希码值。 public Class getClass()方法 返回此 Object 的运行时类。,=操作符,相同的字符串常量相等 两个Integer,如果其中至少一个是new出来的,则不等; 如果都是同一个常量赋值的, 则相等(-128127). 基本数据类型和封装类会拆箱比较数值 两个不同封装类的对象不能比较, 编译报错. 两个不同的基本数据类型,如果可以自动转换,则可以比较. 有继承关系的引用数据类型对象之间可以比较,当指向同一个对象时相等. 没有继承关系的引用数据类型不能比较.,equals方法,在Object类中定义的equals方法: public boolean equals(Object obj) 注意:形参是Object类型! equals()方法的调用者必须是引用数据类型 调用equals(.)方法时的实参可以是基本数据类型,java会自动进行装箱.,=操作符与equals方法,在比较引用数据类型时, =操作符与equals()作用完全一样-看引用的是不是同一对象 除非在自定义的类中重写了equals方法,或是下面的四类已经重写了equals方法的特例: java.io.File; java.lang.String; /先讲,再讲自定义类重写. java.util.Date 封装类 这四类当用equals()方法进行比较时,只比较类型及内容而不看引用的是不是同一对象.,=操作符与equals方法举例,class TestEquals /请自行定义能满足需要的MyDate类 public static void main(String args) MyDate m1 = new MyDate(24, 3, 2001); MyDate m2 = new MyDate(24, 3, 2001); if ( m1 = m2 ) System.out.println(“m1=m2“); else System.out.println(“m1!=m2“); if ( m1.equals(m2) ) System.out.println(“m1 is equal to m2“); else System.out.println(“m1 is not equal to m2“); m2 = m1; if ( m1 = m2 ) System.out.println(“m1=m2“); else System.out.println(“m1!=m2“); ,应用场景: 在定义一个类时,有些方法暂时还不知道该怎么实现,只能等子类把这些方法都实现后才能使用. 这样的方法应该定义为抽象abstract方法. 含有抽象方法的类必须定义为抽象abstract类.,用abstract来修饰类或方法 修饰符 abstract class 类名 修饰符 abstract 返回值类型 方法名(形参列表); 抽象类不能被实例化,抽象方法必须被全部重写后,其子类才可以声明为非抽象的,才能生成它的子类对象。 如果一个子类没有实现抽象基类中所有的抽象方法,则子类也要声明为一个抽象类。 抽象类不一定包含抽象方法-不想让人直接实例化 可以声明抽象类类型的引用,把它作为方法形参,返回值类型等,在类中没有实现的方法就是抽象方法,抽象方法没有方法体(不同于方法体为空)。 思考:构造方法,静态方法,public方法,protected方法,default方法,private方法,final方法能不能被声明为抽象的方法。 思考:属性能否用abstract来修饰?,思考: 抽象类中可以有普通方法吗? 抽象类中可以有构造方法吗? 抽象类中可以有static方法吗? 抽象类中可以有static属性吗? 抽象类中可以有实例属性吗?,关键字final,在Java中声明类、属性和方法时,可使用final修饰符来修饰。 final标记的类不能被继承。 final标记的方法不能被子类重写。 final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,且在使用前必须被赋值。 final标记的方法的形参不能被重新赋值. final标记的成员变量必须在声明的同时或在每个构造方法(或构造语句块)中显式赋值(不会被默认初始化),然后才能使用。 构造方法不能用final来修饰,因为构造方法不能被继承,更无所谓重写,用final修饰没有意义,编译会报错.,关键字final应用举例,public final class Test public static int totalNumber= 5 ; public final int id; public Test() id = +totalNumber; public static void main(String args) Test t = new Test(); System.out.println(t.id); final int i = 10; final int j; j = 20; j = 30; /非法 ,练习: 对比 static/final关键字,参考前面章节,复习static修饰符的用法; 练习前页例子及下述程序,并改正其错误,体会final关键字修饰变量时的用法; public class TestFinal public static void main(String args) int i = 1; final int j = 10; j = 100; final int k ; k = 100; k = 200; System.out.println(“i=“ + i + “ j=“ + j + “ k=“ + k); ,接口(interface)是抽象方法和常量值组成的一个数据结构。 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现jdk8之前 jdk8之后,接口中可以定义default方法(一种实例方法),static方法 接口定义举例 public interface Runner int id = 1; void start(); public void run(); abstract void stop(); ,接 口(1),接 口(2),多个类可以实现同一个接口 一个类可以实现多个接口 与继承关系类似,接口与实现类之间存在多态性 定义java类的完整语法格式: class extends implements ,* * ,接口应用举例(1),public interface Runner void start(); public void run(); public void stop(); ,接口应用举例(1),public class Person implements Runner public void start() /弯腰、蹬腿、咬牙、瞪眼、 开跑 public void run() / 摆动手臂、 维持直线方向 public void stop() / 减速直至停止、瘫倒、吐血、送医院 ,接口应用举例(2),接口应用举例 (3),interface Runner public void run(); interface Swimmer public double swim(); abstract class Animal public abstract int eat(); / class Person extends Animal implements Runner,Swimmer public void run() public double swim() public int eat() public class Test public static void main(String args) Test t = new Test(); Person p = new Person(); t.m1(p); t.m2(p); t.m3(p); public void m1(Runner f) f.run(); public void m2(Swimmer s) s.swim(); public void m3(Animal a) a.eat(); ,Ex2,实现前页各类中的方法细节,并根据自己的疑问改编和扩充有关类和接口的定义,体会接口的功能和用法 例如可扩充为: public void m1() System.out.println(“in method m1“ ); ,接口特性,接口可以多重实现(一个类可以实现多个接口); 接口中声明的属性默认为public static final的;也必须是public static final的;可以写public的或者不写,不能写private的或者protected的; 接口中只能定义抽象方法,而且这些方法默认为public abstract的、也必须是public abstract的,可以缺省,但不能用其它修饰符; 接口可以继承若干个其它的接口,并添加新的属性和抽象方法 接口里可以没有任何属性,方法. 用实现接口的方式,你可以用接口中的方法指定一个类(接口的实现类) “必须做什么”,而不是规定它“如何去做”.,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号