Java进阶——抽象类、内部类

本文深入探讨了Java中的抽象类、抽象方法,包括它们的定义、区别以及如何创建抽象类。同时,还介绍了内部类的概念以及匿名类的用法,帮助开发者更好地理解和运用这些高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、抽象类和抽象方法

1.区分普通方法和抽象方法

2.区分普通类和抽象类

3.定义一个抽象类

4.抽象类和 具体类的比较

二、内部类

三、 匿名类


一、抽象类和抽象方法

1.区分普通方法和抽象方法

在Java 中,当一个类被 abstract 关键字修饰的时候这个类称为抽

象类。当一个类的方法被 abstract 关键字修饰的时候,该方法称为抽象

方法。抽象方法必须定义在抽象类中。当一个方法被定义为抽象方法

后,意味着该方法不会有具体的实现,而是在抽象类的子类中通过方法

重写进行实现。定义抽象方法的语法格式如下:

[访问修饰符]abstract <返回类型><方法名>([参数列表]);

abstract 关键字表示该方法被定义为抽象方法。

普通方法和抽象方法相比,主要有下列两点区别:

  • 抽象方法需要用修饰符 abstract 修饰,普通方法不允许

  • 普通方法有方法体,抽象方法没有方法体。

2.区分普通类和抽象类

在Java中,当一个类被abstract关键字修饰时,该类为抽象类。

定义抽象类的方法如下:

abstract class <类名>{
​
}

abstract关键字表示该类被定义为抽象类。

普通类与抽象类相比,主要有下列两点区别:

  • 抽象类需要用修饰符 abstract 修饰,普通类不允许

  • 普通类可以被实例化,抽象类不可以被实例化。

    public abstract class Pet {
        //属性
        private String name = "无名氏";
        private int health = 100;
        private int love = 0;
        //构造方法
        public Pet(String name){
            this.name = name;
        }
    ​
        public void print(){
            System.out.println("宠物的自白:\n我的名字叫"
                        + this.name + ",健康值是"
                        + this.health + ",和主人的亲密度是"
                        + this.love + "."
            );
        }
    }
    ​
    class Test{
        public static void main(String[] args) {
    //Pet pet = new Pet("大黄");//错误示范,因为抽象类不能实例化
        }
    }

3.定义一个抽象类

当一个类被定义为抽象类时,它可以包含各种类型的成员,包括属性、

方法等,其中方法又分为普通方法和抽象方法,下面是抽象类结构的示

例:

public abstract class 类名{
​
修饰符 数据类型  变量名;
​
修饰符 abstract 返回值类型 方法名称(参数列表);
​
修饰符 返回值类型 方法名称(参数列表){
​
•   }
​
}

  • 提示

    - abstract 修饰的抽象方法没有方法体
    - private 关键字不能用来修饰抽象方法,否则由于封装导致子类无法重写抽象方法
    - 抽象类不能被之间实例化,但有构造方法
    - 子类如果不是抽象类,则子类必须重写抽象类中的全部抽象方法
    - abstract 修饰符不能和final修饰符一起使用
4.抽象类和 具体类的比较

抽象类和具体类是面向对象编程中的两个重要概念 (1) 抽象类: 抽象类是一种不能被实例化的类,它只能被用作其他类的基类。它的目的是为了提供一种基于继承的模板,强制要求子类实现它的抽象方法。抽象类中可能包含一些实现方法,但是也可以只包含抽象方法。

  • 抽象类的主要特点:

1.不能被实例化

2.可以包含抽象方法和非抽象方法

3.子类必须实现抽象方法

4.抽象类可以包含构造函数。 (2)具体类: 具体类是可以被实例化的类,它可以直接使用,也可以继承自其他类。具体类中必须要实现它的所有方法,不能有未实现的方法。它可以包含属性、方法、构造函数等。

  • 具体类的主要特点:

  1. 可以被实例化

  2. 必须实现所有方法,可以包含属性、方法、构造函数等。

  • 两者的比较:

1.抽象类和具体类在定义上的差异

抽象类是一种不能被实例化的类,它只能被用作其他类的基类。具体类则是可以被实例化的类。

2.抽象类和具体类在实现上的差异

抽象类可以包含抽象方法和非抽象方法,子类必须实现抽象方法; 具体类必须实现它的所有方法,不能有未实现的方法。

3.抽象类和具体类在使用上的差异

抽象类通常用于定义一些基础的、通用的行为和属性,而具体类则用于实现具体的业务逻辑和行为。 总的来说,抽象类和具体类是两种不同类型的类,它们的作用和使用场景也不同。抽象类用于定义一些通用的行为和属性,并强制子类实现抽象方法,具体类则用于实现具体的业务逻辑和行为。

二、内部类

内部类是指讲一个类定义在另外一个类的内部,称为内部类。

public class AbstractDemo {//外部类
 private  static   int a =0;
  private  int b =3;
    public  void a(){
//        Abstr abstr = new Abstr();
      new Abstr().test();
      Abstr.abc();
    }
    static  class  Abstr {
        private int aa =3;
        private static int bb=2;
         public void test(){
             int a = 5;
             System.out.println(aa);
             aa=2;
             System.out.println(aa);
             System.out.println(bb);
             Abstr.bb=4;
             System.out.println(bb);
             System.out.println(AbstractDemo.a);
           AbstractDemo.a=5;
             System.out.println(AbstractDemo.a);
           System.out.println(a);
       }
       public static void abc(){
           System.out.println("a");
           Abstr.bb=3;
           new Abstr().aa=1;
       }
​
​
​
    }
    class Abstra{//内部类
       private  static  int b =3;
       private  int aa =2;
        public  void test1(){
            int b =2;
            System.out.println(b);//当前类的对象
            AbstractDemo.this.b=5;//外部类的对象
            System.out.println(AbstractDemo.this.b);
        }
​
​
    }
​
    public static void main(String[] args) {
        AbstractDemo.Abstr ab = new AbstractDemo.Abstr();
        ab.test();
        Abstr.abc();
        AbstractDemo.Abstra abs = new Abstractemo().new Abstra();
//        abs.test1();
    }
}

三、 匿名类

之前定义的类都是命名类,也就是类都有明确的名称。匿名类是指没有明确的名称。

public abstract class AbstractDemo2 {
    public static void test(){
        System.out.println("哈哈哈");
    }
    public abstract void play();
}
    public TestAbstract() {
    }
​
    public static void main(String[] args) {
        AbstractDemo2 stu = new AbstractDemo2() {
            @Override
            public void play() {
                System.out.println("发发发");
            }
        };
        stu.play();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值