Java 抽象类、接口、内部类-程序员宅基地

技术标签: java  开发语言  

抽象类

Java中的抽象类是一种不能被实例化的类,它用于定义子类必须实现的方法和属性

以下是一些关于Java抽象类的关键点:

  1. 抽象方法:抽象类可以包含抽象方法,这些方法只有声明没有实现,且必须在任何非抽象子类中被覆写实现。
  2. 构造方法:虽然抽象类不能直接实例化,但它可以有构造方法。这些构造方法通常用于被继承的子类的构造器中。
  3. 字段与方法:抽象类中的非抽象方法可以像普通类中的方法一样正常使用,而其字段也没有特殊限制,与普通类的字段相同。
  4. 继承关系:一个类只能继承一个抽象类,但可以实现多个接口。抽象类在设计上通常处于继承树的根部,定义了一组子类共同拥有的属性和方法。
  5. 代码复用与扩展:通过使用抽象类,可以实现代码复用并强制子类遵循特定的规范,从而提高代码的可维护性和扩展性。
  6. 面向抽象编程:这种编程方式强调定义规范而不关心具体的实现细节,使得高层代码更加通用和稳定。
  7. 抽象类与接口的区别:抽象类可以有构造方法和实现某些方法,而接口只能定义方法和常量,不能有实现。另外,一个类可以实现多个接口,但只能继承一个抽象类。

 

abstract

Java中的abstract关键字用于声明抽象类和抽象方法

abstract关键字是Java语言中的一个重要概念,它主要用于定义抽象类和抽象方法。具体来说:

  • 抽象类(Abstract Class):使用abstract关键字声明的类称为抽象类。抽象类不能被实例化,即不能直接创建对象。它的主要目的是作为其他类的基类,定义公共接口和提供可重用的代码。
  • 抽象方法(Abstract Method):在抽象类中可以定义没有具体实现的方法,这些方法称为抽象方法。抽象方法只有声明,没有方法体,且必须在任何非抽象子类中被覆写实现。

此外,使用abstract关键字的好处包括:

  1. 设计灵活性:允许开发者定义一个共同的接口或模板,而不需要关心具体的实现细节。
  2. 代码复用:可以在抽象类中实现一些通用的功能,让子类继承并使用这些功能。
  3. 强制规范:通过抽象方法,可以强制要求子类实现特定的功能,确保所有子类都有一致的行为。

以下是一个简单的Java抽象类的代码实现示例:

abstract class Animal {
    private String name;

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

    public abstract void makeSound();

    public String getName() {
        return name;
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println("Woof! Woof!");
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println("Meow! Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog("Buddy");
        Animal myCat = new Cat("Whiskers");

        myDog.makeSound(); // Output: Woof! Woof!
        myCat.makeSound(); // Output: Meow! Meow!
    }
}

在这个例子中,我们定义了一个名为Animal的抽象类,它有一个私有成员变量name和一个抽象方法makeSound()。然后,我们创建了两个继承自Animal的具体子类DogCat,它们分别实现了makeSound()方法。最后,在main方法中,我们创建了DogCat对象,并调用它们的makeSound()方法来输出相应的声音。

 

 接口

Java接口是一种引用数据类型,它是方法声明的集合,这些方法被设计为由类实现。以下是对Java接口的详细说明:

定义规则

  • 使用interface关键字来声明一个接口。
  • 接口中可以包含公共静态最终字段(public static final fields)。
  • 接口中的方法默认是公共抽象的,因此不需要显式地使用abstractpublic修饰符。

新特性

  • 默认方法:允许在不影响实现该接口的已有类的情况下,向接口添加新功能。使用default关键字来提供方法的默认实现。
  • 静态方法:允许接口中定义静态方法,这些方法可以直接通过接口调用,而不需要类的实例。
  • 私有方法:从Java 9开始,接口中可以包含私有方法,这有助于在不破坏接口公共API的情况下,将复杂逻辑隐藏起来。

使用场景

  • 多态性:当多个类需要共享相同的行为时,可以通过实现同一个接口来实现这一点。
  • 解耦:接口提供了一种方式来定义类之间的依赖关系,而不是具体的实现,从而提高了代码的可维护性和可扩展性。
  • 设计原则:遵循“接口隔离原则”,即一个类应该只依赖于它需要的接口,而不是依赖于其他不必要的接口或类。

实现方式

  • 类可以实现一个或多个接口,使用implements关键字。
  • 实现接口的类必须提供接口中所有抽象方法的具体实现。

以下是一个简单的Java接口代码示例:

public interface Animal {
    // 公共静态最终字段
    String SPECIES = "Animal";

