ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-07-26 day15第一小组 王鸣赫

2022-07-26 21:00:37  阅读:134  来源: 互联网

标签:26 07 王鸣赫 stack queue 抽象 接口 抽象类 public


目录

抽象

面向对象特征:抽象
Java中,除了类还有抽象类和接口

抽象方法

用抽象修饰的方法叫抽象方法
没有方法体(没有大括号){}
抽象方法存在的意义是什么?
存在的意义是为了约定
根本意义,约定,自定义的规则
约定了返回值、访问权限、参数列表。需要在重写的时候去定义方法体
约定大于配置,配置大于编码

抽象方法必须在一个抽象类里
注意:
1.当我们定义一个抽象类,这个抽象类中可以有哪些结构?
属性、成员方法、构造器、抽象方法、常量
·定义常量
final String str = "哈哈"
2.抽象类中能不能没有抽象方法?
抽象类可以没有抽象方法
4.抽象类的构造器存在的意义
为了约定子类的构造器必须和父类要匹配
5.一个类如果继承了一个抽象类,就必须重写这个抽象类所有的抽象方法

抽象类是不能被实例化的(抽象类不能创建对象)

abstract

类和方法。

·抽象方法不能用private修饰,可以用public protected 默认的修饰
开发中,抽象方法基本上都是public

·抽象方法不能用final修饰。用final修饰的方法是不允许重写、不能被覆盖的。
·抽象类不能用final修饰。用final修饰的类是不允许被继承的。

总结:
1.抽象方法必须是public或protected或默认的(default)(因为如果是private是不能被子类继承的,子类便无法实现该方法)
2.抽象类不能被直接实例化,需要依靠子类采用向上转型的方法处理
3.抽象类必须有子类,使用extends继承
4.子类(前提:如果不是抽象类)则必须重写抽象类中的所有抽象方法(如果子类没有实现弗雷德抽象方法,必须将子类也定义为abstract)

接口

比抽象类更高级的抽象
使用interface关键字
JDK7之前接口中只能定义抽象方法,不能有属性,不能有方法(也可以放静态常量和静态方法)
JDK8及以后:接口中只能定义抽象方法,不能有属性,可以有默认方法和静态方法、静态常量

抽象类和接口的区别。

抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:

a、抽象类不能被实例化只能被继承;

b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;

c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;

d、一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;

e、抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。

接口:Java中接口使用interface关键字修饰,特点为:

a、接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前);

b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;

c、一个类可以实现多个接口;

d、JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。

点击查看代码
public interface Person{
  public static final int a=10;
  //JDK1.8
    default void sayHello(){
        System.out.println("Hello World");
    }
    public void say();
}
public abstract class Person{
  public abstract void say();
  public void eat(){};
}

面试题:接口与抽象类的区别

相同点

(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

数据结构


往箱子里面放东西叫做入栈
往箱子里面取东西叫做出栈
箱子的底部叫做栈底
箱子的顶部叫做栈顶
说到栈的特性先进后出(LIFO, Last In First Out)
栈顶

点击查看代码
public class Node {

    //数据域
    public int data;

    //指针域,指向下一个节点
    public Node next;

    public Node() {
    }

    public Node(int data) {
        this.data = data;
    }

    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }
    
}

栈底
点击查看代码
public class Stack {

    public Node stackTop;
    public Node stackBottom;

    public Stack(Node stackTop, Node stackBottom) {
        this.stackTop = stackTop;
        this.stackBottom = stackBottom;
    }

    public Stack() {
    }


}
进栈
点击查看代码
/**
     * 进栈
     *
     * @param stack 栈
     * @param value 要进栈的元素
     */
    public static void pushStack(Stack stack, int value) {

        // 封装数据成节点
        Node newNode = new Node(value);


        // 栈顶本来指向的节点交由新节点来指向
        newNode.next = stack.stackTop;

        // 栈顶指针指向新节点
        stack.stackTop = newNode;

    }
遍历栈
点击查看代码
/**
     * 遍历栈(只要栈顶指针不指向栈底指针,就一直输出)
     *
     * @param stack
     */
    public static void traverse(Stack stack) {
        Node stackTop = stack.stackTop;

        while (stackTop != stack.stackBottom) {

            System.out.println("关注公众号:Java3y:" + stackTop.data);

            stackTop = stackTop.next;
        }


    }
测试
点击查看代码
public static void main(String[] args) {

        //初始化栈(无元素)
        Stack stack = new Stack(new Node(), new Node());

        //栈顶和栈尾是同一指向
        stack.stackBottom = stack.stackTop;

        //指向null
        stack.stackTop.next = null;


        //进栈
        pushStack(stack, 3);
        pushStack(stack, 4);
        pushStack(stack, 5);

        traverse(stack);

    }

