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运行时环境中,对于任意 ...
随机推荐
- 转载文章:Windows Azure 七月份更新:SQL 数据库、流量管理器、自动伸缩、虚拟机
转载文章:Windows Azure 七月份更新:SQL 数据库.流量管理器.自动伸缩.虚拟机 今天上午,我们发布了一些重大的 Windows Azure 更新.这些新的增强功能包括: · SQL 数 ...
- [Android]The connection to adb is down, and a severe error has occured.
在Android开发时,有时我们开启虚拟机执行程序时.会报类似下面错误: [2015-07-19 15:08:29 - TestXiaoYanLibrary] The connection to ad ...
- linux 使用sudo开放普通用户权限
整理一下以前写的东东,刚才又忘了- ---------------------------------------------------------------------------------- ...
- HTTP的报文格式解析
一.概述 http报文是面向文本的,报文中每一个字段都是一些ASCII码串,各个字段的长度是不确定的.http有两类报文:请求报文 响应报文 二.请求报文 一个http请求报文由 请求行(reque ...
- 2.1确定一个char包含何种字符
知识点: 1.char.IsControl 2.char.IsPunctuation 3.char.IsSurrogate 4.char.IsWhitespace 5.char.IsDigit 6.c ...
- Jar包下载地址
Download Apache log4j 1.2.17下载: http://logging.apache.org/log4j/1.2/download.html jsoup http://jsoup ...
- 在OS X 10.10系统上安装Navicat Premium中文破解版11.0.16教程
此链接是Navicat Premium中文破解版11.0.16安装包里面并带有中文汉化包 http://pan.baidu.com/s/1ntjz6HF#path=%252F 一.Navicat Pr ...
- SQLserver数据库操作帮助类SqlHelper
1 SqlHelper源码 using System; using System.Data; using System.Xml; using System.Data.SqlClient; using ...
- Oracle集合操作函数:union、intersect、minus
[转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINU ...
- linux杂记(?)命令别名——alias
linux中的命令别名--alias linux中的命令别名--alias 1. 用命令alias可以查询系统中有哪些可用的命令别名 2.添加命令别名 回车查看, 别名建立成功 3.查询命令的地址ty ...