    // 抽象方法
    void eat();

    // 默认方法
    default void sleep() {
        System.out.println("The animal is sleeping.");
    }

    // 静态方法
    static void breathe() {
        System.out.println("The animal is breathing.");
    }
}

在这个例子中,我们定义了一个名为Animal的接口。接口中包含了一个公共静态最终字段SPECIES,一个抽象方法eat(),一个默认方法sleep()和一个静态方法breathe()

接口中的默认方法允许在不破坏已有类的情况下向接口添加新功能。静态方法可以直接通过接口调用,而不需要类的实例。

要实现这个接口,可以创建一个类并使用implements关键字来声明它实现了该接口。然后,必须提供接口中所有抽象方法的具体实现。例如:

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("The dog is eating.");
    }
}

在这个例子中,我们创建了一个名为Dog的类,它实现了Animal接口。我们提供了eat()方法的具体实现,以满足接口的要求。

 

接口与接口的多继承 

Java中接口可以继承多个接口,而类只能继承一个超类

接口与接口的多继承是Java面向对象编程中的一个强大特性,它允许一个接口从多个其他接口中继承方法和常量。这样做的主要优势在于能够创建更加灵活和可扩展的代码结构。以下是关于接口多继承的一些要点:

  1. 设计目的:在Java中,接口提供了一种机制来定义一组方法签名而不包含具体实现。这使得接口成为定义公共行为的一种方式,而这些行为可以被任何实现该接口的类所共享。
  2. 解决多继承问题:由于类只能单继承,如果一个类继承了两个或更多的类,并且这些类有相同的方法,那么会产生二义性,即所谓的“钻石问题”。但是,由于接口只包含抽象方法,所以不存在这种冲突,因为实现类需要提供所有继承自接口的方法的具体实现。
  3. 语法规则:在声明接口时,可以使用逗号分隔的方式让一个接口继承多个其他接口。例如,interface ChildInterface extends ParentInterface1, ParentInterface2 {...} 表示 ChildInterface 继承了 ParentInterface1 和 ParentInterface2
  4. 方法冲突处理:如果多个接口中有重名的方法(不考虑返回值),且实现类没有明确地覆盖该方法,则会出现编译错误。这是因为Java认为同一个方法由方法名和参数列表唯一确定,而不是由返回类型确定。
  5. 使用场景:接口的多继承适用于那些希望建立一套标准或者规范的场景。例如,一个系统可能有多个不同的组件,每个组件都需要实现一些共通的功能,这时就可以通过接口来定义这些功能,并让各个组件的接口继承这些共通的接口。

以下是一个简单的Java接口多继承的代码示例:

interface InterfaceA {
    void methodA();
}

interface InterfaceB {
    void methodB();
}

interface InterfaceC extends InterfaceA, InterfaceB {
    void methodC();
}

class MyClass implements InterfaceC {
    @Override
    public void methodA() {
        System.out.println("Method A");
    }

    @Override
    public void methodB() {
        System.out.println("Method B");
    }

    @Override
    public void methodC() {
        System.out.println("Method C");
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.methodA(); // 输出 "Method A"
        myClass.methodB(); // 输出 "Method B"
        myClass.methodC(); // 输出 "Method C"
    }
}

在这个例子中,我们定义了三个接口:InterfaceAInterfaceBInterfaceC。其中,InterfaceC通过使用extends关键字继承了InterfaceAInterfaceB。这意味着InterfaceC包含了InterfaceAInterfaceB中的所有方法签名。

然后,我们创建了一个名为MyClass的类,它实现了InterfaceC接口。由于MyClass实现了InterfaceC,因此它必须提供InterfaceAInterfaceB中所有方法的具体实现。在MyClass中,我们覆盖了这些方法,并在每个方法中打印出相应的消息。

最后,在main方法中,我们创建了一个MyClass对象,并调用了它的methodA()methodB()methodC()方法。这些方法分别输出了"Method A"、"Method B"和"Method C"。

 

内部类 

Java中的内部类是定义在另一个类或方法中的类

Java语言提供了多种类型的内部类,主要包括以下几种:

  1. 成员内部类:这是最常见的内部类形式,它被定义在外层类的成员位置,可以访问外层类的所有成员(包括私有成员)。成员内部类可以包含任何访问修饰符或者默认不写,表示仅在当前包内可见。
  2. 静态内部类:与成员内部类类似,但是前面有static修饰符,这意味着它可以在不创建外部类实例的情况下独立存在。静态内部类只能访问外部类的静态成员。
  3. 局部内部类:定义在一个方法或作用域内的类,它的生命周期通常限定在该方法的执行期间。局部内部类可以访问外部方法的final变量和形参。
  4. 匿名内部类:没有名字的内部类实现,通常用于简化代码编写,尤其是在事件监听等场景中。匿名内部类一般用在需要立即实例化并作为参数传递的地方。