判断该栈是否为空
点击查看代码
/**
     * 判断该栈是否为空
     *
     * @param stack
     */
    public static void isEmpty(Stack stack) {
        if (stack.stackTop == stack.stackBottom) {

            System.out.println("---->该栈为空");
        } else {

            System.out.println("---->该栈不为空");

        }

    }
出栈
点击查看代码
/**
     * 出栈(将栈顶的指针指向下一个节点)
     * @param stack
     */
    public static void popStack(Stack stack) {

        // 栈不为空才能出栈
        if (!isEmpty(stack)) {

            //栈顶元素
            Node top = stack.stackTop;

            // 栈顶指针指向下一个节点
            stack.stackTop = top.next;

            System.out.println("---->出栈的元素是:" + top.data);

        }
    }
清空栈
点击查看代码
/**
     * 清空栈
     * @param stack
     */
    public static void clearStack(Stack stack) {

        stack.stackTop = null;
        stack.stackBottom = stack.stackTop;
    }
队列

点击查看代码
public class Queue {


    //数组
    public int [] arrays;

    //指向第一个有效的元素
    public int front;

    //指向有效数据的下一个元素(即指向无效的数据)
    public int rear;

}
初始化
点击查看代码
public static void main(String[] args) {

        //初始化队列
        Queue queue = new Queue();

        queue.front = 0;
        queue.rear = 0;
        queue.arrays = new int[6];
        
    }
判断队列是否满了
点击查看代码
 /**
     * 判断队列是否满了,front和rear指针紧挨着,就是满了
     * @param queue
     * @return
     */
    public static boolean isFull(Queue queue) {
        if ((queue.rear + 1) % queue.arrays.length == queue.front) {

            System.out.println("关注公众号:Java3y--->此时队列满了!");
            return true;
        } else {
            System.out.println("关注公众号:Java3y--->此时队列没满了!");
            return false;
        }
    }

入队
点击查看代码
/**
     * 入队
     *
     * @param queue
     */
    public static void enQueue(Queue queue,int value) {

        // 不是满的队列才能入队
        if (!isFull(queue)) {

            // 将新的元素插入到队尾中
            queue.arrays[queue.rear] = value;

            // rear节点移动到新的无效元素位置上
            queue.rear = (queue.rear + 1) % queue.arrays.length;
        }
    }
遍历
点击查看代码
/**
     * 遍历队列
     * @param queue
     *
     */
    public static void traverseQueue(Queue queue) {

        // front的位置
        int i = queue.front;

        while (i != queue.rear) {

            System.out.println("--->" + queue.arrays[i]);

            //移动front
            i = (i + 1) % queue.arrays.length;
        }

    }
判断该队列是否为空
点击查看代码
/**
     * 判断队列是否空,front和rear指针相等,就是空了
     * @param queue
     * @return
     */
    public static boolean isEmpty(Queue queue) {
        if (queue.rear  == queue.front) {
            System.out.println("--->此时队列空的!");
            return true;
        } else {
            System.out.println("--->此时队列非空!");
            return false;
        }
    }

出队
点击查看代码
	/**
     * 出队
     *
     * @param queue
     */
    public static void outQueue(Queue queue) {

        //判断该队列是否为null
        if (!isEmpty(queue)) {


            //不为空才出队
            int value = queue.arrays[queue.front];
            System.out.println("--->出队的元素是:" + value);

            // front指针往后面移
            queue.front = (queue.front + 1) % queue.arrays.length;

        }


    }
栈与队列的相同点:

1.都是线性结构
2.插入操作都是在表尾进行
3.都可以通过顺序结构和链式结构实现
栈与队列的不同点:
1.队列是先进先出;栈是先进后出

总结:

1.抽象 abstract关键字
抽象类的特点
abstract能修饰哪些结构
抽象方法的特点
2.接口。JDK7-JDK8的有什么改变
3.面试题:继承类和实现接口的异同 抽象类和接口的区别
4.堕胎的补充说明
5.匿名实现类

重点:结合多态,主要是参数的传递以及配合instanceof使用
在能够使用多台表示对象的时候,尽量使用多态

栈和队列
建立在两个最基础的数据结构的基础上构建的两个受限制的线性表

面向对象四大特征:
封装 继承 多态 (抽象)

标签:26,07,王鸣赫,stack,queue,抽象,接口,抽象类,public
来源: https://www.cnblogs.com/wmh19990109/p/16522617.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有