黑马程序员技术交流社区

标题: 抽象类 [打印本页]

作者: 引子    时间: 2014-7-6 10:46
标题: 抽象类
抽象类不可以被实例化  那么抽象类中有构造函数吗??  如果有是什么形式的?  还是构造函数也被abstrcat修饰
作者: 胥亮    时间: 2014-7-6 11:00
有构造函数,有构造函数不代表可以被实例化。
作者: 吴俊勇    时间: 2014-7-6 13:13
胥亮 发表于 2014-7-6 11:00
有构造函数,有构造函数不代表可以被实例化。

不过构造函数应该都是静态的是不
作者: 胥亮    时间: 2014-7-6 13:35
本帖最后由 胥亮 于 2014-7-6 13:37 编辑
吴俊勇 发表于 2014-7-6 13:13
不过构造函数应该都是静态的是不

static不能修饰构造函数
作者: 胥亮    时间: 2014-7-6 13:40
Unlike methods, a constructor cannot be abstract, static, final, native  or synchronized.

1. A constructor is not inherited, so there is no need to declare it final

2. As the same reason above, an abstract constructor could never be implemented.

3. A constructor is always invoked with respect to an object, so it makes no sense for a constructor to be static.

4. There is no practical need for a constructor to be synchronized, because it would lock the object under construction, which is normally not made available to other threads until all constructors for the object have completed their work.

5. The lack of native constructors is an arbitrary language design choice that makes it easy for an implementation of the Java virtual machine to verify that superclass constructors are always properly invoked during object creation.

翻译如下:
不同于方法,构造器不能是abstract, static, final, native, strictfp, 或者synchronized的.
1.构造器不是通过继承得到的,所以没有必要把它声明为final的。
2.同理,一个抽象的构造器将永远不会被实现。(所以也不能声明为abstract的)
3.构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。
4.没有实际的需要把构造器定义成同步的,因为它将会在构造的时候锁住该对象,直到所有的构造器完成它们的工作,这个构造的过程对其它线程来说,通常是不可访问的。
5.没有本地的构造器是任意一种语言的设计选择,这样会使得在创建对象的过程中JVM实现很容易去校验父类的构造器是否总是被正确地调用了。



作者: relive    时间: 2014-7-6 15:25
本帖最后由 relive 于 2014-7-6 15:27 编辑

1. 接口定义一种规范,实现我必须遵守我的规范;2. 抽象类抽象级别没有接口那么高,除了定义规范(abstract方法),还向继承我的子类提供公共(大家都存在)的方法;
3. 类就到了具体的实现


作者: 引子    时间: 2014-7-6 16:10
胥亮 发表于 2014-7-6 13:40
Unlike methods, a constructor cannot be abstract, static, final, native  or synchronized.

1. A con ...

明白了  谢谢啦
作者: sugar    时间: 2014-7-6 16:17
当多个类中出现了相同的功能,但功能主体不同,这时可以向上抽取,只抽取功能的定义,不抽取功能的主体;
抽象方法一定定义在抽象类中;
抽象方法和抽象类都必须被abstract关键字修饰;
抽象类不可以用new创建对象,因为调用抽象方法没有意义;
抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用;
如果子类只复写了部分抽象方法,那么该子类还是抽象类;
抽象类和一般类没有太大的不同,只是抽象类比一般类多了抽象方法,抽象类不可以实例化。

//员工类,是一个抽象类
abstract class Emp
{
        //成员变量
        private String name;
        private String num;
        private double sal;
        //构造函数
        public Emp(String name,String num,double sal)
        {
                this.name=name;
                this.num=num;
                this.sal=sal;
        }
        //抽象方法
        public abstract void work();
}
//普通员工继承员工类
class BaseEmp extends Emp
{
        //普通员工类的构造函数
        public BaseEmp(String name,String num,double sal)
        {
                super(name,num,sal);
        }
        //普通员工类复写父类的抽象方法
        public void work()
        {
                System.out.println("BaseEmp work..");
        }
}
//经理类继承了员工类
class Manager extends Emp
{
        //经理比员工类多了一个成员变量
        private double bonus;
        //经理类的构造函数
        public Manager(String name,String num,double sal,double bonus)
        {
                super(name,num,sal);
                this.bonus=bonus;
        }
        //经理类复写父类的抽象方法
        public void work()
        {
                System.out.println("Manager work..");
        }
}
class ExampleAbstractClass
{
        public static void main(String[] args)
        {
                BaseEmp be=new BaseEmp("zhangsan","11111",90);
                be.work();
                Manager ma=new Manager("lisi","2222",90,300);
                ma.work();
        }
}

作者: 生活要TM有激情    时间: 2014-7-6 16:28
抽象类不能被实例化是因为对象是一个实体,但是抽象类是不能确定是否能够描述一个实体对象的具体功能的,因为抽象类里面可能有抽象方法也可能没有抽象方法,所以抽象类不能被实例化。而构造器是一个类产生对象的根本,没有构造器就不能产生对象,所以Java类里面如果没有构造器,系统会自动给类加上构造器,产生构造器。但是不能被实例化不是说类里面就没有构造器的,每个类都有构造器的。而你说的构造器的形式其实就是:方法名字(){}  ,其中方法名和类名相同,其权限和类的权限一样。而你说是否被abstract修饰,那就更不可能了,因为构造函数能被权限修饰符所修饰,不能被特征修饰符所修饰。上面说的abstract和static等等都属于特征修饰符。
作者: jianpan    时间: 2014-7-6 16:49
生活要TM有激情 发表于 2014-7-6 16:28
抽象类不能被实例化是因为对象是一个实体,但是抽象类是不能确定是否能够描述一个实体对象的具体功能的,因 ...

回答的好
作者: lc2015    时间: 2014-7-7 00:18
抽象类不可以被实例化,抽象类一定要被继承需要子类覆盖所有的抽象方法子类才可以被实例化。
作者: troy健    时间: 2014-7-7 08:31
1. 抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,如果抽象类需要构造函数,那么应该声明为“protected”。
2. 既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:
(1)初始化抽象类的成员;
(2)为继承自它的子类使用。

3、即使我们声明一个没有构造函数的抽象类,编译器还会为我们生成一个默认的保护级别的构造函数。子类实例化时(不管是否为带参构造)只会调用所有父类的无参构造函数,而带参构造必须通过显式去调用.调用顺序是先调用抽象类的无参构造函数,如果子类实例化时是使用带餐的构造函数,则再接着调用抽象类的带参构造函数,最后调用子类本身的构造函数。
作者: ╭月牙湾湾╮    时间: 2014-7-8 01:12
学习了   
作者: 刘亚东    时间: 2014-7-8 01:22
进来学习一下。
作者: cyc52tjm    时间: 2014-7-11 16:46
学习中。。。




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