抽象方法的成员方法,成员变量abstract的使用,以及其概述

/*
抽象类的概述:
动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。

抽象类的特点:
A:抽象类和抽象方法必须用abstract关键字修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
C:抽象类不能实例化
因为它不是具体的。
抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
用于子类访问父类数据的初始化
D:抽象的子类
a:如果不想重写抽象方法,该子类是一个抽象类。
b:重写所有的抽象方法,这个时候子类是一个具体的类。

抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
Animal a = new Cat();

*/

例子://abstract class Animal //抽象类的声明格式
abstract class Animal {
//抽象方法
//public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
public abstract void eat();

public Animal(){}
}


//子类是抽象类
abstract class Dog extends Animal {}


//子类是具体类,重写抽象方法
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}


class AbstractDemo {
public static void main(String[] args) {
//创建对象
//Animal是抽象的; 无法实例化
//Animal a = new Animal();
//通过多态的方式
Animal a = new Cat();//这里cat方法在上面的CAT类中重写了的,变成了普通类,所以可以直接实例化
a.eat();
}
}


成员方法以及成员变量的用法


/*
抽象类的成员特点:
成员变量:既可以是变量,也可以是常量。
构造方法:有。
用于子类访问父类数据的初始化。
成员方法:既可以是抽象的,也可以是非抽象的。

抽象类的成员方法特性:
A:抽象方法 强制要求子类做的事情。
B:非抽象方法 子类继承的事情,提高代码复用性。
*/
abstract class Animal {
public int num = 10;
public final int num2 = 20;


public Animal() {}

public Animal(String name,int age){}//非抽象方法

public abstract void show();//抽象方法

public void method() {
System.out.println("method");
}
}


class Dog extends Animal {
public void show() {
System.out.println("show Dog");//重新抽象方法,变成非抽象方法
}
}


abstract关键词的使用



/*
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
A:可以。
B:不让创建对象。


abstract不能和哪些关键字共存?
private 冲突
final 冲突
static 无意义
*/
abstract class Fu {
//public abstract void show();
//非法的修饰符组合: abstract和private
//private abstract void show();

//非法的修饰符组合
//final abstract void show();

//非法的修饰符组合
//static abstract void show();

public static void method() {
System.out.println("method");
}
}


class Zi extends Fu {
public void show() {}
}


class AbstractDemo3 {
public static void main(String[] args) {
Fu A=new Fu();//经过测试,这里报错,下面一行正确,说明抽象方法无法实例化,只有通过继承这个抽象类,然后实列化
Fu.method();
}
}



一个关于抽象类的使用例子

/*
猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭


分析:从具体到抽象
猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(猫吃鱼)

狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(狗吃肉)

因为有共性的内容,所以就提取了一个父类。动物。
但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
而方法是抽象的类,类就必须定义为抽象类。

抽象动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();

实现:从抽象到具体
动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();

狗类:
继承自动物类
重写吃饭();

猫类:
继承自动物类
重写吃饭();
*/
//定义抽象的动物类
abstract class Animal {
//姓名
private String name;
//年龄
private int age;

public Animal() {}

public Animal(String name,int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

//定义一个抽象方法
public abstract void eat();
}


//定义具体的狗类
class Dog extends Animal {
public Dog() {}

public Dog(String name,int age) {
super(name,age);
}

public void eat() {
System.out.println("狗吃肉");
}
}


//定义具体的猫类
class Cat extends Animal {
public Cat() {}

public Cat(String name,int age) {
super(name,age);
}

public void eat() {
System.out.println("猫吃鱼");
}
}


//测试类
class AbstractTest {
public static void main(String[] args) {
//测试狗类
//具体类用法
//方式1:
Dog d = new Dog();//这里是调用Dog的默认的构造方法,没有参数,需要在下面复制,这里直接使用Dog类,没有使用多态
d.setName("旺财");
d.setAge(3);
System.out.println(d.getName()+"---"+d.getAge());
d.eat();
//方式2:
Dog d2 = new Dog("旺财",3);//这里是调用Dog类中重载的构造方法,直接传值,这里直接使用Dog类,没有使用多态
System.out.println(d2.getName()+"---"+d2.getAge());
d2.eat();
System.out.println("---------------------------");

Animal a = new Dog();//这里是调用Dog的默认的构造方法,没有参数,需要在下面复制
a.setName("旺财");
a.setAge(3);
System.out.println(a.getName()+"---"+a.getAge());
a.eat();

Animal a2 = new Dog("旺财",3);//这里是调用Dog类中重载的构造方法,直接传值
System.out.println(a2.getName()+"---"+a2.getAge());
a2.eat();

//练习:测试猫类
}
}

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
抽象类可以包含成员变量,这些成员变量可以是实例变量或静态变量抽象类的成员变量与普通类的成员变量定义方式相同,只是在抽象类中定义的成员变量可以被子类继承和使用。 以下是一个示例代码,展示了抽象类中成员变量的定义和使用: ```java abstract class AbstractClass { // 实例变量 protected int instanceVariable; // 静态变量 protected static int staticVariable; // 构造方法 public AbstractClass(int instanceVariable) { this.instanceVariable = instanceVariable; } // 抽象方法 public abstract void abstractMethod(); } class ConcreteClass extends AbstractClass { public ConcreteClass(int instanceVariable) { super(instanceVariable); } @Override public void abstractMethod() { System.out.println("具体类实现抽象方法"); } } public class Main { public static void main(String[] args) { ConcreteClass concreteObj = new ConcreteClass(10); System.out.println("实例变量值: " + concreteObj.instanceVariable); System.out.println("静态变量值: " + AbstractClass.staticVariable); concreteObj.abstractMethod(); } } ``` 在上面的示例中,抽象类`AbstractClass`定义了一个实例变量`instanceVariable`和一个静态变量`staticVariable`。子类`ConcreteClass`继承了抽象类,并通过调用父类的构造方法来初始化实例变量。最后,在`Main`类中创建了一个`ConcreteClass`对象,并打印了实例变量和静态变量的值,以及调用了抽象方法的实现。 需要注意的是,抽象类不能直接实例化,只能用于被继承。因此,我们在示例中创建了一个具体类`ConcreteClass`来继承抽象类,并实例化该具体类对象来访问和使用抽象类的成员变量
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值