Java学习之内部类
示例1:
package com.swust.面向对象;
class Person1{
private String username="zhangsan";
public Person1(){
System.out.println("Person created......");
}
public String name ="";
class Student{
public Student(){
System.out.println("Student created......");
}
public String username="lisi";
public void show(){
System.out.println(this.getClass().getName());
System.out.println(username);
}
}
}
class Person2{
private static String username = "lisi";
static class Student{
public void show(){
System.out.println(username);
}
}
}
class Person3{
private static String useranme="wangwu";
static class Student{
public static void show(){
System.out.println(useranme);
}
}
}
public class Example2{
public static void main(String[] args) {
// // person.show();
// //内部类为静态类
// Person2.Student person2 = new Person2.Student();
// person2.show();
// 由于内部类持有外部类的引用,因而可以访问外部类的成员变量 // Person3.Student.show();
了
Person1.Student person = new Person1().new Student();
person.show();
}
}
对于内部类的访问分为如下情况:
(1)普通情况下,访问内部类必须如下格式 : Person1.Student person = new Person1().new Student();
(2)内部类的方法为静态方法,Person3.Student person3 = new Person3.Student();
(3 局部内部类无法访问方法中的普通变量,将该变量设置为final,常量类型,由于方法调用结束的时候所要调用的参数就消失了,而对该参数添加final修饰符修饰后就变成常量,存储位置发生变化,存储在常量池中
示例2:
package com.swust.面向对象;
abstract class Base{
public abstract void show();
} class Student{
private static int age = 4;
public static void show(){
new Base(){
@Override
public void show() {
System.out.println("匿名内部类……"+age);
}
}.show();;
}
}
public class Example4 {
public static void main(String[] args) {
Student.show();
}
}
匿名内部类:内部类的简写形式,其实就是一个匿名子类对象,但是有前提,就是该内部类必须实现继承外部类或者实现一个接口
new Base(){
@Override
public void show() {
System.out.println("匿名内部类……"+age);
}
}
整条语句相当于创建一个匿名内部类的对象
示例3:
interface People{
void show1();
void show2();
}
class Example{
public void show(){
new People(){
public void show1(){
System.out.println("show1 execute……");
}
public void show2(){
System.out.println("show2 execute……");
}
}.show1();
new People(){
public void show1(){
System.out.println("show1 execute……");
}
public void show2(){
System.out.println("show2 execute……");
}
}.show2();
}
}
public class Example5 {
public static void main(String[] args) {
Example example = new Example();
example.show();
}
}
匿名内部类的使用场景:当函数参数是接口类型的时候,而且接口中的方法不超过三个,这时候可以利用匿名内部类作为实际参数进行传递
示例4:
package com.swust.面向对象;
class Dog{
public void show(){
new Object(){
public void show(){
System.out.println("匿名内部类执行……");
}
}.show();;
}
public void message(){
Object object = new Object(){
public void show(){
System.out.println("匿名内部类执行………………");
}
};
}
}
public class Example6 {
public static void main(String[] args) {
new Dog().show();
}
}
在这里不能执行:object.show()语句,由于上面语句类似于将匿名内部类子类对象进行向上转型,转换为Object对象,而Object对象中没有show方法
Java学习之内部类的更多相关文章
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...
- Java系列之内部类
今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类.成员内部类.匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下: 概述 静态内部类 成员内部类 匿名内部 ...
- 黑马程序员——JAVA基础之内部类,匿名内部类
------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: • 内部 ...
- Java面向对象之内部类(访问格式)
一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...
- [内部类] java笔记之内部类
1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...
- Java面向对象之内部类(匿名内部类)
一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...
- java学习笔记9--内部类总结
java学习笔记系列: java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对 ...
- java之内部类
最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
随机推荐
- 如何显示Mac OS X上的隐藏文件和文件夹
显示隐藏文件以及文件夹命令: defaults write com.apple.finder AppleShowAllFiles YES Mac显示隐藏文件 对于OS X Mavericks 10.9 ...
- [Ext JS 4] Grid 实战之分页功能
前言 分页功能的实现有两种途径: 一种是服务端分页方式, 也就是web客户端传递页码参数给服务端,服务端根据页面参数返回指定条数的数据.也就是要多少取多少.这种方式比较适合Grid 的数据量很大,需 ...
- mysql错误-更改mysql.sock位置
于Mysql在有时会出现mysql.sock定位误差,会造成不连接数据库. mac由当时的误差: 第一个变化my.cnf 位置/etc/my.cnf下一个,如果没有,那么.跟/usr/locate/m ...
- Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
Pat1043代码 题目描写叙述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the f ...
- 【WorkTile赞助】jQuery编程挑战#009:生成两个div元素互相追逐的动画
HTML页面: <!-- HTML代码片段中请勿添加<body>标签 //--> <div id="container"> <div id ...
- 基于Jquery的Ajax分页,只有上一页和下一页
最近项目中用到ajax分页 在网上找到一个非常好用的分页插件jquery-pagination-ajax,以下是链接 http://www.zhangxinxu.com/wordpress/2010/ ...
- linq中的cast<T>()及OfType<T>()
DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.R ...
- 基于HTTP协议下载文件的实现
最近在开发文件下载的程序,该程序是基于HTTP开发的. 首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能. 自己构造的HTTP包如下: GET /*********.rar ...
- BZOJ 2946: [Poi2000]公共串( 后缀自动机 )
一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...
- C++中的string
要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...