JAVA内部类使用

一、什么是内部类?

  一个类的定义放在另一个类的内部,这个类就叫做内部类

二、内部类有那些特性?

  1、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
  2、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
  3、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

三、内部类有哪几种?

  1.成员内部类

如:
 1 package com.test01;
 2 
 3 public class A {
 4     // 内部类 B 继承 TestPojo 和实现 TestInterface 接口
 5     class B extends TestPojo implements TestInterface{
 6         //内部类 B 自己的方法
 7         public void run(){
 8             System.out.println("我正在跑!");
 9         }
10         //重写的接口方法
11         public void testf() {
12             System.out.println("实现接口!");
13         }
14     } 
15     // 方法里面调用内部类
16     public  void test(){
17         B b = new B() ;
18         b.testf() ;        // 掉用重写接口方法
19         b.run() ;         // 调用自己的方法
20         b.testpojo() ;     // 调用继承父类的方法
21     }
22     // main 方法测试
23     public static void main(String[] args) {
24         A a = new A() ;
25         a.test() ;
26     }
27 }
28 // 定义了一个接口 ,方法为testf() 
29 interface TestInterface{
30     public void testf() ;
31 }
32 // 定义了一个普通类  方法testpojo() 
33 class TestPojo{
34     public void testpojo(){
35         System.out.println("我是简单的pojo类");
36     }
37 }
38 // 实现 调用内部类里面的方法
39 class Textone{
40     public static void main(String[] args) {
41         A.B b = new A().new B() ;    //调用类A里面的内部类B
42         /** 等同于 下面代码
43          *         A a = new A() ;
44          *         A.B b = a.new B() ;
45          * */
46         b.testf() ;      // 掉用重写接口方法
47         b.run() ;        // 调用自己的方法
48         b.testpojo() ;   // 调用继承父类的方法
49     }
50 }

  2、方法内部类

 1 package com.test01;
 2 
 3 public class PerTest {
 4     public void test(){         // 定义一个方法
 5         class Ne{                // 定义一个方法内部类
 6             public void fle(){    // 定义方法内部类的方法 
 7                 System.out.println("我正在飞翔!");
 8             }
 9         } ;
10         new Ne().fle() ;        //调用内部类的方法
11     }
12     public static void main(String[] args) {
13         new PerTest().test() ;    //测试
14     }
15 }  

  注意: (1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
      (2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。        

      因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,
      局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
      例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变
      量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。 (该理解来源于百度百科)

   3、匿名内部类

      1)、抽象匿名内部类

        

 1 package com.anonymous;
 2 
 3 public class AbstractClass {
 4     public void test(){                //方法为test
 5         TestA a = new TestA(){        //实现抽象类
 6             @Override
 7             public void run() {        //实现抽象类的方法
 8                 System.out.println("我正在使用抽象匿名内部类");
 9             }
10         } ;
11         a.run() ;                    //调用内部类的方法
12     }
13     public static void main(String[] args) {
14         new AbstractClass().test() ;    //测试
15     }
16 }
17 //定义一个抽象类 TestA  抽象方法为run()
18 abstract class TestA{
19     public abstract void run() ;
20 }

    2)、接口匿名内部类

 1 package com.anonymous;
 2 
 3 public class TestAnonymous {
 4     MyInterface m = new MyInterface(){    //实现接口
 5         public void eat() {                //重写MyInterface 接口方法
 6             System.out.println("我正在吃饭!");
 7         }
 8     } ;
 9     public void ss(){    //方法ss
10         m.eat() ;        //调用重写的方法
11     }
12     public static void main(String[] args) {
13         new TestAnonymous().ss() ;    //测试
14     }
15 }
16 //定义一个接口  方法为 eat
17 interface MyInterface{
18     public void eat() ;
19 }

  注意:匿名内部 类 可以定义在方法内也可以定义在类的成员中,不管是那种匿名内部类都不能被外部类直接调用

四、内部类的作用?

  每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有
内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。
接口解决了部分问题,而内部类有效地实现了“多重继承”。

 

转载于:https://www.cnblogs.com/ChangFen/p/6069531.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学大数据之模块集成:Pycharm安装numpy,scipy,sklearn等包时遇到的各种问题的一键解决方法

最近在学习机器学习,要用Python写程序,习惯了用IDE软件,所以就使用Pycharm软件。但是在导入类似numpy,sklearn等模块的时候,发现了各种问题(如Python版本与模块之间的兼容等各类问题),上网找了许多方法&…

html 圆环实现多种颜色,SVG实现多彩圆环倒计时效果的示例代码

圆环倒计时我们经常见到,实现的方法也有很多种。但是本文将介绍一种全新的实现方式,使用SVG来实现倒计时功能。本文主要用到了SVG的stroke-dasharray和stroke-dashoffset特性。下图是倒计时运行效果:SVG倒计时案例下面说说相关的实现代码。cs…

调用API发送邮件163邮箱Python

#发邮件的库 import smtplib# from email.mime.text import MIMEText #SMTP服务器 SMTPSever "smtp.163.com" #发邮件的地址 sender "18332191389163.com" #发送这邮箱的密码 passwd "xxxxxxxx"#设置发送的内容 message "liu wang is …

u-boot文件夹

参考网址: http://www.cnblogs.com/PengfeiSong/p/6392056.html http://www.360doc.com/content/14/1114/14/8890849_425067013.shtml 转载于:https://www.cnblogs.com/lijimmy/p/6580870.html

初学大数据之Python中5个最佳的数据科学库的学习

