一、内部类

1.1、内部类概念

定义在一个类内部中的另一个类,被称为内部类

特点:

可以直接访问,内部类的外部类中的,成员属性和方法(包含-private)

外部类要访问内部类中的成员和方法,需要先建立内部类对象

1.2、示例

package com.day08.innerclass.demo1;
/**
* 包含内部类
* @author denny
*
*/
public class Outer { //外部类 //private成员
private String name="张三";
private int age=20;
private String gender="男"; /**
* 内部类
*/
class Inner{
private int num=3; public void hello(){
System.out.println("姓名:"+name+"年龄:"+age
+"性别:"+gender);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
} } /*
* 外部类中的方法
*/
public void show(){
System.out.println("姓名:"+this.name+"年龄:"+this.age
+"性别:"+this.gender);
} /*
* 调用内部类
*/
public void say(){
Inner inner=new Inner();
System.out.println("调用内部类:"+"num="+inner.getNum()+", num="+inner.num);
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
} }

测试外部类

package com.day08.innerclass.demo1;

public class OuterTest {

    public static void main(String[] args) {
//外部类调用内部类
Outer o=new Outer();
o.show();
o.say(); } }

结果:

姓名:张三年龄:20性别:男
调用内部类:num=3, num=3

测试内部类

package com.day08.innerclass.demo1;

public class InnerTest1 {

    public static void main(String[] args) {
// 声明内部类中对 象,先声明外部类,再声明内部类
Outer.Inner inner = new Outer().new Inner();
inner.hello(); } }

姓名:张三年龄:20性别:男
调用内部类:num=3, num=3

1.3、静态内部类

如果内部类是static修饰的就只能调用父类中static成员

声明方式,可直接外部类.内部类()来声明或者调用

package com.day08.innerclass.demo3;

public class Outer {
//private成员
private String name="张三";
static int age=20;
private String gender="男"; /*
* 外部类中的方法
*/
public void show(){
System.out.println("姓名:"+this.name+"年龄:"+this.age
+"性别:"+this.gender);
}
/**
* 内部类
*/
static class Inner{
private int num=3; public void hello(){
System.out.println("外部类年龄:"+age
+",内部类属性"+this.num);
}
}
public static void main(String[] args) {
//静态内部类可以直接通过外部类.内部类声明
Outer.Inner inner=new Outer.Inner();
inner.hello();
}
}

外部类年龄:20,内部类属性3

1.4、内部类成员是static的话

这个内部类必须被static修饰,static只能调用外部类和内部类中的stiatic的成员.

package com.day08.innerclass.demo3;

public class Outer {
//private成员
private String name="张三";
static int age=20;
private String gender="男"; /*
* 外部类中的方法
*/
public void show(){
System.out.println("姓名:"+this.name+"年龄:"+this.age
+"性别:"+this.gender);
}
/**
* 内部类
*/
static class Inner{
private static int num=3; public static void hello(){
System.out.println("外部类年龄:"+age
+",内部类属性"+num);
}
}
public static void main(String[] args) {
//静态内部类m成员也是静态的可以直接调用
Outer.Inner.hello();
}
}

结果:外部类年龄:20,内部类属性3

1.5、声明在外部类中成员方法中的内部类

声明成员方法中的,内部类,调用成员方法中的局部变量 时,成员方法中的局部变量 必须为final修饰

package com.day08.innerclass.demo3;

public class Outer {
// private成员
private String name = "张三";
static int age = 20;
private String gender = "男"; /*
* 外部类中的方法
*/
public void show(int x) {
final int y = 5;
//System.out.println("姓名:" + this.name + "年龄:" + this.age + "性别:" + this.gender);
class Inner {
public void hello() {
System.out.println("hello-------"+x + " ," + y);
}
}
Inner inner = new Inner();
inner.hello();
} /**
* 内部类
*/ public static void main(String[] args) {
//声明成员方法中的,内部类,调用成员方法中的局部变量 时,成员方法中的局部变量 必须为final修饰
new Outer().show(8);
}
}

hello-------8 ,5

1.6、为什么内部类能直接访问外部类中的成员呢?

因为内部类持有了外部类的引用,外部类名.this。  (默认省略)
package com.day08.innerclass.demo4;

public class Outer {
private int num=3; class Inner{
private int num=4; public void show(){
int num=5;
//局部变量
System.out.println(num);
//内部类的成员变量
System.out.println(this.num);
//外部类的成员变量
System.out.println(Outer.this.num);
}
}
public static void main(String [] args){
new Outer().new Inner().show();
} }

二、匿名内部类

2.1、匿名内部类概念 

内部类可以继承或实现一个外部类或者接口。

格式:
    new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}
    简单理解:
    就是建立一个带内容的外部类或者接口的子类匿名对象。
    什么时候使用匿名内部类呢?
    通常使用方法是接口类型参数,并且该接口中的方法不超过三个,可以将匿名内部类作为参数传递。
    好处:
    增强阅读性。

2.2、重写类中的方法