使用内部类的好处包括:

  1. 逻辑封装:能够将相关的类组织在一起,使得代码结构更加清晰。
  2. 隐藏实现细节:内部类可以设置为私有的,这样就不会在外部类之外暴露实现细节。
  3. 方便访问外部类成员:内部类可以直接访问外部类的成员,而不需要通过外部类的实例引用。

需要注意的是,使用内部类可能会带来一些性能开销,因为它会生成额外的类文件,并且在运行时会对内存和性能产生一定影响。因此,在设计时应当根据实际需求权衡是否使用内部类。

 

 成员内部类

成员内部类是定义在另一个类的成员位置上的类。以下是一些关于成员内部类的关键点:

定义方式

public class OuterClass {
    // 成员内部类
    class MemberInnerClass {
        // 类的内容
    }
    
    // 其他外部类的成员(方法、字段等)
}

访问权限

  • 成员内部类可以有publicprotectedprivate或默认(包访问级别)的访问修饰符。
  • 如果没有显式指定访问修饰符,则默认为包访问级别,即只能被同一个包内的类访问。

访问外部类成员

  • 成员内部类可以自由访问外部类的成员,包括私有成员。
  • 甚至可以直接访问外部类的私有成员,这是Java语言对内部类的特殊优待。

创建实例

  • 要在外部类的外部创建成员内部类的实例,首先需要创建外部类的实例。
  • 语法格式为:OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();

继承关系

  • 成员内部类可以被继承,其子类可以是定义在相同包或者不同包中的其他类。
  • 子类会继承成员内部类的所有成员,并且可以添加新的成员或者覆盖父类中的方法。

使用场景

  • 当一个类隐藏或者包装另一个类时,成员内部类非常有用。
  • 当想要创建一个与外部类密切相关的类,且只有在外部类上下文中才有意义时,可以使用成员内部类。

注意事项

  • 成员内部类不能拥有static方法(除非它们是final且仅调用静态方法),因为非静态内部类依赖于外部类的实例。
  • 成员内部类可以包含任何类型的方法和变量,包括嵌套的成员内部类。

 

 静态内部类

静态内部类是定义在外层类的内部的,并且以static关键字声明的类。以下是一些关于静态内部类的关键点:

定义方式

public class OuterClass {
    // 静态内部类
    static class StaticInnerClass {
        // 类的内容
    }
    
    // 其他外部类的成员(方法、字段等)
}

访问权限

  • 静态内部类可以有publicprotectedprivate或默认(包访问级别)的访问修饰符。
  • 如果没有显式指定访问修饰符,则默认为包访问级别。

访问外部类成员

  • 静态内部类不可以直接访问外部类的非静态成员。
  • 因为它在没有外部类实例的情况下就可以存在,所以它不能访问外部类的实例成员。
  • 静态内部类可以访问外部类的静态成员。

创建实例

  • 由于静态内部类不依赖于外部类的实例,因此可以直接通过其类名来创建实例,不需要外部类的实例。
  • 语法格式为:OuterClass.StaticInnerClass innerObject = new OuterClass.StaticInnerClass();

继承关系

  • 静态内部类可以被继承,其子类可以是定义在相同包或者不同包中的其他类。
  • 子类会继承静态内部类的所有成员,并且可以添加新的成员或者覆盖父类中的方法。

使用场景

  • 当一个类与另一个类有关联,但是不需要访问这个外部类的实例时,可以使用静态内部类。
  • 静态内部类适用于那些与外部类紧密相关,但是在逻辑上更偏向于工具类或者辅助类的情况。

注意事项

  • 静态内部类可以包含静态方法和变量,因为它们不依赖于外部类的实例。
  • 静态内部类可以包含任何类型的方法和变量,包括嵌套的静态内部类。

综上所述,静态内部类提供了一种将类隐藏在另一个类中的机制,同时保持了与外部类的逻辑关联,但不需要外部类的实例。这在很多情况下是有用的,比如当你需要一个工具类或者辅助类,而这个类又与某个特定的外部类紧密相关时。

 

 局部内部类

局部内部类是定义在一个方法或作用域内的类。以下是一些关于局部内部类的关键点:

定义方式

