『壹』 在java中,〈extends A 〉与〈T extends A〉有什么区别

经常发现有List< super T>、Set<extends T>的声明,是什么意思呢?< super T>表示包括T在内的任何T的父类,< extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。
extends
List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in this context) List< extends Number> foo3 = new ArrayList< extends Number>(); // Integer extends Number List< extends Number> foo3 = new ArrayList< extends Integer>(); // Double extends Number List< extends Number> foo3 = new ArrayList< extends Double>();

读取操作通过以上给定的赋值语句,你一定能从foo3列表中读取到的元素的类型是什么呢?你可以读取到Number,因为以上的列表要么包含 Number元素,要么包含Number的类元素。你不能保证读取到Integer,因为foo3可能指向的是List<Double>。你 不能保证读取到Double,因为foo3可能指向的是List<Integer>。
写入操作过以上给定的赋值语句,你能把一个什么类型的元素合法地插入到foo3中呢?你不能插入一个Integer元素,因为foo3可能指向 List<Double>。你不能插入一个Double元素,因为foo3可能指向List<Integer>。你不能插入一个 Number元素,因为foo3可能指向List<Integer>。你不能往List< extends T>中插入任何类型的对象,因为你不能保证列表实际指向的类型是什么,你并不能保证列表中实际存储什么类型的对象。唯一可以保证的是,你可以从中读 取到T或者T的子类。
super
现在考虑一下List< super T>。

List< super Integer> foo3的通配符声明,意味着以下赋值是合法的: // Integer is a "superclass" of Integer (in this context) List< super Integer> foo3 = new ArrayList<Integer>(); // Number is a superclass of Integer List< super Integer> foo3 = new ArrayList<Number>(); // Object is a superclass of Integer List< super Integer> foo3 = new ArrayList<Object>();

读取操作通过以上给定的赋值语句,你一定能从foo3列表中读取到的元素的类型是什么呢?你不能保证读取到Integer,因为foo3可能指向 List<Number>或者List<Object>。你不能保证读取到Number,因为foo3可能指向 List<Object>。唯一可以保证的是,你可以读取到Object或者Object子类的对象(你并不知道具体的子类是什么)。
写入操作通过以上给定的赋值语句,你能把一个什么类型的元素合法地插入到foo3中呢?你可以插入Integer对象,因为上述声明的列表都支持 Integer。你可以插入Integer的子类的对象,因为Integer的子类同时也是Integer,原因同上。你不能插入Double对象,因为 foo3可能指向ArrayList<Integer>。你不能插入Number对象,因为foo3可能指向 ArrayList<Integer>。你不能插入Object对象,因为foo3可能指向 ArrayList<Integer>。
PECS
请记住PECS原则:生产者(Procer)使用extends,消费者(Consumer)使用super。
生产者使用extends
如果你需要一个列表提供T类型的元素(即你想从列表中读取T类型的元素),你需要把这个列表声明成< extends T>,比如List< extends Integer>,因此你不能往该列表中添加任何元素。
消费者使用super
如果需要一个列表使用T类型的元素(即你想把T类型的元素加入到列表中),你需要把这个列表声明成< super T>,比如List< super Integer>,因此你不能保证从中读取到的元素的类型。
即是生产者,也是消费者
如果一个列表即要生产,又要消费,你不能使用泛型通配符声明列表,比如List<Integer>。
例子
请参考java.util.Collections里的方法(JDK1.7):

我们可以从Java开发团队的代码中获得到一些启发,方法中使用到了PECS原则,实现了对参数的保护。

『贰』 java语言extends用法是什么

在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中不允许多继承。
举例:

class Animal{
void eat(){
System.out.println("Animal eat");
}
void sleep(){
System.out.println("Animal sleep");
}
void breathe(){
System.out.println("Animal breathe");
}
}

class Fish extends Animal{
void breathe(){
System.out.println("Fish breathe");
}
}

public class TestNew {
public static void main(String[] args) {
Animal an = new Animal();
Fish fn = new Fish();
an.breathe();
fn.breathe();

}
}
执行结果:
Animal breathe
Fish breathe

『叁』 哪位高手详细讲解一下JAVA中extends的用法啊

关键字extends
表示“继承”的意思
能扩展父类所有的成员
继承的用法!!该类用于创建父类
继承了父类的所有的属性和方法除pravite
拜托
本人不是高手
敌手中的
高手
哈哈

『肆』 Java中,class B extends A.

class B extends A
继承过后通常会定义一些父类没有的成员或者方法。
A a = new B();
这样是可以的,上传。
a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。
==========================================================
假如这样定义:
class A{
int i;
void f(){}
}
class B extends A{
int j;
void f(){}//重写
void g(){}
}
然后:
B b = new B();
b就是子类对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如b.i,b.j,b.f(),b.g()都是合法的。此时b.f()是访问的B中的f()
A a = new B();
a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而a.j,a.g()非法。此时访问a.f()是访问A中的f()

==========================================================
caiqiupeng的问题,楼主也可以参考一下。
A a = new B(); 这条语句,实际上有三个过程:
(1) A a;
将a声明为父类对象,只是一个引用,未分配空间
(2) B temp = new B();
通过B类的构造函数建立了一个B类对象的实例,也就是初始化
(3) a = (A)temp;
将子类对象temp转换未父类对象并赋给a,这就是上传(upcast),是安全的。
经过以上3个过程,a就彻底成为了一个A类的实例。

