## 0521Day04内部类
【重点】
Math公式
静态导入
正则表达式
内部类
访问修饰符
【Math】
Math包的相关方法:
round:四舍五入:-10.9==>-11/-11.2==>-11
floor:向下取整:10.9==>10/-11.2==>-12
ceil:向上取整:10.1==>11/-11.2==>-11
sqrt:开平方根:传入的及返回的是double类型
pow(x,y):乘方计算
注意事项
Math()构造器为私有,外部无法创建
Math位于lang包下,不导入可以直接带Math使用:Math.abs();
ctrl + shift + o 可以自动导入所有包
【静态导入】
要使用静态成员(方法和变量),必须提供这个静态成员的类。
使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
【正则表达式】
Pattern p = Pattern.compile("a.b");//匹配正则表达式
Matcher m = p.matcher("ammb");//匹配要校验的字符串
boolean b = m.matches();//判断结果赋值给变量
System.out.println(b);
【内部类】
内部类分类:成员内部类,静态内部类,局部内部类,匿名内部类
作用:
1.内部类可以编译成class文件
2.内部类可直接访问外部类的私有成员属性,而不破坏封装属性
3.为外部类增加必要的功能组件
【成员内部类】
1.在类内部定义,与成员属性、方法同名
2.成员内部类不能脱离外部类存在,创建外部类时才有内部类
3.内外部类有重名属性时,优先访问内部属性
4.成员内部类不能定义静态成员
静态意味着不需创建对象就能使用,与第二条冲突
【静态内部类】
1.静态内部类与静态成员属性,静态成员方法同级
2.不依赖外部类对象可直接创建内部类对象或直接通过类名访问,可声明静态成员
3.静态方法只能声明在静态内部类或者顶层类中,在非静态内部类中不能定义静态方法和静态属性
【成员内部类/成员内部类代码示例】
// 代码块
package interclass;
import java.io.Serializable;
/**
* 顶级类只能由public default final abstract修饰
*
* @author GXC
*
*/
//private class AAA{}
public class Outter01 {
int local = 100;
int n1 = 10;
static int n2 = 20;
// 以匿名子类的方式创建Object的obj对象,编译后会自动生成一个从1开始的class文件
private Object obj = new Object() {
};
// 以匿名实现类的方式创建Serializable的ser对象,该对象实现了Serializable接口
// 编译之后自动生成一个以1开始的class文件
private Serializable ser = new Serializable() {
};
// 一个类的内部可以用public实现,不限制修饰符类型
public class Inner01 {
int local = 200;
// i1表示Inner01的内部类成员变量
int i1 = 100;
// i2 不能用static来修饰,非静态类不能有静态属性
// static int i2 = 200;
public void m1() {
int local = 300;
// 外部类成员属性,内部类成员属性,局部变量访问方式
System.out.println("---------三层变量访问--------");
System.out.println(local);
System.out.println(this.local);
System.out.println(Outter01.this.local);
System.out.println("---------三层变量访问--------");
System.out.println("Outter01.Inner01.m1()");
}
/**
* 静态方法只能被声明在静态类中或者顶层类中 在非静态内部类中不能定义静态的方法
*/
// public static void inTest02() {
//
// }
}
/**
* 在一个类中可以定义一个静态内部类 静态内部类可以同时包含静态属性方法和非静态属性方法
*
*
* @author GXC
*
*/
public static class Inner02 {
int i1 = 10;
static int i2 = 20; // 静态变量是斜体字
void m3() {
}
static void m4() {
// 静态方法不能访问非静态成员属性,可以访问静态成员属性
System.out.println(i2);
}
}
}
// 测试类
package interclass;
/**
*
* 概述:成员内部类和静态内部类
*
*
* 静态属性,静态方法
* 非静态属性,非静态方法
*
* 静态属性依赖类,不依赖对象
* 非静态属性依赖对象
*
* 静态属性在访问时不能确认对象是否存在,存在不确定性
* 所以:静态方法只能访问静态属性,不能访问依赖对象的非静态属性(因为不能确认是否对象存在)
* 而非静态方法使用时,已经可以确认已经产生了对象,此时非静态方法可以访问非静态属性。
* 另外,因为非静态使用时,已经产生了对象,因此“类”也已经存在,所以依赖“类”的静态属性也可以访问
*
* @author GXC
*
*/
public class TestOuter01 {
public static void main(String[] args) {
Outter01 o = new Outter01();
System.out.println(o.n1);
System.out.println(Outter01.n2);
// 对于一个类的非静态内部类中的属性与方法的调用,必须先得到外部类对象才可以调用
// 因为非静态属性和方法依赖于对象,没有对象无法进行访问
new Outter01().new Inner01().m1();
System.out.println(new Outter01().new Inner01().i1);
// 静态内部类不依赖外部类,非静态内部类(成员内部类)依赖外部类对象
// 对于静态内部类:可以直接使用【外部类名.内部类名.(静态属性,静态方法)】进行访问
System.out.println(Outter01.Inner02.i2);
Outter01.Inner02.m4();
// 对于静态内部类,可以创建静态内部类对象,进而访问静态内部类非静态成员属性和方法
System.out.println(new Outter01.Inner02().i1);
new Outter01.Inner02().m3();
// 对于非静态内部类:需要创建外部类对象,再创建内部类对象,进而进行访问
new Outter01().new Inner01().m1();
// 【重点】非静态内部类没有静态属性和静态方法
}
}
【局部内部类】
1.在外部类方法内部定义,和局部变量是一个级别
2.局部内部类访问外部类当前方法中的局部变量时,因无法保证变量的生命周期与局部内部类相同,变量需修饰为final
局部变量在方法结束以后就被收回,内部类中的对象实在堆中,伴随垃圾回收周期性回收,还有可能存在类已经结束,但对象还在内存中存在的情况。因此需将局部变量用final修饰,此时该变量会放在常量池中,常量池中的变量回收要求严。
【匿名内部类】
1.匿名内部类时没有名称的局部内部类,其他与局部内部类一致。
2.必须实现一个接口或者继承一个父类。
【局部内部类/匿名内部类代码示例】
package interclass;
/**
* 局部内部类和匿名内部类
*
* @author GXC
*
*/
public class Outter02 {
class Inner01 {
void test1() {
System.out.println("Outter02.Inner01.test1");
}
}
public void test() {
new Inner01().test1();
System.out.println("---111------");
new Inner01() {
}.test1();
System.out.println("--222-------");
new Inner01() {
void test1() {
System.out.println("匿名对象重写了test1方法");
}
}.test1();
System.out.println("--333-------");
new Inner01() {
void test() {
System.out.println("Inner01.test");
}
void test1() {
System.out.println("Inner01.test1");
}
}.test1();// test()方法也可以
System.out.println("--444-------");
Inner01 in = new Inner01() {
void test() {
System.out.println("Inner01.test");
}
void test1() {
System.out.println("Inner01.test1");
}
};
// 此处只有test01
in.test1();
// test()方法不能访问,此时in为父类引用
// in.test();
}
}
package interclass;
public class TestOutter02 {
public static void main(String[] args) {
new Outter02().test();
}
}
【内部类对比】
内部类的主要作用是限制类的使用范围
内部类使用范围:
minest:局部内部类:仅有当前局部内部类方法可以访问
==>私有的成员内部类:当前外部类成员方法访问
==>私有的静态内部类:当前外部类成员方法,静态方法
==>公开的成员内部类:创建对象后的方法
==>公开的静态内部类:根据访问修饰符不同的类名访问
【访问修饰符】
private修饰的资源,只能在当前类中被访问
default修饰的资源,只能被同包下其他类访问
protected修饰的资源,可以被同包以及存在继承关系的非同包类访问
public修饰的资源,可以被任何同项目的其他类来访问
【TIPS】
1.Math位于lang包下,不导入可以直接带Math使用:Math.abs();
2.ctrl + shift + o 可以自动导入所有包
3.顶层类只能由public, default, final, abstract修饰://private class AAA{}//错误
4.静态变量是斜体字
## 0521Day04内部类的更多相关文章
- java中的内部类
/** * 内部类 ?? * 定义在一个内部的类,被称为内部类. * 内部类里有类体,方法体 * 内部类所在的类,被称为外部类. * --------------------------------- ...
- java中的内部类总结
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...
- 错误: 从内部类中访问本 地变量vvv; 需要被声明为最终类型
从github 下载了源码, 进行编译, 出现了下面的错误 E:\downloads\ff\elasticsearch-master\elasticsearch-master>GRADLE :b ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类学习笔记
20160923 定义:将一个类的定义放在另一个类的内部: 从外部类的非静态方法之外,创建某个内部类的对象:OutClassName.InnerClassName: 内部类拥有所有其外部类的成员的访问 ...
- Android XML中引用自定义内部类view的四个why
今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...
- 静态方法中不能new内部类的实例对象的总结
class Test{ public void main(String[] args){ A testA=new A(); //这里会出现问题 new Thread(new Runnable(){ p ...
- Java内部类与外部类的那些事
昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...
- java 多态和内部类
接口跟接口之间存在继承关系 一个接口可以继承多个接口 一个非抽象类:必须实现接口中的所有方法 一个抽象类实现接口 可以不实现接口中的方法 但是继承与抽象类的类必须要是实现接口中的方法 多态:一个对 ...
随机推荐
- 数学--数论--HDU 12151七夕节 Plus (因子和线性筛)
Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...
- ACM一年记,总结报告(希望自己可以走得很远)
一. 知识点梳理 (一) 先从工具STL说起: 容器学习了:stack,queue,priority_queue,set/multiset,map/multimap,vector. 1.stack: ...
- [USACO1.3]虫洞wormhole
题目描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他的虫洞将形成 N ...
- Centos7 team 绑定多网卡
1.nmcli connection show 查看所有的网络连接 nmcli connection show 接下来我们要使用 ens37 ens38 两个网卡绑定 , 绑定的网卡取名: agg-e ...
- IoTClient开发6 - S7-200SmarTcp协议客户端实现
环境和工具 服务端电脑IP:192.168.1.130 客户端电脑IP:192.168.1.120 1.在服务端电脑运行IoTClientTool 2.运行Wireshark 3.在客户端电脑运行Io ...
- Jmeter-接口测试参数化后循环断言不同内容的方法
前言 各位小伙伴在做接口自动化有没遇到过这样的问题,CSV文件参数化测试数据后,只能通过人工的的方法去查看结果,不懂写代码去循环断言返回的结果.今天我们来学习一下,不用写代码,就用响应断言,怎么实现循 ...
- P1220 关路灯(提高+)
以下内容转自z2415445508 只是为了方便自己复习而已 题目传送门-->关路灯 我是一条憨憨的分割线 关灯不需要额外的时间,经过了灯就关了.但是可能折返回去关某一个大灯会比继续往下走关接下 ...
- qt creator源码全方面分析(4-4)
目录 统计接口实现 统计接口实现 我们知道,插件架构必不可少的是定义接口类,即抽象基类,描述用户需要自定义实现的内容.此外,一般还有一个管理器类,对接口类的所有实现类进行管理,并调用其中的接口进行.源 ...
- Coursera课程笔记----计算导论与C语言基础----Week 9
C语言中的控制成分(Week 9) 计算机程序的基本结构 任何具有单入口单出口的程序,都可以用顺序结构.分支结构.循环结构来表达 分支语句 在执行if语句前,先对表达式求解 if()内可以是任意的数值 ...
- ApplicationInsights迁移国内躺的坑
由于之前有段时间访问国际版的Application Insights实在是慢,而且又不是每个人都有梯子,然后国内版大概在去年(2019)六七月左右已经上线,想着也有一段时日了,要么就迁了吧. 然后实际 ...