zoukankan      html  css  js  c++  java
  • 面向对象思想1【笔记】

    面向对象思想概述

    类与对象

    类中的成员变量对应着对象的状态

    类中的成员函数对应着对象的行为

    在只属于类的一部分中有类的静态变量和类的静态函数

    逻辑上存在

    物理上

    在其中的employee类代码中,只有一个getpaid函数,那么怎么给这两个用呢,这就有了this.

    类的静态变量和静态函数

    没有this引用,静态变量全局独一份

    普通的函数引用静态函数或者静态变量是可以的

    对象上引用静态变量和静态函数会产生编译器警告

    在静态函数上引用普通成员变量或者函数是不行的,会产生编译错误

    类的特殊函数

    构造函数,没有返回值,在类函数下的同名函数是构造函数,构造函数还可以进行重载

    Equals

    Hashcode

    Tostring

    接口

    接口和类是很像的

    为什么要有接口的概念

    从用户(使用实现的代码)角度看问题

    协作

    接口与类相比

    由编译器强制的一个模块间协作的合约(contract)

    无成员变量

    接口的申明

    接口和抽象类的不同

    在c++中,接口和抽象类是没有什么不同的

    在java中,就有一些区别

    从实现角度看,接口与抽象类有一些不同

    抽象类可以有成员变量

    抽象类可以有部分实现

    抽象类不可以多重继承,只能继承一个

    为什么设计成这样?

    从用户角度来考虑问题

    强调合约

    强制协作双方无法犯错

    接口的多重实现?

    例题:包装链表类,实现iterable接口

    具体代码如下:

    package interview.oop.linkedlist;
    
    import java.util.Iterator;
    import java.util.NoSuchElementException;
    
    import interview.common.Node;
    
    public class LinkedList<T> implements Iterable<T> {
    
      private Node<T> head;
      private Node<T> tail;
    
      public static <T> LinkedList<T> newEmptyList() {
        return new LinkedList<T>();
      }
    
      private LinkedList() {
        head = null;
        tail = null;
      }
    
      public void add(T value) {
        Node<T> node = new Node<>(value);
        if (tail == null) {
          head = node;
        } else {
          tail.setNext(node);
        }
        tail = node;
      }
    
      private class ListIterator implements Iterator<T> {
        private Node<T> currentNode;
    
        public ListIterator(Node<T> head) {
          currentNode = head;
        }
    
        @Override
        public boolean hasNext() {
          return currentNode != null;
        }
    
        @Override
        public T next() {
          if (currentNode == null) {
            throw new NoSuchElementException();
          }
          T value = currentNode.getValue();
          currentNode = currentNode.getNext();
          return value;
        }
      }
    
      @Override
      public Iterator<T> iterator() {
        return new ListIterator(head);
      }
    }
    

    Tester.java

    package interview.oop.linkedlist;
    
    public class Tester {
    
      public static void main(String[] args) {
        LinkedList<Integer> list = LinkedList.newEmptyList();
        for (int i = 0; i < 100; i++) {
          list.add(i);
        }
    
        for (Integer value : list) {
          System.out.println(value);
        }
    
        LinkedList<String> stringList = LinkedList.newEmptyList();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100; i++) {
          sb.append("a");
          stringList.add(sb.toString());
        }
    
        for (String value : stringList) {
          System.out.println(value);
        }
      }
    }
    

    总结:

    阅读接口注释,严格按照合约来实现

    循环不变式用于假想的循环中

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    WPF---数据模板(一)
    Oracle 相关知识
    Oracle 11g数据库详细安装步骤图解
    Mysql优化
    CSharp 相关知识点小结
    JS Date当前时间:获取日期时间方法在各浏览器中的差异
    【转】IE8浏览器无法保存Cookie的解决方法
    8 种提升 ASP.NET Web API 性能的方法
    DotNet 资源大全【转】
    DotNet 资源大全中文版【转】
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14474032.html
Copyright © 2011-2022 走看看