java提升一:内部类
1、总体定义
定义在一个类中的类,就称之为内部类。
2、为什么要使用内部类
(1)使用匿名内部类,无需对只使用一次的接口实现类进行创建,方便了对于接口和抽象类的实现及其使用。
(2)每个内部类都可以独立的继承一个(接口)的实现,所以无论外部类是否已经继承了某个接口的实现对于内部类都没有影响。简单来说,内部类实现了java中的多重继承。
3、内部类的分类和使用
3.1、成员内部类
成员内部类即所定义内部类作为外部类的一个成员变量。成员内部类的特点如下:
(1)内部类随意访问外部类,外部类必须通过实例化来访问内部类;
(2)成员内部类中不能存在任何static的变量和方法;
(3)成员内部类的创建必须依附于外部类;
成员内部类的创建方式:
外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称()
成员内部类的使用:
(1) 间接方式:在外部类的方法中使用内部类,通过调用外部类的方法来使用内部类;
(2) 直接方式:先创建再使用;
代码示例
public class Insertclass {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   //成员内部类的间接使用方法
    public void methodBody(){
        System.out.println("外部类");
        //外部类中使用内部类
        Heart h=new Heart();
        h.beat();
    }
    //成员内部类
    public class Heart{
        public void beat(){
            System.out.println("心脏跳动");
            System.out.println("我叫"+name);
        }
    }
}
3.2、局部内部类
局部内部类即所定义内部类定义在外部类的方法中。局部内部类的特点如下:
局部内部类只能在定义了该内部类中的方法中被使用。
成员内部类的创建方式:
外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()
代码示例
public class Insertclass {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void methodOuter(){
        //局部内部类
        class Inner{
            int num=10;//必须为有效final
            public void show(){
                System.out.println(num);
            }
        }
    }
}
3.3、静态内部类
使用static关键字进行修饰的内部类称之为静态内部类,或者嵌套内部类。静态内部类的特点如下:
(1)静态内部类的创建不需要依附于外部类
(2)静态内部类由static修饰,故而只能调用外部类中由static修饰的变量和方法
静态内部类的创建方式:
    外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()
代码示例
public class OutClassTest {
    static int a;
    int b;
    public static void main(String[] args) {
     	// new一个外部类
        OutClassTest oc = new OutClassTest();
        // 不依赖于外部类实例,直接实例化内部静态类
        OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
        // 调用静态内部类的非静态方法
        System.out.println(inner.getValue());
    }
    //静态内部类
    private static class InnerStaticClass {
        // 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
        private static String static_value = "0";
        private int flag = 0;
        //静态内部类方法
        public InnerStaticClass() {
            System.out.println("InnerClass create a:" + a);
            // 静态内部类不能够访问外部类的非静态成员
            // System.out.println("InnerClass create b:" + b);
            System.out.println("InnerStaticClass flag is " + flag);
            System.out.println("InnerStaticClass tt is " + static_value);
        }
        public int getValue() {
            // 静态内部类中的非静态方法
            test();
            return 1;
            }
        }
      }
其实到此处,内部类的分类就已经结束,但对于局部内部类中的匿名内部类由于使用较多,需要着重介绍一下。
3.4、匿名内部类
匿名内部类是一种特殊的局部内部类,它可以在不创建新类的条件下对于现有接口(或者抽象类)进行实现。匿名内部类的特点如下:
(1) 匿名内部类没有访问修饰符。
(2) 匿名内部类对于类的实例化,没有任何变量名称,这就导致匿名内部类所定义的类在保证简便的同时有着不可复用的缺点。
(3)匿名内部类中不能存在任何静态变量和静态方法。
(4)匿名内部类中不能定义构造函数。
匿名内部类的创建方式:
new 现有接口名称{ 接口中需要实现的内容 }
代码示例
interface MyInterface{
    public void show();
}
public class AnymiousClass {
    public static void main(String[] args){
        //使用局部内部类之匿名内部类
        MyInterface obj=new MyInterface() {
            @Override
            public void show(){
                System.out.println("匿名内部类实现了方法");
            }
        };
        //匿名内部类实现的接口实体类
        new MyInterface() {
            @Override
            public void show(){
                System.out.println("匿名内部类实现了方法");
            }
        }.show();
    }
}
4、内部类的注意事项
(1)内用外,随意调用;外用内,需要内部类对象;
(2)局部内部类引用局部变量,这个局部变量必须是有效final的,也即是必须要被final关键字修饰的。
原因:new出来的对象在堆内存中,而局部变量跟随方法在栈内存中。方法运行结束立即出栈,局部变量消失。 new的对象会保持在堆中,直到垃圾回收时才消失。
此时要保证栈中的对象的功能正常,就必须保证对象所引用的局部变量的生存周期和对象的相同,故而使用局部变量必须是有效final的。
java提升一:内部类的更多相关文章
- [java] 深入理解内部类: inner-classes
		
