是我.上次也回复过你的帖子.
我觉得这两个,怎么说呢,他们之间虽然有关系,但并不是一个并列的概念啊。extend是继承,upcasting是向上转型。
我还是拿我上次这个程序作解释吧!
class Circle extends Shape{
public void method(){
System.out.println("circle");
}
}
class Square extends Shape{
public void method(){
System.out.println("square");
}
}
class Triangle extends Shape{
public void method(){
System.out.println("triangle");
}
}
public class Shape{
public void method() {
System.out.println("Shape");
}
public static void main(String arg[]){
Shape c=new Circle();
Shape s=new Square();
Shape t=new Triangle(); c.method();
s.method();
t.method();
}
整个继承(extends)你总明白吧!
而upcast发生在main中的以下三句话
Shape c=new Circle();
Shape s=new Square();
Shape t=new Triangle();
很明显new出的是三个不同的实例,但是他们都可以向上转型(upcast)成Shape,这是因为他们都继承自Shape。
而java的优点就在于虽然c s t 这三个变量都是Shape类型,但是当调用method()方法是,并不是输出"Shape",而是java会自动判断他们的实际类型,并准确无误的调用到相应的method(),输出"Circle","Squre"或者"Triangle"。
不知道我这么说你是不是明白?有问题我们可以继续交流。
我觉得这两个,怎么说呢,他们之间虽然有关系,但并不是一个并列的概念啊。extend是继承,upcasting是向上转型。
我还是拿我上次这个程序作解释吧!
class Circle extends Shape{
public void method(){
System.out.println("circle");
}
}
class Square extends Shape{
public void method(){
System.out.println("square");
}
}
class Triangle extends Shape{
public void method(){
System.out.println("triangle");
}
}
public class Shape{
public void method() {
System.out.println("Shape");
}
public static void main(String arg[]){
Shape c=new Circle();
Shape s=new Square();
Shape t=new Triangle(); c.method();
s.method();
t.method();
}
整个继承(extends)你总明白吧!
而upcast发生在main中的以下三句话
Shape c=new Circle();
Shape s=new Square();
Shape t=new Triangle();
很明显new出的是三个不同的实例,但是他们都可以向上转型(upcast)成Shape,这是因为他们都继承自Shape。
而java的优点就在于虽然c s t 这三个变量都是Shape类型,但是当调用method()方法是,并不是输出"Shape",而是java会自动判断他们的实际类型,并准确无误的调用到相应的method(),输出"Circle","Squre"或者"Triangle"。
不知道我这么说你是不是明白?有问题我们可以继续交流。
这个是同步的关键字。用来解决JAVA中的线程同步的问题。extends
JAVA的关键字。 A extends B ,A,B都是类。upcast
不是JAVA关键字。指的是:使用基类 变量引用派生类对象。
shape s = new circle();
s.rotate();
为什么要upcast呢?一个是为了动态绑定。如果你有一个需要:
shape[] s ;
s[1] = new Circle();
s[2] = new rect();
假如现在你需要依次调用他们的一个方法,那么你可以s.rotate();
如果你不能够用upcast呢?你就不能够使用数组来保存他们的reference了。
还有可能你不明确自己需要使用的东西是什么,那么使用基类的指针(upcast)就非常方便了。这样会避免程序中的硬编码,它是程序灵活性的大敌,而且是完全可以通过良好的涉及屏蔽掉的。类似的东东你可以考虑到涉及模式和OO中的一般规律:
使用接口优先于类:就是尽量使程序能够不依赖于具体的实现。比较常见的模式就是Factory;
而extends呢,仅仅使声明了对象之间的关系,是继承的关系。
上面就会有
circle extends shape
rect extends shape
其语义就是:is a
circle 是一种shape
rect 是一种shape
你的这个东东呢,涉及到另外的一个题目:
inner class
inner class就像类中的一个变量一样。当然他也可以使用类内部的所有变量了。与此相关的还有就是关于类之间的可见性,java中的访问控制符的问题。
慢慢讲了。