面向对象--对象的转型
为什么需要强制转换类型?
引用变量只能调用它编译类型的方法,不能调用它运行类型的方法,所以就需要类型的强制转换。
1、一个父类的引用类型变量可以指向其子类的对象
2、一个父类的引用不可以访问其子类对象的新增加的成员(属性和方法)
3、可以使用引用变量instanceof(类名 来判断引用变量所指向的对象是否属于该类的或该类的子类)
4、子类的对象可以当做父类的对象使用--向上转型、 反之--向下转型
class Animal{
public String name;
Animal(String name){
this.name=name;
}
}
class Cat extends Animal{
public String eyesColor;
Cat(String n,String c){
super(n);
eyesColor=c;
}
}
class Dog extends Animal{
public String furColor;
Dog(String n,String c){
super(n);
furColor=c;
}
}
class Test{
public static void main(String[]args){
Animal a=new Animal("name");
Dog d=new Dog("wangwang","black");
a =new Dog("bigyellow","yellow");向下转型
System.out.println(a.furColor);//一个父类的引用不能访问其子类对象新增加的成员(属性和方法)
//可以使用引用变量 类名来判断引用变量是否指向该类或该类子类
System.out.println(a instanceof Animal);
System.out.println(a instanceof Dog);
if(a instanceof Cat){
Cat d1=(Cat)a;
}
}
}
final
修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。 修饰成员变量:
修饰局部变量: //final修饰局部变量的初始化 final int gg = 20; final int hh; hh=50;
final修饰的是引用变量时,只是引用值不能改变。对应的对象内部的属性仍然可变。 final Dog dog = new Dog(); // dog = new Dog(); //报错! dog.age = 77; //仍然可以修改dog指向对象的属性 常量的命名: 一般不用驼峰写法,而是全部大写加下划线分割。比如: final int DOG_AGE=18; |
public class Test { static final int a; //常量要进行初始化,如果采用系统默认值的话,就失去了存在的意义。 //因此必须显式初始化,可以直接赋值或初始化块中或构造函数中。 //但只能赋值一次! final int b; final int c; final int d=19; static { a=3; }
{ c=50; }
public Test() { // TODO Auto-generated constructor stub b=20; }
public static void main(String[] args) { //final修饰局部变量的初始化 final int gg = 20; final int hh; hh=50;
//final修饰引用变量时,只是引用值不能改变。对应的对象内部的属性仍然可变。 final Dog dog = new Dog(); // dog = new Dog(); //报错! dog.age = 77; //仍然可以修改dog指向对象的属性
} } |
修饰方法: 该方法不可被子类重写。但是可以被重载! 在上面Animal、Dog、Cat中,Animal中的shout方法中增加final。则Dog和Cat中shout方法不能存在了!
如果父类方法是private final,那么对子类完全不可见;子类也就可以定义自己的同名的方法。这个不是重写了,而是子类自己新定义的方法。 |
|
修饰类: 修饰的类不能有子类,不能被继承。比如:Math、String。 |