Java面向对象程序设计(进阶)

天外天工作室移动-Android 组新人培训 #4

  1. static 关键字
    static 关键字可用来修饰类的成员,包括成员方法和成员变量,static 成员也可以被称作静态成员或者类成员。可以通过像非静态成员一样通过对象访问,也可以直接通过类名访问。

    • static 成员变量
      在之前的例子中可以看到,每个对象各自占有一个非静态成员变量,与之相对应,静态成员变量为类、该类的所有对象所共享 ,且只在该类被初次加载时被初始化。
      e.g. 我们在 Apartment 类中定义一个静态成员变量叫做 totalViewer,用于统计查询过用我们的类建造的房子人次,默认值为0。然后悄悄在 getSize() 方法中加入统计的逻辑,也就是让 totalViewer 加一。

      public class Apartment {
      
          private int size;
          public static int totalViewer = 0;
      
          public Apartment(int size) {
              this.size = size;
          }
      
          public int getSize() {
              ++totalViewer;
              return size;
          }
      
      }
      

      然后在外部不管是 Apartment 类的哪个对象调用了 getSize() 方法,都会使同一个 totalViewer 变量自增。

       Apartment a1 = new Apartment(200);
       a1.getSize();
       a1.getSize();
      
       System.out.println(a1.totalViewer);
       System.out.println(Apartment.totalViewer);
      
       Apartment a2 = new Apartment(300);
       a2.getSize();
       a2.getSize();
       System.out.println(a2.totalViewer);
       System.out.println(Apartment.totalViewer);
      

      输出结果为2和4(通过对象或者类名都可以对静态成员变量进行访问)。

    • static 成员方法
      像静态成员变量一样,静态成员方法也可以通过像非静态成员方法一样通过对象访问,或者直接通过类名访问。
      因为在外部可以不创建对象、直接使用类名对静态成员方法进行访问,所以静态成员方法中不存在this指针。
      静态成员方法中不能访问非静态成员,但是非静态成员方法中可以访问静态成员。
      在 Android 开发中,很多工具类中的工具方法都是以静态方法的形式实现的。

  2. 内部类
    嵌套在类中的类叫做内部类,当外部类中的某个属性过于复杂时可以使用内部类,内部类的对象可以使用 obj.new 字符进行实例化,内部类可能会破坏良好的代码结构,但是内部类的优势是可以访问外部类的成员。

    public class Apartment {
    
        private int size;
        public static int totalViewer = 0;
    
        public Apartment(int size) {
            this.size = size;
        }
    
        public int getSize() {
            ++totalViewer;
            return size;
        }
    
        public static int getTotalViewer() {
            return totalViewer;
        }
    
        class Location {
            City city;
            String street;
            int number;
            int floor;
            boolean faceEast;
    
            public Location(City city, String street, int number, int floor, boolean faceEast)  {
                this.city = city;
                this.street = street;
                this.number = number;
                this.floor = floor;
                this.faceEast = faceEast;
            }
    
            public City getCity() {
                ++totalViewer;
                return city;
            }
    
            public String getStreet() {
                ++totalViewer;
                return street;
            }
    
            public int getNumber() {
                ++totalViewer;
                return number;
            }
    
            public int getFloor() {
                ++totalViewer;
                return floor;
            }
    
            public boolean isFaceEast() {
                ++totalViewer;
                return faceEast;
            }
        }
    }
    

    调用:

      Apartment apartment = new Apartment(300);
      Apartment.Location location = apartment.new Location(City.BEIJING,"Chang'An",305,3,true);
    
  3. 抽象类和抽象方法
    抽象方法就是只有声明没有实现的方法,由继承抽象类的子类来实现具体的抽象方法,抽象方法用 abstract 关键字来修饰。
    在面向对象程序设计的思想中,对象都是由类来实例化的,但是不是所有的类都可以用来实例化对象,如果一个类中的没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,抽象类用 abstract 关键字来修饰,且抽象方法不能是 private 的。
    包含抽象方法的类肯定是抽象类,但是抽象类中的方法不一定都是抽象方法。

代码来源

本文出现的代码是接着上篇文章的小 demo 写的

  • staticeg 分支:静态成员的示例
  • innerclass 分支:内部类示例
  • abstract 分支:抽象类和抽象方法示例
    GitHub 源码地址

作业

18191 移动 - Android 组第 4 次作业
请按时完成并上交。

再学好这些,你就掌握了入门 Android 开发的 Java 语言基础了!

  1. 接口
  2. 匿名内部类
  3. 异常处理
  4. 多线程
  5. lambda表达式*
  6. 反射机制*
  7. 注解机制*
    * 较难,可以说是深入学习 Java 语言了

推荐 Java 学习网络资源或网站

  1. 极客学院Java wiki
  2. 慕课网
  3. 掘金
  4. 最重要的还是学会使用搜索引擎寻找自己想学或者不会的内容,能科学上网用Google,不能科学上网可以使用Bing或百度。

大公司的 Java 编程规范

  1. Google Java Style (中文版)
  2. 阿里巴巴Java开发手册(终极版)pdf

联系作者

Gmail: [email protected]
请斧正!

参考文档

  1. Java 中的接口和抽象类(转)
  2. Java 中的内部类总结
  3. Java 中的 static 关键字解析

你可能感兴趣的:(Java面向对象程序设计(进阶))