目录
一、抽象类和抽象方法
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.抽象类和具体类在实现上的差异
抽象类可以包含抽象方法和非抽象方法,子类必须实现抽象方法; 具体类必须实现它的所有方法,不能有未实现的方法。
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();
}
}