标签:布尔 过程 public ceo 组合 read main 常用 情况下
1.什么时候需要用到强制类型转换(引用数据类型)
当把子类对象赋给父类引用变量时,这个父类引用变量只能调用父类拥有的方法,
不能调用子类特有的方法,即使它实际引用的是子类对象。
如果需要让这个父类引用变量调用它子类的特有的方法,就必须把它强制转换成子类类型。
2.引用类型之间要强制转换成功需要有什么条件
把父类实例转换成子类类型,则这个对象必须实际上是子类实例才行,否则将在运行时引发ClassCastException。
3.让程序更健壮的写法:
在强制转换前使用instanceof运算符判断是否可以成功转换。
示例如下:
public class Base { public void say() { //定义一个公共的say方法 System.out.println("base的say方法");//输出 } }
public class Sub extends Base{ //子类中 把父类的方法重写 public void say() { System.out.println("sub的say方法"); } public void read() { System.out.println("sub的read方法,子类特有的方法,父类中没有的方法"); } }
public class Test { public static void main(String[] args) { Base base = new Sub(); base.say(); //我们业务需要base变量调用子类中的特有的方法read,这个时候需要我们对base进行强制类型转换 if(base instanceof Sub) { //为了程序的健壮性, //运算符是用来在运行时指出对象是否是特定类的一个实例 ((Sub)base).read();//强制类型转换 base转换为Sub, //转换后可以调用Sub里的read方法 } } }
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
public class Person { //定义一个Person类 }
public class XiaoMing extends Person{ }
public class Abc { }
public class Test { public static void main(String[] args) { Person person = new Person(); XiaoMing x = new XiaoMing(); System.out.println(x instanceof Person);// 父类编译可以 运行true System.out.println(x instanceof XiaoMing);//自身类编译可以 运行true System.out.println(person instanceof XiaoMing);//子类编译可以 运行false //System.out.println(x instanceof Abc);//无关系 编译报错 } }
继承
继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java的继承具有单继承的特点,每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。
优点:
缺点:
封装:通过公有化方法访问私有化属性,使得数据不容易被任意窜改,常用private修饰属性;
继承:通过子类继承父类从而获得父类的属性和方法,正常情况下,用protected修饰属性,专门用于给子类继承的,权限一般在本包下和子类里;
继承破坏了封装:是因为属性的访问修饰符被修改,使得属性在本包和子类里可以任意修改属性的数据,数据的安全性从而得不到保障。
如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的成员变量,因此破坏了封装性!
public class Fruit {
//成员变量
// private double weight;为了让子类继承,改为了:
protected double weight;
public void info(){
System.out.println("我是一个水果!重" + weight + "g!");
}
}
/**
* 继承--子类
*/
public class Apple extends Fruit {
public static void main(String[] args){
Apple a = new Apple();
a.weight = 10;
a.info();
}
}
当子类继承了父类,需要修改父类接口名称时,修改了接口名称,子类都会报错,如果是同一个人维护,可能还可以修改,如果由多个人修改,后果不敢想象呀!
组合
什么是组合? 组合在代码中如何体现呢?如下:
public class Animal {
public void breath(){
System.out.println("呼吸中...");
}
}
/**
* 组合
*/
public class Bird {
//将Animal作为Bird的成员变量
private Animal a;
public Bird(Animal a){
this.a = a;
}
public void breath(){
a.breath();
}
public void fly(){
System.out.println("我在飞..");
}
public static void main(String[] args){
Animal animal = new Animal();
Bird b = new Bird(animal);
b.breath();
b.fly();
}
}
优点
缺点
组合对比继承
如何选择?
标签:布尔 过程 public ceo 组合 read main 常用 情况下
原文地址:https://www.cnblogs.com/jikebin/p/12431638.html