Java类型处理

来源:百度知道 编辑:UC知道 时间:2024/07/02 20:27:53
public class Fish {
public int length = 0;
public String name = "我是鱼";
private int weight = 20;

public Fish() {

}

public Fish(int argL, String argN) {
this.length = argL;
this.name = argN;
}

public void eat() {
System.out.println("鱼吃草...");
}

public void sleep() {
System.out.println("鱼睡觉...");
}

private void swim() {
System.out.println("鱼游泳...私有方法");
}

public static void main(String[] args) {
Fish fh = new Shark(); //Shark为Fish的子类
Shark sk = new Shark();

fh.sleep();
fh.eat(); //子类重写了改方法
fh.swim(); //访问父类中的私有方法和属性????
System.out.println(fh.weight);

sk.sleep();
sk.eat();
}
}
结果:
鱼睡觉...
鲨鱼吃草...
鱼游泳...私有方法
20
鱼睡觉...
鲨鱼吃草...

Fish fh = new Shark();
“引用

首先是private,类的private方法和属性只能类自己,在类的家里使用,出了类的范围,也就是类的代码之外就不能使用,子类也不能使用,所以fh是一个Fish ,所以能swim(); 而sk是个Shark 就不行。

同样是new Shark(),为什么fh是个Fish,而sk是个Shark呢?因为fh声明成了
Fish:Fish fh = new Shark(); 而sk则声明成了Shark:Shark sk = new Shark();

Fish fh = new Shark(); 其实可以分解成下面两句代码:
Shark sk = new Shark();
Fish fh = (Fish)sk;
也就是将sk转换为其父类Fish,换个角度来看,就是用父类fh,指向子类sk。

第二,多态。多态是个很重要的概念。多态存在必须有两个条件,记住它,很重要的:①父类引用指向子类对象,②子类重写了父类的方法。

当一个父类的方法被子类重写时,对象是调用父类的方法还是调用子类的方法,是根据类的真实类型来定的:
Shark sk = new Shark(); //new的Shark,它的真实类型是Shark
Fish fh = new Shark(); //new的还是Shark,它的真实类型仍然是Shark
所以sk和fh的eat();都是Shark的eat();

最后,public void sleep();因为是public的,所以子类能用,而且因为没重写,所以都是Fish的sleep();

引用有引用的类型;
每一个对象或者引用都有一个属于自己的类型.
即通过(对象或引用).getClass().getName()来获取类型名,牵涉到JAVA反射机制.
这里引用类型为Fish.
对象有对象的类型指的是Shark.
fh是一个对象,该对象的类型是Shark,该对象的引用为Fish.
语句可写为
Fish fh = new Shark();
或者
Shark sk = new Shar