Java基础——面向对象编程二:继承与多态
面向对象的特性二:继承
形式:class A extends B
子类:A, 父类(或基类 superClass):B
Java中类的继承只支持单继承
方法的重写: 区别于方法的重载(在同一个类中)
1.前提:有子类继承父类
2.子类继承父类后,若父类的方法子类不适用,那么子类可以对父类的方法重写(override、overwrite)、覆盖、覆写。
3.重写的规则:1)要求子类的“返回值类型 方法名(参数列表)”与父类的方法一样
2)子类方法的修饰符不能小于父类方法的修饰符
3)若父类方法抛异常,那么子类方法抛的异常不能大于父类的
4)子父类的方法必须同为static或同为非static
关键字super:调用父类中指定的操作
1.当子类与父类有同名的属性时,可以通过“super.属性”显示父类中声明的属性
若想调用子类的同名属性“this.属性”
2.当子类重写父类的方法后,在子类中若想再显示调用父类被重写的方法,就需要使用“super.方法”
3.super修饰构造器:通过在子类中使用“super(形参列表)”来显示的调用父类中指定(由形参列表指定)的构造器
》在构造器内部,“super(形参列表)”必须要声明在首行
》在构造器内部,“super(形参列表)”或“this(形参列表)”只能出现一个
》在构造器内部,不显式调用“super(形参列表)”或“this(形参列表)”中任何一个,默认调用的是父类空参的构造器
注:在设计一个类时,尽量提供一个空参的构造器
this:
1.当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量时类成员
2.在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性
3.this可以作为一个类中,构造器相互调用的特殊格式
1.使用this()必须放在构造器的首行!
2.使用this调用本类中其他的构造器,保证至少有一个构造器是不用this的。
面向对象的特性三:多态性
1.方法的重载与重写
2.子类对象的多态性:父类的引用指向子类对象
Person p1 = new Man(); 父类:Person() 子类 Man();
虚拟方法调用:通过父类的引用指向子类对象的实体,在调用方法时,实际执行的是子类重写父类的方法
子类对象多态性使用的前提:1.要有类的继承。2.要有子类对父类方法的重写
3.程序运行分为编译状态和运行状态
对于多态性来说:编译时,“看左边”,将此引用变量理解为父类的类型
运行时,“看右边”,关注真正对象的实体:子类的对象。那么执行的方法是子类重写的。
4.子类对象的多态性:不适用于属性,Person p1 = new Man();中p1的属性调用仍然是父类中的。
instanceof:格式:对象a instanceof 类A(判断对象a是否是后面类A的一个实例)返回true/false
若a是A类的实例,那么a是A的父类的实例
对象类型转换:1.子类到父类的类型转换可以自动进行
2.从父类到子类的类型转换,必须通过造型(强制类型转换)实现
3.无继承关系的引用类型间的转换是非法的
4.在造型前,可以使用instanceof操作符测试一个对象的类型
if(p1 instanceof Man){ //p1是一个父类的对象,Man是一个子类
Man m = (Man)p1; //父类转换成子类
}
Object类:是所有Java类的根父类
如果在类的声明中,未使用extends关键字指明父类,默认父类为Object类
Object类中的方法:
1.equals();
1.只能处理引用类型变量
2.在Object类,发现equals()仍然比较的两个引用变量的地址是否相等
像String,包装类,Date类,File类这些重写了Object类的equals()方法,比较的是两个对象的实体内容是否完全相同
String中的"==" 与equals(); String型是引用数据类型 在内存中,创建String后,内容存在方法区的字符串常量池中。
String str1 = "AA";
String str2 = "AA";
String str3 = new String("AA");
str1 == str2 ; //true
str1.equals(str2); //true
str1 == str3; //false 比较的是地址
str1.equals(str3); //true 比较的是内容
手动生成一个equals()方法:
public boolean equals(Object obj){ if(this == obj){ return true;
} else if(obj instanceof MyDate){
MyDate m = (MyDate)obj;
return this.day == m.day && this.month == m.month && this.year == m.year;
} else {
return false;
} }
自动生成: Source->Generate hashCode() and equals() 来调用现成的方法。
2.toString()方法:
1.当我们打印一个对象的引用时,实际上默认调用的就是这个对象的toString()方法
2.当我们打印的对象所在的类没有重写object中的toString()方法时,那么调用的就是object中定义的toString()方法,返回此对象所在的类及对应的堆空间对象实体的首地址值。
3.若重写toString()方法后,调用的就是重写后的toString()方法。
一般toString()重写为:将对象的属性信息返回。可以手动实现,也可以自动调用Source->toString()
4.像String,Flies,Date和包装类等,已经实现了object类中toString()方法的重写
包装类
基本数据类型 包装类
boolean Boolean
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
注:String不是基本数据类型,引用数据类型 在内存中,创建String后,内容存在方法区的字符串常量池中。
掌握基本数据类型,包装类以及String之间的相互转化
1.基本数据类型 -->包装类
调用包装类的构造器
int i = 10;
Integer i1 = new Integer(i);
Integet i2 = new Integet(2);
Float f = new Float(12.5F);
Float f = new Float("12.5F");//String型的或者float型的都可以
Float f = new Float("12.5Fada");//错误,内容不是一个数值型的字符串
note:Boolean型的只有传入的是"true"或者true是,才是true,否则就是false,(true1也是false)
所有包装类的默认初始化的值都为null
boolean b; //默认为false
Boolean b; //默认为null
2.包装类 -->基本数据类型 调用包装类的xxxValue()方法转换回去
int i2 = i1.intValue();
float f2 = f.floatValue();
自动装箱、拆箱
自动装箱:
int i = 12;
Integer i1 = i;
Boolean b = false;
自动拆箱:
int i2 = i1;
3.基本数据类型和包装类 与 String类之间的转换
基本数据类型和包装类 --> String类 //调用String类的String.valueof(Xxx x) (重载的)方法
int i = 10;
法一:String str1 = i + "";
法二:String str2 = String.valueof(i); //调用String类的valueof() (重载的)方法
String类 --> 基本数据类型和包装类 调用包装类的XXX.parseXxx(String str) (重载的)方法
int i1 = Integer.parseInt(str1);
Ctrl+Shift+O 导包
Ctrl+Shift+T 查看源码