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运行时环境中,对于任意 ...
随机推荐
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(七)
目标: 1. 完成最终的设备驱动,增加具体的watchdog设备操作的代码. 测试代码: 代码最终实现见cwd_demo.c 代码只实现了read与write. 没有实现ioctl. 因此,我们可以 ...
- sqoop安装与使用
sqoop简介 sqoop名字是怎么来的?Sqoop: SQL-to-Hadoop 连接传统数据库和hadoop的桥梁,把关系型数据库的数据导入到hadoop系统(如HDFS,HBASE和hive中) ...
- 《UML和模式应用》重点之思想篇
本书是帮助开发人员和学生学习面向对象分析和设计(OOA/D)的核心技能的重要工具. UML不是OOA/D.也不是方法,仅仅是图形表示法,假设没有真正掌握怎样创建优秀的面向对象设计,或者怎样评估和改进现 ...
- 什么是xss盲打
什么是xss盲打? 盲打仅仅是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式, ...
- JavaScript值延迟脚本和异步脚本
Html 4.0为<script>标签定义了defer属性,这个属性的用途是表名脚本在执行时,不会影响页面的构造.也就是说,脚本会延迟到整个页面解析完毕之后在运行,因此,在<scri ...
- SQL学习之组合查询(UNION)
1.大多数的SQL查询只包含从一个或多个表中返回数据的单条SELECT语句,但是,SQL也允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回.这些组合查询通常称为并或复合查询. ...
- tigervnc*
yum install -y tigervnc* tigervnc-server vncserver www.webmin.cn http://blog.sina.com.cn/s/blog_4ba5 ...
- BZOJ 4199: [Noi2015]品酒大会( 后缀数组 + 并查集 )
求出后缀数组后, 对height排序, 从大到小来处理(r相似必定是0~r-1相似), 并查集维护. 复杂度O(NlogN + Nalpha(N)) ------------------------- ...
- [非技术参考]C#重写ToString方法
C# 中的每个类或结构都隐式继承 Object 类. 因此,C# 中的每个对象都会获得 ToString 方法,此方法返回该对象的字符串表示形式. 例如,所有 int 类型的变量都有一个 ToStri ...
- centos 安装mysql密码修改后还是不能连接的原因
centos 上安装mysql密码修改后还是不能连接出现错误:ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for ...