A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Saner 中级黑马   /  2014-3-28 12:48  /  1385 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频中老师提到:抽象类不可以用new创建对象,因为调用抽象方法没有意义
例如:
abstract class Student
          {
                  abstract void Study();
          }
那我想问抽象类在什么情况下用,它的功用是什么?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
抽象类:当一个类来描述事物的时候没有足够的信息来描述这个事物,这个类就叫做抽象类,需要使用abstract修饰符修饰,抽象类不可以被实例化。抽象类必须有其子类重写所有的抽象方法后才可以被实例化,否则这个子类还是抽象类。抽象类可以拥有普通类中的所有类型成员,抽象类的存在在于被继承。
抽象方法:抽象类中的方法只有声明没有实现的时候,该方法就是抽象方法,需要被abstract修饰,抽象方法必须被定义在抽象类中,这个类也必须被abstract修饰。抽象方法不能使用private final static 来修饰,因为抽象方法在于被重写。
抽象方法在于约束和规定可实例化的子类。
问题1.抽象类中有构造方法吗?
      有,用于给子类对象进行初始化。
问题2.抽象类中可以不定义抽象方法吗?
      可以,但很少见,目的就是不让这个类创建对象。通常这个类中的方法有方法体,但没有内容。
问题3.abstract关键字不可以和哪些关键字共存?
      private,因为抽象方法会被子类重写,如过私有,则子类继承不到父类的抽象方法,就不能被重写。
      static,因为抽象方法不能被实例化,不能调用抽象方法,当使用static的时候可以直接用类名来调用,二者相违背。
      final,用final修饰的方法是最终方法,不能被重写,而抽象方法的存在目的在于被重写,二者相违背。
问题4.抽象类和一般类的异同点?
     相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。
     不同点:一般类有租够的信息描述事物,而抽象类描述事物的信息不足
             一般类中不能定义抽象方法,只能定义非抽象方法,抽象类可以定义抽象方法,也可以定义非抽象方法。
             一般类可以被实例化,抽象类不可以被实例化。
问题5.抽象类一定是父类吗?
              是的,因为抽象类需要子类对其重写抽象方法后子类才可以被实例化,所以抽象类一定是父类。

当几个类中有共同的方法的时候,可以将这些方法抽取出来,放在一个抽象类中,让所有类都继承于这个抽象类

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报 1 0
提供实现了的共用方法,子类实现的抽象方法。这样提高代码的复用,又保证了多样性。


//如下
abstract class Person {          
       
        public void sayHello()
        {
                System.out.println("Hello");
        }
        public abstract void  say();
}   
class Worker extends  Person
{
        public  void  say()
        {
                System.out.println("我是worker");
        }
}
class Studentt extends  Person
{
        public  void  say()
        {
                System.out.println("我是Student");
        }
}
class Testt
{
        public static void say(Person p)
        {   
                p.sayHello();
                p.say();
        }
        public static void main(String[] p)
        {
                new Testt().say(new Worker());
                new Testt().say(new Studentt());
        }
}

//运行如果
Hello
我是worker
Hello
我是Student

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
面向接口编程,并可以提供默认行为
回复 使用道具 举报
通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。降低耦合性,是多态性的重要体现。


/**
*
*/
/**
* @author Leslie
*
*/
abstract class TestA {
   public abstract void doSomething();
}
class TestB extends TestA {
   public void doSomething() {
   System.out.println("do B");
   }
}
class TestC extends TestA {
   public void doSomething() {
   System.out.println("do C");
   }
}
public class Test {
   public static void main(String[] args) {
   TestA a1 = new TestB();
   TestA a2 = new TestC();
   TestB b = new TestB();
   TestC c = new TestC();
   doSome(a1);
   doSome(a2);
   doSome(b);
   doSome(c);
   }
   public static void doSome(TestA a) {//这里,用到抽象类
    System.out.println("what is this~");
   a.doSomething();
   }
}




评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
一个抽象类有多个具体类,每个具体类都使用了同样的方法,那么可以考虑使用抽象类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马