本章内容:
1. Object类的toString()与equals(Object obj)方法
2. 面向对象的多态性
3. 抽象类与接口
重点:个人感觉本章都很重要
一.Object类的toString()与equals(Object obj)
1.简述Object类:
* Object类是所有Java类的根基类(“祖先类”)
* 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
2.toString()方法(返回String)
* Object类中定义有public StringtoString()方法,其返回值是String类型,描述当前对象的有关信息。
* 如果直接打印某对象的引用则打印出来的结果相当于调用了这个对象中的toString(),引用会显示指向地址。
* 可以根据需要重写toString()方法,若不重写则调用的是父类。
例:package object;
public class ToStringDemo {
public static void main(String[] args) {
Student stu=new Student("张三",20,83.5);
System.out.println(stu);
}
}
结果截图:
3.equals()方法
* Object类中定义有publicboolean equals(Objectobj)方法,提供定义对象是否“相等”的逻辑。
* Object的equals方法定义为:x.equals(y); //当x和y指向同一个地址时返回true,否则返回false。
* String类中已经重写了equals(Object obj)方法,重写后的方法比较的是两个字符串的”内容”是否一样(注意:==比较对象的引用)。
字符串.equals()已经被重写。
如,“abc”.equals("abc"); //重写后比较当前对象和传入参数对象是否相等。相等为true,否则为false。
* 可以根据需要在用户自定义类型中重写equals方法。
例:package object;
public class EqualsDemo {
public static void main(String[] args) {
Student stu1=new Student("张三",20,83.5);
Student stu2=new Student("张三",20,83.5);
System.out.println("stu1与stu2相等吗?"+stu1.equals(stu2));
}
}
二.多态性:一个行为的多种表现方式;
1.**从方法角度看:重载和重写就用到了多态。
重载(overloading):根据传入的参数不同,完成的功能也不同
**从对象的角度看:向上转型,向下转型(把右边转为左边的)
向上转型(将子类转换为父类),可自动转换。(为了确认关系)
*格式:
父类父类对象=子类实例
向上转型后,因为操作的是父类对象,所以无法找到在子类中定义的新方法;但如果子类重写了父类的某个方法,则调用的是重写后的方法。
向下转型(必须明确指出要转型的子类的类型)前先要向上转型,还可以在方法中传参时向上转型。
*格式:
2.instanceof关键字
使用这个关键字来判断,如果一个对象属于一个类的实例,则true,否则false。
*(一般判断传递的参数是否属于自己写的那个类时可以用来将其他不符合的对象排除在外)
*格式:
3.final关键字
*表示最终的。
*** 若是final修饰的类即父类,别人不能继承(String类即被final修饰,别人不能继承他);
格式:
final class finalClassName{
…
}
*** 若修饰属性,则成为常量,该属性在声明时就应该被初始化,且后面无法修改,属于只读;
格式:
final 类型 variableName;
*注意:(可以用来修饰局部变量和成员变量) 修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。
*** 修饰方法则该方法子类无法重写。
格式:
final 返回值类型 methodName(paramList)
{
…
}
三.抽象类与接口
1.抽象类
用abstract修饰的类一定是抽象类。
抽象类不能被实例化,必须被继承,抽象方法必须被重写,生成它的子类,他的子类可以被实例化。
如果一个子类没有实现抽象父类中的所有抽象方法或者只实现了一部分,则子类也称为一个抽象类,如父亲欠债子还,若儿子只还了一部分后也欠债或还不了债则他与父亲
是同类。
普通方法必须有方法块,但是抽象方法可以没有。抽象类不一定有抽象方法但有抽象方法的一定是个抽象类,抽象方法的子类必须重写。
final类不可被继承而abstract类必须被继承故两者不相容。
普通方法不强制重写,用abtract父类强制重写,但是如子类也是抽象类则可以不用重写。子类不是抽象类则必须重写。抽象父类的抽象方法必须要有人还账,由非抽象类还
抽象类也可以还但不强制,总之必须要有子类还清。
所有的类都可以有构造方法但是并不是所有的构造方法都可以被实例化,abstract就不可被实例化。
注意:
抽象类不一定要包含抽象方法,若类中包含了抽象方法,则该类必须被定义为抽象类
构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。
2.接口(一种特殊的抽象类)
接口是抽象方法和常量值的定义的集合。
这种抽象类中只能包含常量和方法的定义,而没有变量和方法的实现。
接口描述不同对象行为。
接口是一个标准也是一个契约。
接口的好处:
(1)通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系.
(2)通过接口指明多个类需要实现的方法
(3)通过接口了解对象的交互界面,而无需了解对象所对应的类
接口的声明语法:
[public] interface接口名称[extendslistOfSuperInterface]{ … }
接口体包括常量定义和方法定义
常量定义: typeNAME=value;
该常量被实现该接口的多个类共享;
具有public ,final, static的属性.即声明一个接口后若不在常量前加public static final则也默认为此。
常量一般是大写。
接口的实现类:
与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口
一个类可以实现多个接口,在implements子句中用逗号分开
非抽象子类必须实现接口中定义的所有方法
实现格式:
class子类 implements接口A,接口B…{
注意:
类和类之间继承是单继承
接口和类之间使用实现(implements),可以多实现。
接口的方法全为抽象方法,抽象类里可以有抽象方法也可以没有。
接口和抽象类都不可被实例化。
父接口和子接口之间是继承,但是可以继承很多个父接口。
类既继承一个父类又要实现一个接口也可以,此时继承和实现都要写。