public class OuterClass {
    public void someMethod() {
        // 局部内部类
        class LocalInnerClass {
            // 类的内容
        }
        
        // 其他外部类的成员(方法、字段等)
    }
}

访问权限

  • 局部内部类可以有publicprotectedprivate或默认(包访问级别)的访问修饰符。
  • 如果没有显式指定访问修饰符,则默认为包访问级别。

访问外部类成员

  • 局部内部类可以访问外部类的成员,包括私有成员。
  • 它可以访问外部方法的final变量和形参。

创建实例

  • 要在外部类的外部创建局部内部类的实例,首先需要创建外部类的实例,然后调用包含局部内部类的方法。
  • 语法格式为:OuterClass outerObject = new OuterClass(); OuterClass.LocalInnerClass innerObject = outerObject.someMethod();

继承关系

  • 局部内部类可以被继承,其子类可以是定义在相同包或者不同包中的其他类。
  • 子类会继承局部内部类的所有成员,并且可以添加新的成员或者覆盖父类中的方法。

使用场景

  • 当一个类只在特定的方法或作用域内使用时,可以使用局部内部类。
  • 局部内部类适用于那些只在特定上下文中使用的辅助类。

注意事项

  • 局部内部类不能拥有static方法(除非它们是final且仅调用静态方法),因为非静态内部类依赖于外部类的实例。
  • 局部内部类可以包含任何类型的方法和变量,包括嵌套的局部内部类。

局部内部类提供了一种将类隐藏在方法或作用域内的机制,使得只有在这个特定的上下文中才能访问到这个类。这有助于减少类的可见性,并提高代码的封装性和可维护性。

 

匿名内部类

匿名内部类是Java中的一种特殊类型的内部类,它没有类名,通常用于简化代码编写

匿名内部类在Java中是一种常见的编程技巧,它们具有以下几个特点:

  1. 局部性:匿名内部类通常定义在类的局部位置,如方法中或代码块中。
  2. 无类名:匿名内部类没有明确的类名,这也是其被称为“匿名”的原因。
  3. 本质仍是类:尽管没有类名,匿名内部类本质上还是一个类,它可以继承其他类或实现接口。
  4. 即时创建对象:匿名内部类通常在创建时就直接实例化,即在声明的同时就创建一个对象。
  5. 语法结构:匿名内部类的基本语法格式为 new 类或接口() { 类体 },这种结构可以直接在需要使用对象的上下文中创建并使用该对象。
  6. 用途:匿名内部类通常用于简化开发,尤其是在只需要使用一次的地方,如事件监听器的注册等场景。
  7. 访问限制:匿名内部类可以访问外部类的成员,但是有访问权限的限制,比如不能访问外部类的私有成员。
  8. 生命周期:匿名内部类的生命周期通常与包含它的方法或代码块的执行周期一致。
  9. 内存开销:由于匿名内部类会产生额外的类文件和对象,因此在性能敏感的场景中需要注意其可能带来的内存开销。

匿名内部类通常用于简化代码编写,特别是在需要使用一次的地方。以下是一个示例,展示了如何在Java中使用匿名内部类:

public class OuterClass {
    public void someMethod() {
        // 创建一个匿名内部类的实例
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类执行了run方法");
            }
        };
        
        // 调用匿名内部类的方法
        runnable.run();
    }
    
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.someMethod();
    }
}

在上面的示例中,我们创建了一个Runnable接口的匿名内部类,并实现了其中的run方法。然后,我们通过创建OuterClass的实例来调用someMethod方法,该方法中创建了匿名内部类的实例并调用了其run方法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_74521994/article/details/137156147

智能推荐

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

获取list集合中重复的元素_list找到重复的元素-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏13次。老规矩,二话不说直接上代码:package com.poinne17.test;import org.apache.commons.collections.CollectionUtils;import org.junit.Test;import java.util.*;/** * @author:Pionner17 * @date: 2017/9/3 22:41 * @em_list找到重复的元素

系统运维—1.0 解压缩_winzip收费-程序员宅基地

文章浏览阅读1k次。一、zip和unzip  一般情况下,windows中的压缩包都是rar或者zip格式,对应的压缩软件为winzip和winrar。winzip是免费的,winrar是收费的。rar比zip压缩率更高,即同样的文件压缩完后体积更小,同时因为国内盗版,以及winrar安装后,右击默认压缩为rar的原因,导致国内的rar的使用率远超zip。  放眼全世界,zip的使用率反而远超rar,在ubuntu中,zip是默认安装的,免费使用,而rar需要额外安装,并且收费。故在linux中一般情况下,我们使用zip格_winzip收费

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签