在下载了pycharm软件以及通过前两篇文章,配置了相应的模块包之后,那就开始对常用的模块的学习,以便后期利用这些模块对数据做模型化处理。 如果你已经决定把Python作为你的编程语言,那么,你脑海中的下一个问题会是&…

配置mq

mq的实现可以是apache的&#xff0c;也可以是ibm的&#xff0c;配置不同的地方是connectionFactory和queue和topic应用的包不同 <!-- 配置链接器&#xff0c;注入apache的实现 --><bean id"connectionFactory"class"org.springframework.jms.connectio…

模拟银行自动提款系统python

列出对象及属性名称行为...py 人 类名&#xff1a;Person 属性&#xff1a;姓名 身份证号 电话 卡 行为&#xff1a;卡 类名&#xff1a;Card 属性&#xff1a;卡号 密码 余额 行为&#xff1a;银行 类名&#xff1a;Bank 属性&#xff1a;用户列表 提款机提款机 类名&#xf…

帮助文件html打不开,chm帮助文件打不开全是代码?这几种解决方法了解一下

win10系统chm帮助文件打不开怎么办?近期使用win10 版本 1809 (OS 内部版本 17763.864)系统的用户反应电脑打不开这个chm帮助文件的情况&#xff0c;打开后显示不正常&#xff0c;针对这样的问题如何解决呢?针对chm文件打开异常的现象大家可以参考本文中飞飞系统介绍的方法来修…

关于四种语言中substring()方法参数值的解析

1.关于substring(a,b)Jsvar str"bdqn";var resultstr.substring(1,2);alert(result);第一个参数&#xff1a;开始的位置&#xff0c;从0开始数第二个参数&#xff0c;结束的索引&#xff0c;从1开始数&#xff0c;而不是获取几个长度SQLselect substring(bdqn,2,1)第…

python中tkinter的使用-上

00基础代码 import tkinterwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020")win.mainloop() 01简单示例 #创建主窗口 win tkinter.Tk() #设置标题 win.title("Liuwang") #设置大小和位置 win.geometry("400x40020…

滚动条样式修改

/*滚动条*/ ::-webkit-scrollbar { width: 4px; height: 4px; background-color: #F5F5F5; } /*定义滚动条轨道 内阴影圆角*/ ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.…

sklearn中常用的数据预处理方法

常见的数据预处理方法&#xff0c;以下通过sklearn的preprocessing模块来介绍; 1. 标准化&#xff08;Standardization or Mean Removal and Variance Scaling) 变换后各维特征有0均值&#xff0c;单位方差。也叫z-score规范化&#xff08;零均值规范化&#xff09;。计算方式是…

儿童学计算机编程好处,儿童学习编程有什么好处

原标题&#xff1a;儿童学习编程有什么好处前几年中国家长可能对少儿编程教育感到陌生。但随着这两年美国STEM教育在中国的流行&#xff0c;以及今年国务院普及中小学阶段人工智能、编程教育规划的发布&#xff0c;现在国内也渐渐掀起少儿学习编程的风潮。孩子学电脑编程&#…

python中tkinter的使用-中

00Listbox控件 import tkinterwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020") 列表框控件&#xff0c;可以包含一个或者多个文本框 作用&#xff1a;在listbox控件的小窗口显示一个字符串 #1、创建一个listbox,添加几个元素&#…

SharePoint Server 2016 PWA(Project web app) 被变为只读模式

今天有同事反应了一个状况&#xff0c;我们SharePoint 2016里面集成的Project Web App(以下简称PWA)变成 read-only 只读模式了&#xff01;今天就给大家分享一下我的排查过程&#xff0c;供大家参考。 整个过程我一共使用了五种办法&#xff0c;结果最后一种才生效&#xff0c…

HDU 5741 Helter Skelter(构造法)

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid5741 【题目大意】 一个01相间的串&#xff0c;以0开头&#xff0c;给出的序列每个数字表示连续的0的个数或者1的个数&#xff0c;现在有m个询问&#xff0c;求0的个数为a且1的个数为b的串是否存在。 【题解】 我们发现…

集成学习之参数调整策略

1 Random Forest和Gradient Tree Boosting参数详解 在sklearn.ensemble库中&#xff0c;我们可以找到Random Forest分类和回归的实现&#xff1a;RandomForestClassifier和RandomForestRegression&#xff0c;Gradient Tree Boosting分类和回归的实现&#xff1a;GradientBoost…

python中tkinter的使用-下

00表格数据 import tkinter from tkinter import ttkwin tkinter.Tk() win.title("Liuwang") win.geometry("400x40020020")#表格 tree ttk.Treeview(win) tree.pack() #列 tree["columns"] ("姓名","年龄","身高&…

计算机科学和建筑设计结合,智能化建筑中计算机科学与技术的应用

4494 科技创新 建筑工程技术与设计2018年5月上【摘要】随着我国经济的发展&#xff0c;计算机科学技术已经逐渐应用到各个领域。将计算机科学与建筑相结合&#xff0c;为建筑业的发展提供了契机。本文介绍了计算机科学技术在智能化建筑中的应用&#xff0c;以期其为加快我国智能…

符号

符号&#xff1a;; 多个命令的分隔符/ 根或者路径的分隔符> 或1>标准输出重定向&#xff08;数据流朝着箭头的方向流动&#xff09;&#xff0c;覆盖原来的文件>>或1>>追加重定向&#xff08;数据流朝着箭头的方向流动&#xff09;&#xff0c;再原来的文件…