基础学习day09--内部类
一、内部类
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、为什么内部类能直接访问外部类中的成员呢?
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、把匿名内部类做参数传递
- 通常的使用场景之一:
- 当函数参数是接口类型时,而且接口中的方法不超过三个。
- 可以用匿名内部类作为实际参数进行传递。
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--内部类的更多相关文章
- 学习android学习必备的java基础知识--四大内部类
学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习(2)
Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- python入门到精通[三]:基础学习(2)
摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...
- python入门到精通[二]:基础学习(1)
摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...
随机推荐
- int.class 与 Integer.class
TYPE 表示的引用类型所对应的基本类型的Class对象!
- umbraco之DocumentType
DocumentType定义了数据字段,这就像我们在数据库中定义表一样,这个数据字段就像表中的一个字段或者一个列.但不同的是,在umbraco里数据是分等级而不是一个表格性质. 这样就可以使用一个基本 ...
- 你需要知道的Sass插值
你也许会不时地写写 Sass 玩玩,你也会很享受它带给你各种便利.但还有一件事,你并不一定完全了解:插值 (interpolation) - 将一个占位符,替换成一个值.好了,你们都很幸运,因为今天我 ...
- [Windows] 批处理文件系统服务控制
在cmd下可有两种方法打开,net和sc. net只能用于用于打开没有被禁用的服务. 启动: net start 服务名 停止: net stop 服务名 sc可打开被禁用的服务. sc config ...
- Laravel 5 多个视图共享数据的方法
我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php 为了简单一点,文件里只有设置了一个变量 {{ ...
- notepad++ 各类插件学习记录
js文件的规范格式排列: 插件里安装 jstools, 然后重启notepad++再去插件里面的jstool里面用jsformat就可以格式化排列不规则的js代码了 notepad++ 自动补全: 在 ...
- Qt之QAbstractItemView视图项拖拽(二)
一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...
- Scrum 项目4.0--软件工程
1.准备看板. 2.任务认领,并把认领人标注在看板上的任务标签上. 林宇粲:处理数据的存储:目前先进行数据库表的分析和创建. 蔡舜:对复利计算,单利计算,代码进行编写. 王昕明:编写一些用户登录,操作 ...
- sql date()函数
SQL Server Date 函数 下面的表格列出了 SQL Server 中最重要的内建日期函数: 函数 描述 GETDATE() 返回当前的日期和时间 DATEPART() 返回日期/时间的单独 ...
- CSS行高line-height的理解
一.行高的字面意思 “行高“顾名思义指一行文子的高度.具体来说是指两行文子间基线间的距离. 基线是在英文字母中用到的一个概念,我们刚学英语的时候使用到的那个英语本子每行有4条线,其中底部第二条线就是基 ...