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.变量,指定类的一个引用。
/***
* @author: liu_y
* @Date: 2016年7月24日
* @Title:抽象类 、成员内部类、使用this关键字获取内部类与外部类的引用
*/
/******************
* 抽象类
*/
abstract class Fruit {
public String color; // 定义构造方法
public Fruit() {
color = "green";
} // 定义抽象方法
public abstract void harvest();
}
// 继承抽象类Fruit
class Apple extends Fruit {
@Override
public void harvest() {
System.out.println("苹果已经收获!");
}
}
// 继承抽象类Fruit
class Orange extends Fruit {
@Override
public void harvest() {
System.out.println("橘子已经收获!");
}
}
/******************
* 成员内部类学习
*/
class OuterClass {
private String season = "Summer"; class InnerClass {
InnerClass() { // 内部类构造方法
}
public void inf() { // 内部类成员方法
System.out.println("这是内部类成员方法!");
} public int y;
} InnerClass in = new InnerClass(); // 外部类实例化内部类对象 public void ouf() { // 在外部类中调用内部类方法
in.inf();
System.out.println("外部类中调用内部类方法!");
} public InnerClass doit() {
// y=5; //外部类不可以直接访问内部类成员变量
in.y = 7;
season = "Autumn"; // 内部类可以直接访问其所在类的私有成员变量
System.out.println(season);
return new InnerClass();
}
} /***
* 使用this关键字获取内部类与外部类的引用
*/
class China {
private int age = 2016; // 外部类变量
// 内部类 class Beijing {
private int age = 1988; // 内部类变量 public void doit(int age) {
age++;
System.out.println("这是内部类方法中变量" + age);
System.out.println("这是内部类变量" + this.age);
System.out.println("这是外部类变量" + China.this.age);
}
}
} public class Hello5Abstract { public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 抽象类使用
*/
System.out.println("抽象类:");
System.out.println("调用 Apple类的harvest()方法的结果:");
Apple apple = new Apple();
apple.harvest();
System.out.println("调用 Orange类的harvest()方法的结果:");
Orange orange = new Orange();
orange.harvest(); /****
* 内部类----成员内部类
*/
System.out.println("\n内部类:");
// 实例化内部类
OuterClass out = new OuterClass();
out.ouf(); System.out.println("\n调用外部类方法时返回一个内部类实例:");
OuterClass.InnerClass in1 = out.doit(); // 直接new一个内部类实例
in1.inf(); System.out.println("\n直接new一个内部类实例:");
// OuterClass.InnerClass in2=new OuterClass.InnerClass(); //额不可以这样用。。
// 应该使用外部类的对象来创建内部对象,内部类对象会依赖于外部类对象
OuterClass.InnerClass in2 = out.new InnerClass();
in2.inf(); /***
* 使用this关键字获取内部类与外部类的引用
*/
System.out.println("\n使用this关键字获取内部类与外部类的引用:");
China china = new China();
China.Beijing bj = china.new Beijing();
bj.doit(26);
} }
输出结果:
抽象类:
调用 Apple类的harvest()方法的结果:
苹果已经收获!
调用 Orange类的harvest()方法的结果:
橘子已经收获! 内部类:
这是内部类成员方法!
外部类中调用内部类方法! 调用外部类方法时返回一个内部类实例:
Autumn
这是内部类成员方法! 直接new一个内部类实例:
这是内部类成员方法! 使用this关键字获取内部类与外部类的引用:
这是内部类方法中变量27
这是内部类变量1988
这是外部类变量2016
No2_5.类的高级特性_Java学习笔记_抽象类和成员内部类的更多相关文章
- No2_3.接口继承多态_Java学习笔记_多态
***多态***1.多态性:通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态:2.重写之所以具有多态性,是因为父类的方法在子类中被重写,方法名相同,实现功能不同. ...
- No2_1.接口继承多态_Java学习笔记_接口
接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象 ...
- No2_4.接口继承多态_Java学习笔记_经典案例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...
- No2_2.接口继承多态_Java学习笔记_继承
***类的继承***1.继承的实现extends2.[修饰符] class 子类名 extends 父类名{}3.修饰符一般为:public abstract final4.重写是指父子类之间的关系, ...
- Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字
Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字 一丶Java中包的机制 首先包其实就是个文件夹.作用就是管理类. Java中每次定义一个类的时候.通过Java编译之后.都会生 ...
- jQuery源代码学习笔记_工具函数_noop/error/now/trim
jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...
- 第2课第1节_Java面向对象编程_类的引入_P【学习笔记】
摘要:韦东山android视频学习笔记 1. 面向对象编程的引入,我们先写一个简单的程序输出张三,李四的名字.代码如下,假如,现在我们要在名字前面添加籍贯广东,那样岂不是每个printf语句都得修改添 ...
- 《JavaScript高级程序设计》学习笔记12篇
写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...
- 《unix环境高级编程》学习笔记【原创】
本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...
随机推荐
- 针对AJAX与JSONP的异同
针对AJAX与JSONP的异同 1.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架 ...
- flask开发restful api系列(1)
在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还 ...
- Python socket 广播信息到所有连接的客户端
Python3,多线程,多客户端,广播数据 #!/usr/bin/env python3 import time import threading import queue import socket ...
- 二维指针*(void **)的研究(uC/OS-II案例) 《转载》
uC/OS-II内存管理函数内最难理解的部分就是二维指针,本文以图文并茂的方式对二维指针进行了详细分析与讲解.看完本文,相信对C里面指针的概念又会有进一步的认识. 一.OSMemCreate( ) 函 ...
- sql基础复习
--.while循环 declare @sum int declare @i int ) begin set @sum =@sum+@i ) print @i end print @sum --.go ...
- android slidingview
http://blog.csdn.net/sky181772733/article/details/6969810 http://blog.csdn.net/ithomer/article/detai ...
- QTabWidget添加自定义样式
一.参考文章:http://bbs.csdn.net/topics/390632657?page=1 setStyleSheet("QTabWidget::pane{border-width ...
- SQL使用单引号
SQL> select 'xxxx'oooo' from dual; ERROR: ORA-01756: quoted string not properly terminated SQL> ...
- BZOJ2697: 特技飞行
2697: 特技飞行 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 607 Solved: 363[Submit][Status] Descript ...
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...