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("\n内部类:");
104         // 实例化内部类
105         OuterClass out = new OuterClass();
106         out.ouf();
107
108         System.out.println("\n调用外部类方法时返回一个内部类实例:");
109         OuterClass.InnerClass in1 = out.doit(); // 直接new一个内部类实例
110         in1.inf();
111
112         System.out.println("\n直接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("\n使用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
时间: 2024-10-18 16:15:39

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

No2_3.接口继承多态_Java学习笔记_多态

多态: 1 /** 2 * 3 * @author 作者:sunshine 4 * @date 创建时间:2016年7月4日 下午5:22:19 5 */ 6 7 class Calculate{ 8 final float PI=3.14f; 9 //求圆形的面积 10 public float getArea(float r){ 11 float area=PI*r*r; 12 return area; 13 } 14 //求矩形的面积 15 public float getArea(flo

No2_1.接口继承多态_Java学习笔记_接口

接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象的依存关系: 4.接口:Java中类可以实现多个接口,被用来建立类与类之间的标准: ***接口***1.接口的目的:Java语言只支持单继承,即一个类只能有一个父类.实际应用中,经常需要多继承解决问题,为解决该问题,提供接口实现类的多重继承:2.接口定义:与类的定义类似,接口的声明和接口体:[修饰符

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

1.毕老师第十四天内容,线程间的通信.大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的. 涉及到的方法: wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒.只能在同步方法中被调用. notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态.只能在同步方法和同步代码块中被调用. notifyAll():接触所有在该对象上调用wait()方法的

No2_2.接口继承多态_Java学习笔记_继承

***类的继承***1.继承的实现extends2.[修饰符] class 子类名 extends 父类名{}3.修饰符一般为:public abstract final4.重写是指父子类之间的关系,子类的方法名与父类的方法名相,那么子类就不能继承父类的方法,称子类的方法重写了父类的方法.5.重写体现了子类补充或者改变父类方法的能力.通过重写,可以使一个方法在不同的子类中表现出不同的行为:6.重写民可以称为覆盖: ***使用super关键字***1.子类可以继承父类的非私有成员变量和成员方法(非

2016年4月2日_JAVA学习笔记_上午

1.昨天晚上忘记发布就直接关机了,算了.本就没写多少. 2.包这个小节还有类路径看书看的我一头雾水. 3.昨天看毕老师视频时讲到了类的四个权限等级,从封装性最好到最开放依次是,private,默认,protected,public. private:仅允许当前类进行访问: 默认:允许当前类和当前包进行访问: protected:允许当前类和当前包,以及其他包中的子类: public:允许所有人进行访问 4.在shell命令运行java时,需要注意类路径,如果当前目录下没有找到,会在classpa

2016年4月16日_JAVA学习笔记_第六章克隆

1.克隆也就是创建一个变量的拷贝,两者相互独立. person p = new person(); person p1 = p; //仅仅是重新创建另外一个变量,引用的是同一个东西 person p_clone = p.clone();//创建上一个变量的克隆,两者没有关系 2.

2016年4月20日_JAVA学习笔记_多线程

1.感觉书里的东西没什么意思了,继续来看毕老师的视频好了.今天家里就剩我一个人了,可以出去吃饭了. 2.程序中每一个任务称为一个线程,同时可以控制多个任务的程序称为多线程程序.与多进程(进程也就是WIN任务管理器中的)的区别在于,进程之间是独立的,不共享数据,而线程是共享数据的,同时线程更加简单,轻量,最后一个进程中可以有多个线程. 3.在多个线程运行的过程中,线程间的切换是由CPU控制的,这个切换是随机的.JVM的运行时就包含了多个线程.

No2_4.接口继承多态_Java学习笔记_经典案例

1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 5 /** 6 * @title 接口继承多态的经典范例 7 * @author 作者:sunshine yaqingl 8 * @date 创建时间:2016年7月6日 下午5:27:39 9 */ 10 11 //使用Comparable接口自定义排序 12 class Employee implements Com

2016年4月2日_JAVA学习笔记_下午

1.一个重要的知识点:子类不能直接访问超类中的私有成员. 2.如果子类的构造器没有显式的调用超类的构造器,则将自动的调用超类默认的构造器(无参数).如果超类没有无参数构造器,并且子类构造器又没有调用超类的其他有参数构造器,那么将编译失败. 3.一个对象变量可以指示(引用)多种实际类型的现象被称为多态.在运行时能够自动选择调用哪个方法的现象称为动态绑定(调用的是实际引用对象的方法). 4.在一个包中直接运行对应的.class文件是不可行的.只能在包所在路径运行 java myBao.myClass