• No2_5.类的高级特性_Java学习笔记_抽象类和成员内部类


    一、抽象类
    1.所谓抽象类,只声明方法的存在而不去实现它的类;
    2.抽象类不能被实例化,即不能实现其对象;
    3.abstract class 类名{ 类体 }
    4.包含一个或多个抽象方法的类必须声明成抽象类;
    5.abstract <方法返回值类型> 方法名(参数列表)

    二、内部类
    1.如果在一个类中再定义一个类,就将在类中定义的那个类称为内部类;
    2.内部类分为成员内部类,局部内部类以及匿名内部类;
    3.成员内部类:
      a.可以在内部类中直接存取其所在类的私有成员变量;
      b.外部类不可以直接访问内部类成员变量;
      c.public class OuterClass{
      private class InnerClass{
      }
      }
      d.内部类中可以随意使用外部类的成员方法及成员变量,尽管变量修饰为private。
      e.内部类的实例一定要绑定在外部类的实例上,如果在外部类初始人一个内部类对象,那么内部类对象就会绑定在外部类对象上。
      f.如果在外部类和非静态方法之外实例化内部类对象,需要使用“外部类.内部类”的形式指定该对象的类型;
      g.在实例化内部类对象时,不能在new操作符之前使用外部类名称那种形式实例化内部类对象,而是应该使用外部类的对象来创建内部对象;
      h.内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象;

    4.使用this关键字获取内部类与外部类的引用
      a.如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字;
      b.例如在内部类中使用this.变量,可以调用内部类的成员变量x;类名.this.变量,指定类的一个引用。

      

      1 /*** 
      2  * @author: liu_y
      3  * @Date: 2016年7月24日
      4  * @Title:抽象类 、成员内部类、使用this关键字获取内部类与外部类的引用
      5  */
      6 /******************
      7  * 抽象类 
      8  */
      9 abstract class Fruit {
     10     public String color;
     11 
     12     // 定义构造方法
     13     public Fruit() {
     14         color = "green";
     15     }
     16 
     17     // 定义抽象方法
     18     public abstract void harvest();
     19 }
     20 // 继承抽象类Fruit
     21 class Apple extends Fruit {
     22     @Override
     23     public void harvest() {
     24         System.out.println("苹果已经收获!");
     25     }
     26 }
     27 // 继承抽象类Fruit
     28 class Orange extends Fruit {
     29     @Override
     30     public void harvest() {
     31         System.out.println("橘子已经收获!");
     32     }
     33 }
     34 /******************
     35  * 成员内部类学习
     36  */
     37 class OuterClass {
     38     private String season = "Summer";
     39 
     40     class InnerClass {
     41         InnerClass() { // 内部类构造方法
     42         }
     43         public void inf() { // 内部类成员方法
     44             System.out.println("这是内部类成员方法!");
     45         }
     46 
     47         public int y;
     48     }
     49 
     50     InnerClass in = new InnerClass(); // 外部类实例化内部类对象
     51 
     52     public void ouf() { // 在外部类中调用内部类方法
     53         in.inf();
     54         System.out.println("外部类中调用内部类方法!");
     55     }
     56 
     57     public InnerClass doit() {
     58         // y=5; //外部类不可以直接访问内部类成员变量
     59         in.y = 7;
     60         season = "Autumn"; // 内部类可以直接访问其所在类的私有成员变量
     61         System.out.println(season);
     62         return new InnerClass();
     63     }
     64 }
     65 
     66 /***
     67  * 使用this关键字获取内部类与外部类的引用
     68  */
     69 class China {
     70     private int age = 2016; // 外部类变量
     71     // 内部类
     72 
     73     class Beijing {
     74         private int age = 1988; // 内部类变量
     75 
     76         public void doit(int age) {
     77             age++;
     78             System.out.println("这是内部类方法中变量" + age);
     79             System.out.println("这是内部类变量" + this.age);
     80             System.out.println("这是外部类变量" + China.this.age);
     81         }
     82     }
     83 }
     84 
     85 public class Hello5Abstract {
     86 
     87     public static void main(String[] args) {
     88         // TODO Auto-generated method stub
     89         /**
     90          * 抽象类使用
     91          */
     92         System.out.println("抽象类:");
     93         System.out.println("调用 Apple类的harvest()方法的结果:");
     94         Apple apple = new Apple();
     95         apple.harvest();
     96         System.out.println("调用 Orange类的harvest()方法的结果:");
     97         Orange orange = new Orange();
     98         orange.harvest();
     99 
    100         /****
    101          * 内部类----成员内部类
    102          */
    103         System.out.println("
    内部类:");
    104         // 实例化内部类
    105         OuterClass out = new OuterClass();
    106         out.ouf();
    107                 
    108         System.out.println("
    调用外部类方法时返回一个内部类实例:");
    109         OuterClass.InnerClass in1 = out.doit(); // 直接new一个内部类实例
    110         in1.inf();
    111         
    112         System.out.println("
    直接new一个内部类实例:");
    113         // OuterClass.InnerClass in2=new OuterClass.InnerClass(); //额不可以这样用。。
    114         // 应该使用外部类的对象来创建内部对象,内部类对象会依赖于外部类对象
    115         OuterClass.InnerClass in2 = out.new InnerClass();
    116         in2.inf();
    117 
    118         /***
    119          * 使用this关键字获取内部类与外部类的引用
    120          */
    121         System.out.println("
    使用this关键字获取内部类与外部类的引用:");
    122         China china = new China();
    123         China.Beijing bj = china.new Beijing();
    124         bj.doit(26);
    125     }
    126 
    127 }

    输出结果:

     1 抽象类:
     2 调用 Apple类的harvest()方法的结果:
     3 苹果已经收获!
     4 调用 Orange类的harvest()方法的结果:
     5 橘子已经收获!
     6 
     7 内部类:
     8 这是内部类成员方法!
     9 外部类中调用内部类方法!
    10 
    11 调用外部类方法时返回一个内部类实例:
    12 Autumn
    13 这是内部类成员方法!
    14 
    15 直接new一个内部类实例:
    16 这是内部类成员方法!
    17 
    18 使用this关键字获取内部类与外部类的引用:
    19 这是内部类方法中变量27
    20 这是内部类变量1988
    21 这是外部类变量2016
  • 相关阅读:
    c/c++ linux 进程间通信系列7,使用pthread mutex
    c/c++ linux 进程间通信系列6,使用消息队列(message queue)
    c/c++ linux 进程间通信系列5,使用信号量
    eos 创建两对的公钥和私钥, 钱包,交易所转账到主网,主网到交易所
    c/c++ linux 进程间通信系列4,使用共享内存
    python基础-网络编程part02
    idea新建项目相关名词意义
    idea中当前模块资源目录上显示属于其他模块
    centos下安装rabbitmq
    JAVA中值传递,引用传递
  • 原文地址:https://www.cnblogs.com/sunshine-habit/p/5700063.html
Copyright © 2020-2023  润新知