面向对象_中
面向对象_2
一、继承性
好处:
- 减少了代码的冗余,提高了代码的复用性
- 便于功能的扩展
- 为之后多态性的使用,提供了前提
格式:
class A extends B{ }
A:子类、派生类、subclass
B:父类、超类、基类、superclass
- 体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有属性和方法
特别地:父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已。 - 子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展
Java中关于继承性的规定:
- 一个类可以被多个子类继承。
- Java中类的单继承性:一个类只能有一个父类。
- 子父类是相对的概念。
- 子类直接继承的父类称为:直接父类。间接继承的父类称为:间接父类。
- 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法。
二、方法的重写
重写
子类继承父类以后,可以对父类中同名同参数的方法进行覆盖
应用
重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的时子类重写父类的方法
面试题:区分方法的重载和重写
重写的规定
方法的声明:权限修饰符 返回值类型 方法名(形参列表)throws 异常的类型{
//方法体
}
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
-
子类重写的方法的方法名和形参列表与父类中被重写的方法的方法名和形参列表相同
-
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
>特殊情况:子类不能重写父类中被声明为private的方法 -
返回值类型:
>父类被重写的方法的返回值类型是void,则子类重写的方法的返回值只能是void >父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
>父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(也必须是double)
-
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
三、super的使用
-
super理解为:父类的
-
super可以用来调用:属性、方法、构造器
-
super的使用:调用属性和方法
3.1 我们可以在子类的方法或构造器中,通过使用“super.属性”或“super.方法”的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略super。
3.2 特殊情况:当子类和父类中定义了同名的属性时,我们想要在子类中调用父类中声明的属性,则必须显式的使用“super.属性”的方式,表明调用的时父类中声明的属性。
3.3 当子类重写了父类的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用“super.方法”的方式,表明调用的是父类中被重写的方法。 -
super的使用:调用构造器
4.1 我们可以在子类的构造器中显式的使用“super(形参列表)”的方法,调用父类中声明的指定构造器
4.2 “super(形参列表)”的使用,必须声明在子类构造器的首行!
4.3 我们在类的构造器中,针对于“this(形参列表)”或“super(形参列表)”只能二选一,不能同时出现
4.4 当我们在构造器的首行,没有显式的声明“this(形参列表)”或“super(形参列表)”,则默认调用的是父类中空参的构造器
4.5 在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”,调用父类的构造器
四、多态性
理解多态性
可以理解为一个事物的多种形态
何为多态性
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
对象的多态性只适用于方法,不适用于属性
多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,之恶能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边
多态性的使用前提
- 类的继承关系
- 方法的重写
五、instanceof 关键字的使用
a instanceof A:判断对象 a 是否是类 A 的实例。如果是,返回true;如果不是,返回false.
如果 a instanceof A 返回true,则a instanceof B也返回true,其中,类B是类A的父类。
六、包装类
包装类的使用
- Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
- 基本数据类型、包装类、String类之间的转换
//基本数据类型 ---> 包装类:调用包装类的构造器
@Test
public void test1(){
int num1 = 10;
Integer in1 = new Integer(num1);
System.out.println(in1.toString());
Integer in2 = new Integer("123");
System.out.println(in2.toString());
Float f1 = new Float(12.3f);
Float f2 = new Float("12.3");
System.out.println(f1);
System.out.println(f2);
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("true");
Boolean b3 = new Boolean("true123"); //false
System.out.println(b2);
System.out.println(b3);
Order order = new Order();
System.out.println(order.isMale); //false
System.out.println(order.isFemale); //null
}
//包装类 ---> 基本数据类型:调用包装类的xxxValue()
@Test
public void test2(){
Integer in1 = new Integer(12);
int i1 = in1.intValue();
System.out.println(i1 + 1);
Float f1 = new Float(12.3);
Float f2 = f1.floatValue();
System.out.println(f2);
}
//基本数据类型、包装类 ---> String类型:调用 String 重载的 valueOf(Xxx xxx)
@Test
public void test4(){
int num1 = 10;
//方式一:连接运算
String str1 = num1 + "";
//方式二:调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
//String类型 ---> 基本数据类型、包装类:调用包装类的parseXxx()
@Test
public void test5(){
String str1 = "123";
int num1 = Integer.parseInt(str1);
System.out.println(num1);
String str2 = "true1111111";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1); //false
}
-
自动装箱与自动拆箱
/* JDK 5.0 加入的新特性:自动装箱和自动拆箱 */ @Test public void test3(){ //自动装箱: int num2 = 10; Integer in1 = num2; //自动装箱 boolean b1 = true; Boolean b2 = b1; //自动装箱 //自动拆箱: int num3 = in1; //自动拆箱 }
面试题
下面两个题目输出结果相同吗?各是什么?
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);// 1.0
Object o2;
if (true)
o2 = new Integer(1);
else
o2 = new Double(2.0);
System.out.println(o2);// 1

浙公网安备 33010602011771号