JAVA基础(抽象类)

一,抽象类的定义
普通类前加上abstract关键字,
如果类中定义抽象方法(定义中加上abstract的方法,且没有方法体,只有方法的声明),该类一定要声明为抽象类。
二,抽象类的几点说明
1,一般情况下每一个抽象类要有子类,抽象类的子类可以为抽象类也可以为正常类,如果是正常类,抽象类中的所有抽象方法都要覆写
2,抽象类不能直接实例化对象,必须通过子类向上转型实例化对象
3,抽象类中的所有抽象方法都要在其继承的子类中实现覆写
4,从开发的角度讲,普通类一般要继承抽象类,而不是继承普通类
5,抽象类只比普通类多了抽象方法的定义,其他结构与普通类完全一样

package 抽象类;
abstract class A{
    //抽象方法
    public abstract void print();
    public abstract void fun();
}
class B extends A{
    //实现覆写
    public void print()
    {
        System.out.println("子类print()函数");
    }
    public void fun()
    {
        System.out.println("子类fun()函数");
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        //向上转型
        A b = new B();
        b.print();
    }
}

在这里插入图片描述
三,抽象类的一些限制
1,抽象类中有构造方法,实例化子类对象时,先调用父类构造,再调用子类构造,
2,抽象类不能由final定义,因为抽象类一定要有子类的存在,而final定义的类不存在子类
3,外部抽象类不能由static声明,内部抽象类可以由static声明,使用static声明的内部抽象类,相当于外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称

package 抽象类;
abstract class A{
     //static声明的内部抽象类
    static abstract class B {
        abstract public void print();
    }
}
class C extends A.B{
    public void print()
    {
        System.out.println("C类中的print()");
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        //向上转型
        A.B c = new C();
        c.print();
    }
}

在这里插入图片描述
4,当抽象类中定义static方法时,同样也不需要对象的产生,直接由抽象类调用,此时抽象类可以没有子类。即使有子类,该子类也不可覆写静态方法,只能继承静态方法

package 抽象类;
abstract class A{
         public static void print()
         {
             System.out.println("抽象类中的静态方法print()");
         }
}
public class AbstractDemo {
    public static void main(String[] args) {
        A.print();
    }
}

在这里插入图片描述
5.外部抽象类隐藏其子类的存在–>将抽象类子类定义在内部

package 抽象类;
abstract class A {
    public abstract void print();
   private static class B extends A {
        public void print() {
            System.out.println("内部 抽象类子类中的静态方法print()");
        }
    }
    public static A get()
    {
        return new B();
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        A a = A.get();
        a.print();
    }
}

6.解决遗留的问题,只有在构造完成后,为属性赋的初始值才真正给属性,构造没完成之前,属性的初始值只是该数据类型的默认值。

package 抽象类;
abstract class A {
    public A()//2.先执行父类构造-->3
    {
        this.print();//3.调用print()-->4
    }
    public abstract void print();
}
 class B extends A {
    private int num = 100;
    //4.执行print(),此时直接跳过来num的赋值,所以num=0;
    public void print() {
        System.out.println("num =  "+ num);
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        new B();//1.实例化对象,执行构造-->2
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值