黑马程序员技术交流社区

标题: jdk中哪些类是不能继承的? [打印本页]

作者: 王德云    时间: 2011-12-5 15:55
标题: jdk中哪些类是不能继承的?
本帖最后由 王德云 于 2011-12-5 20:55 编辑

不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在jdk中System,String,StringBuffer等都是基本类型。来自张老师回答!
为什么我继承非fianl修饰的类,也会编译错误呢?
例如:



作者: t_mac    时间: 2011-12-5 16:19
查了一下API 该方法没有构造函数,子类无法继承,而且这个类没有继承的必要,它所有的方法都是static的,你要用直接用类名调就是了
作者: 周敏2011nc    时间: 2011-12-5 16:27
因为Arrays这个类的默认构造方法是私有的
private Arrays() {
}
同时,这类的所有方法都是静态的,它是一个工具类,方便我们对一些数组和集合进行操作。
作者: 周敏2011nc    时间: 2011-12-5 16:27
因为Arrays这个类的默认构造方法是私有的
private Arrays() {
}
同时,这类的所有方法都是静态的,它是一个工具类,方便我们对一些数组和集合进行操作。
作者: 刘基军    时间: 2011-12-5 16:28
t_mac 发表于 2011-12-5 16:19
查了一下API 该方法没有构造函数,子类无法继承,而且这个类没有继承的必要,它所有的方法都是static的,你 ...

我也想知道,“Arrays类为什么不使用final关键字修饰,而采取不定义构造函数的做法?”
作者: t_mac    时间: 2011-12-5 17:25
monghuan 发表于 2011-12-5 16:28
我也想知道,“Arrays类为什么不使用final关键字修饰,而采取不定义构造函数的做法?” ...

因为Arrays 定义了一个数组, final修饰后只能初始化的时候赋值,其他时间是不能改变的,你要知道你定义的数组是用来增删改查的,你给它弄个final就没有多大意义了
作者: 王德云    时间: 2011-12-5 17:28
本帖最后由 王德云 于 2011-12-5 17:29 编辑
t_mac 发表于 2011-12-5 16:19
查了一下API 该方法没有构造函数,子类无法继承,而且这个类没有继承的必要,它所有的方法都是static的,你 ...


谢谢解答!
那意思是说,没有构造函数就不能继承吗。
我只是拿这个来举例,java.util包中差不多都不能继承.
我的意思,是Java类中到底哪些类是不能被继承?
作者: t_mac    时间: 2011-12-5 17:55
王德云 发表于 2011-12-5 17:28
谢谢解答!
那意思是说,没有构造函数就不能继承吗。
我只是拿这个来举例,java.util包中差不多都不能继承 ...

不好意思,刚才藤椅上那同学说对了,它不是没有构造方法,而是它是私有的
private Arrays() {
}
没有构造方法的类也可以被继承

作者: t_mac    时间: 2011-12-5 18:00
monghuan 发表于 2011-12-5 16:28
我也想知道,“Arrays类为什么不使用final关键字修饰,而采取不定义构造函数的做法?” ...

不好意思,刚才说错了,Arrays类有自己的构造方法private Arrays() {
}   因为是私有,所以不能被继承
而没有构造方法的类依然是可以被继承的
作者: 杨银川    时间: 2011-12-5 18:35
你可以先查一下API文档,第一,Array没有构造方法,第二,此类用final修饰,所以不能继承。
至于java中的不能被继承的类,没必要都知道,也不好记,先知道常用的,至于其他的碰见了就把它搞定。
还有,一般而言,一个类不能被继承,八成就被final修饰了。
作者: 段波    时间: 2011-12-5 18:36
public class Arrays {
    // Suppresses default constructor, ensuring non-instantiability.
    private Arrays() {
    }
在源码中可以看到Arrays 构造方法是私有的,对外是不可见的,无法被继承。当一个类被final修饰或构造方法私有则无法被继承。
作者: fly51888    时间: 2011-12-5 20:39
不能被继承的类有两类,一类是含final修饰符的。还有一种是父类中含有private权限的构造函数。
如下代码就不能被继承。
public class App extends Person{

        public static void main(String[] args) {
       
        }
}

class Person{
        private  Person(){
               
        }
}

因为私有构造函数是不可见的,所以既不能被继承,也不能直接实例化。
查看Arrays源代码就可以看到含有一个私有构造函数,所以Arrays不能被继承。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2