package com.day08.innerclass.demo5;
/**
* 抽象类
* @author denny
*
*/
public abstract class Person { private String name="张三"; public void show(){
System.out.println(this.name); } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
package com.day08.innerclass.demo5;

/**
* 外部类
*
* @author denny 实现有一个方法的抽象类的匿名内部类
*
*/
public class Outer {
private int num = 3; public void say() {
new Person() {// 匿名内部类
public void show() { //重写抽象类中的方法,抽象方法,普通方法都可以
System.out.println("..............." + num);
}
}.show(); //对象创建完成,调用自己
} public static void main(String[] args) {
new Outer().say();
}
}

结果:

...............3

第二种写法,适后重写了多个方法

package com.day08.innerclass.demo5;

/**
* 外部类
*
* @author denny 实现有一个方法的抽象类的匿名内部类
*
*/
public class Outer {
private int num = 3; public void say() {
Person person=new Person() {// 匿名内部类
public void show() { //重写抽象类中的方法,抽象方法,普通方法都可以
System.out.println("..............." + num);
}
};
//对象创建完成
person.show();
} public static void main(String[] args) {
new Outer().say();
}
}

2.3、示例使用接口的方式

package com.day08.innerclass.demo6;
/**
* 接口
* @author denny
*
*/
public interface BirdPro { /**
* 2个抽象方法
*/
public void shout(); public void accact(); } package com.day08.innerclass.demo6; public class Outer {
private String name="张三"; public void show(){
int y=3;
BirdPro birdPro=new BirdPro(){
//实现接口中的方法
@Override
public void shout() {
System.out.println(name+","+y); } @Override
public void accact() {
System.out.println(y+","+name); } };
birdPro.shout();
birdPro.accact();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
new Outer().show();
}
}

结果:

张三,3
3,张三

2.4、把匿名内部类做参数传递

  1. 通常的使用场景之一:
  2. 当函数参数是接口类型时,而且接口中的方法不超过三个。
  3. 可以用匿名内部类作为实际参数进行传递。
package com.day08.innerclass.demo6;

/**
* 接口
*
* @author denny
*
*/
public interface BirdPro { /**
* 2个抽象方法
*/
public void shout(); public void accact(); }
package com.day08.innerclass.demo6;

class InnerDemo {

    public static void main(String[] args) {
// 把接口做参数传递
show(new BirdPro() {
// 实现接口中的方法
@Override
public void shout() {
System.out.println("叫声"); } @Override
public void accact() {
System.out.println("攻击"); } });
} public static void show(BirdPro birdPro) {// 做参数
// 调用
birdPro.accact();
birdPro.shout();
}
}

2.5、 初始化顺序

package com.day08.innerclass.demo2;

public class Fu {

    int num = 9;
static{
System.out.println(" static Fu");
} {
System.out.println("Fu");
} Fu() {
super();// Object
// 显示初始化
// 构造代码块初始化
show(); // 构造函数调用方法,如果子类已经重写了,父类的方法,则执行子类的方法,但这时,成员还没有初初始化,所以为默认值
} void show() {
System.out.println("fu show " + num);// 被覆盖,运行子类的
} }
package com.day08.innerclass.demo2;

public class Zi extends Fu {
int num = 8;
static{
System.out.println(" static Zi");
} {
System.out.println("Zi" );
} Zi(){
super();
//显示初始化
//构造代码块初始化
show();
} void show(){
System.out.println("zi show " + num);
}
}
package com.day08.innerclass.demo2;

public class Test1 {

    public static void main(String[] args) {
new Zi(); } }

结果:

static Fu
static Zi
Fu
zi show 0
Zi
zi show 8

基础学习day09--内部类的更多相关文章

  1. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  2. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  3. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  4. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  5. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  6. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  7. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  8. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  9. python入门到精通[三]:基础学习(2)

    摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...

  10. python入门到精通[二]:基础学习(1)

    摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...

随机推荐

  1. SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议

    SuperSocket 提供了一些通用的协议解析工具, 你可以用他们简单而且快速的实现你自己的通信协议: TerminatorReceiveFilter (SuperSocket.SocketBase ...

  2. 网络爬虫urllib2 tornado

    百度不支持用tornado请求,可以用美团开放API 测试. import tornado.httpclient def fetch(url): http_header={'User-Agent':' ...

  3. JS思维之路菜鸟也能有大能量-序幕

    准备写一类关于Js的开发思想的文章,这系列文章需要有一定的js基础,在这里不会去说太多的js基础知识,因为这系列文章不是写基础东西,而是一种编程思想,如果你还是js新手,那么建议你有一定基础后再看. ...

  4. 【转载】一步一步写算法(之hash表)

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaox ...

  5. 在Linux上安装Oracle RAC 12 c(12.1) 虚拟机,一步一步向导

    Oracle RAC 12 c(12.1)在Linux上安装虚拟机,一步一步向导 今天我们将看到如何安装 12 c版本1 RAC(真正的应用程序集群)数据库2 Linux 64位的虚拟机 使用VMWa ...

  6. C#组态控件Iocomp应用案例

    Iocomp组件需要在vs2010环境下使用,目前用到的是4.04版本.在两个项目中用到了它,一个是锅炉监控系统,另一个是绝缘靴检测系统. 锅炉监测系统 这个节目基本都是使用Iocomp控件完成. 出 ...

  7. XmlNodeList循环读取节点值

    foreach (XmlNode item in XmlNodeList) { string oid = item.SelectSingleNode("oid").InnerTex ...

  8. Linux守护进程实现程序只运行一次

    1.守护进程 守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件. 2.让程序只运行一次 如果让程序只运行一次,有很多方法,此处的一种 ...

  9. 树状数组--K.Bro Sorting

    题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/D Description Matt’s frie ...

  10. poolboy的坑

    poolboy是Erlang中运用非常广泛的进程池库,它有很多优点,使用简单,在很多项目中都能看到它的身影.不过,它也有一些坑,使用时候需要注意.(本文对poolboy的分析基于1.5.1版本) wo ...