子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的。
===========================================================
纠正一下自己的错误:
upcast过后,a.f()对应的应该是B类的方法f()
调用构造函数建立实例过后,对应方法的入口已经确定了。
如此以来,a虽被上传为A类,但其中重写的方法f()仍然是B的方法f()。也就是说,每个对象知道自己应该调用哪个方法。
A a1 = new B();
A a2 = new C();
a1,a2两个虽然都是A类对象,但各自的f()不同。这正是1楼说的多态性的体现。

这类问题在《Java编程思想》上都讲的很清楚,偶很久没看,糊涂了,不好意思。

『伍』 java语言extends用法

在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中不允许多继承。
举例:
class
Animal{
void
eat(){
System.out.println("Animal
eat");
}
void
sleep(){
System.out.println("Animal
sleep");
}
void
breathe(){
System.out.println("Animal
breathe");
}
}
class
Fish
extends
Animal{
void
breathe(){
System.out.println("Fish
breathe");
}
}
public
class
TestNew
{
public
static
void
main(String[]
args)
{
Animal
an
=
new
Animal();
Fish
fn
=
new
Fish();
an.breathe();
fn.breathe();
}
}
执行结果:
Animal
breathe
Fish
breathe

『陆』 JAVA中什么是继承

继承在本职上是特殊一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的 一些属性或方法。

1.Java继承的语法格式:

Java继承的关键字是:extends

public class 子类名 extends 父类名{...}

如: public class UNStudent extends Student {...} 注:1.子类又称超类,拓展类 ;父类又称基类。

2.Java中类的继承只能是单继承(单根继承),即一个类只能继承一个父类,但是一个类可以由多个类来继承它。

3.Java会给每一个没有设置父类的类,自动添加一个父类就是Object 。

(6)javaextends扩展阅读:

一、子类继承父类的结果

1.子类继承父类后,继承到了父类所有的属性和方法。注:是所有。

2.子类可调用的方法也要看情况而定:

子类和父类在同一个包下时 “子类和子类的对象”可以调用父类的默认的,受保护的,公有的属性以及方法。

子类和父类在不同的包下时,在子类中可以调用受保护的,公有的属性以及方法,而子类的对象可以调用受保护的,公有的属性以及方法。

二、方法的重写

1.当子类和父类都有某种方法,而子类的方法更加要求细致,或者实现功能不同,就需要方法的重写。

2.重写条件

①必须要存在继承关系;只有继承之间的关系才能有方法的重写

②方法的返回值类型,方法名,参数个数,参数类型,参数顺序,必须要完全一致;

如:父类中方法 public void play (int n ; String s){方法体1...}

重写后的子类方法public void play(int n ; String s){方法体2...}

3.子类重写方法时的访问修饰符可以大于或者等于父类方法的访问修饰符。

4.重写后的方法会被优先调用。

三、自动转型

自动转型的实现要求有继承关系

格式如下:父类名 对象名 = new 子类构造方法;

如:Student stu = new UNStudent;

而强制转型格式如下:子类名 对象名 = (子类名)父类对象名

如:UNStudent un = (Student)stu;

自动转型可以拓宽方法的作用访问域

在使用自动转型后,子类自己定义的方法是不能在自动转型后执行;

原因是因为Java的编译机制,它会优先判断父类中是否存在该方法,如果存在则通过编译,如果不存在则报错。

第二种自动转型:转型后只需要不同类的不同对象调用想吐的方法,很方便!

/**访问修饰符 返回值数据类型 方法名(父类类型 参数名,...){

调用方法。

}

父类名 对象名 = new 子类名;

子类名 对象名 = new 子类名;

方法名(对象名);

*/

比如拿到驾驶证为A2的人,可以驾驶重型货车,当然也可以驾驶大型货车,中型货车,小型货车,小客车,小轿车,摩托车... 可以选择第二种自动转型的方法,便于调用同一个方法。

自动转型好处:1.减少冗余代码;2.在方法设置参数时,扩大访问范围。

四、多态

多态是由方法重载,继承,方法重写,自动转型等技术的组合。

五、为什么需要继承?

1.提高代码的重用性。

2.提高程序的扩展性。

JAVA继承总结

『柒』 java中extends 是什么意思 怎么点鼠标点出来

Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以分隔符先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
JAVA不支持多重继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。
编辑本段Java继承的特征(1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
(5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。

『捌』 java里extends代表什么

extends是继承的意思,代表子类继承父类.比如你是你父亲的儿子,你长得像你父亲那么就是你继承了你父亲的基因.

『玖』 java中 extends与impletements 区别

extends是继承
impletements是接口
java一个类最多只能继承一个,但是可以有多个接口,接口里的所有方法都要重写

『拾』 java中extends和implements的区别,怎么用

一个是继承,一个是实现接口,继承这个可以理解为继承父类的版方法,父类中的方法可以在权子类中用到,super(),实现接口就是在接口中定义了方法,这个方法要你自己去实现,接口可以看作一个标准,比如定义了一个动物的接口,它里面有吃(eat())这个方法,你就可以实现这个方法implements,这个方法是自己写,可以是吃苹果,吃梨子,香蕉,或者其他的。IMPLEMENTS就是具体实现这个接口。