[java] 深入理解内部类: inner-classes // */ // ]]> [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...
 - Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
		
Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...
 - java基础之 内部类
		
Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...
 - atitit groovy 总结java 提升效率
		
atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3. 添加 Groovy 类 2 4. 编译运行groovy类 ...
 - java 笔记(2) ——  内部类的作用
		
一.内部类简介 个人觉得内部类没多少研究价值,GUI中的事件响应算是非常典型的应用了. Java内部类其实在J2EE编程中使用较少,不过在窗口应用编程中特别常见,主要用来事件的处理.其实,做非GUI编 ...
 - Java基础(53):内部类(转)
		
java中的内部类总结 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行 ...
 - JAVA 第二天 内部类
		
package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件 ...
 - Java提升篇之反射的原理(二)
		
Java提升篇之通过反射越过泛型检查 /* *问题:在一个ArrayList<Integer>对象中,在这个集合中添加一个字符串. */ 在我们还没有学反射前,遇到这个问题都是无法实现的, ...
 - Java提升篇之反射的原理
		
Java提升篇之反射的原理 1.构造方法的反射 import java.lang.reflect.Constructor; public class ReflectConstructor { publ ...
 - Java 中的内部类
		
前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...
 
随机推荐
- Mybatis之foreach用法----List、Array、Map三种类型遍历
			
在mybatis的xml文件中构建动态sql语句时,经常会用到标签遍历查询条件.特此记录下不同情况下书写方式!-------仅供大家参考------ 1. foreach元素的属性 collectio ...
 - PageObject
			
import org.openqa.selenium.WebDriver; import org.openqa.selenium.ie.InternetExplorerDriver; import o ...
 - 第1节 Scala基础语法:13、list集合的定义和操作;16、set集合;17、map集合
			
list.+:5 , list.::5: 在list集合头部添加单个元素5 : li1.:+(5):在list集合尾部添加单个元素5: li1++li2,li1:::li2:在li1集合尾部添加il2 ...
 - day21-Python运维开发基础(单个字符匹配 / 多字符匹配)
			
1. 正则表达式(单个字符匹配) # ### 正则表达式 => 单个字符匹配 import re """ lst = re.findall(正则表达式,字符串) & ...
 - P1120/UVA307 小木棍(sticks) 题解
			
题目描述 pdf 题解 注意的问题是,各个原始木棒的长度都是一样的! 说一下本题的总思路即:DFS+超强力剪枝!(详见本人的 AC 程序) 首先,我们要从小到大枚举原始木棒的长度len,也就是枚举答案 ...
 - centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
			
系统环境:centos7.7 (VMware中) 镜像image 版本:jenkins/jenkins (截止2020.01.10最新版) 参考文章:https://www.jianshu.com/p ...
 - 「CF852D」Exploration Plan
			
题目描述 给定一张 \(V\) 个点,\(M\) 条边的边带权无向图,有 \(N\) 个人分布在图上的点上,第 \(i\) 个人在 \(x_i\) 这个点上,定义从一个点走到另一个点的时间为所走的路径 ...
 - Centos7 nginx的负载均衡概念与配置
			
一.负载均衡概念 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单 ...
 - FLASK - 请求和响应
			
请求都封装在request对象里面了 from flask import Flask from flask import request from flask import render_templa ...
 - nmap 速查命令
			
进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测) nmap -sP 192.168.1.0/24 仅列出指定网络上的每台主机,不发送任何报文到目标主机 nam ...