面向对象--对象的转型

为什么需要强制转换类型?

引用变量只能调用它编译类型的方法,不能调用它运行类型的方法,所以就需要类型的强制转换。

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指向对象的属性

 

}

}

修饰方法:

该方法不可被子类重写。但是可以被重载!

在上面AnimalDogCat中,Animal中的shout方法中增加final。则DogCatshout方法不能存在了!

 

 

如果父类方法是private final,那么对子类完全不可见;子类也就可以定义自己的同名的方法。这个不是重写了,而是子类自己新定义的方法。

 

 

 

修饰类:

修饰的类不能有子类,不能被继承。比如:MathString

 
posted @ 2017-04-23 19:47  代鱼  阅读(200)  评论(0编辑  收藏  举报