一、内部类

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. MongoDB 安装记录

    之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...

  2. ruby -- 进阶学习(十四)设置background-image(解决无法获取图片路径问题)

    基于rails4.0环境 为了美化界面,添加背景图片,于是又傻逼了一回~~ 一开始在xxx.html.erb中添加:(注:图片的路径为:app/asssets/images/background.jp ...

  3. ruby -- 问题解决(四)编码错误导致无法显示(2)

    从数据库中取得数据显示时报 incompatible character encodings: GBK and ASCII-8BIT或 incompatible character encodings ...

  4. 《编写高质量代码:改善C#程序的157个建议》源码下载

    ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...

  5. 第一次接触终极事务处理——Hekaton

    在这篇文章里,我想给出如何与终极事务处理(Extreme Transaction Processing (XTP) )的第一次接触,即大家熟知的Hakaton.如果你想对XTP有个很好的概况认识,我推 ...

  6. ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了

    用法: var int1 = "2".TryToInt();//转换为int失败返回0 var int2 = "2x".TryToInt(); var int3 ...

  7. 另一个 OleDbParameterCollection 中已包含 OleDbParameter 错误分析及解决办法

    程序非常简单,就是从一个表中取出一个符合要求的数据,如果取到,就把该数据对应的计数加1.也就是执行不同的两个SQL语句操作同一个表,并且这两个SQL的参数是一样的.在一个函数里完成这个调用.执行第二个 ...

  8. sprint演示Scrum 项目7.0

    1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉很好. 其他人可以了解你的团队在做些什么,并得到重要反馈. 演示是一种社会活动,不同的团队可以在这里相互交流,讨论各自的工作.这很有 ...

  9. HDFS-RAID原理和实现

    HDFS-RAID 是Facebook基于hadoop-20-append分支(第一代Hadoop)开发的raid方案,对HDFS的修改极少,主要包括为NameNode增加了根据block信息找到bl ...

  10. SQL 批量字符串替换

    --在SQL SERVER中批量替换字符串的方法 update table[表名] set Fields[字段名]=replace(Fields[字段名],'被替换原内容','要替换成的内容') up ...