DAY011
一、内部类
1.内部类的概述
1、定义在内部的类,就是内部类。可以定义在方法的内部,可以定义在类的内部。
2、根据定义的位置不同,可以分为:
成员内部类 //放在类中方法外的类
局部内部类 //放在方法中的类
3、成员内部类://根据修饰符或关键字
普通的成员内部类 //没有修饰符,没有关键字 class 类名
私有的成员内部类 //被private修饰的类 private class 类名
静态的成员内部类 //被static修饰的类 static class 类名
4、局部内部类
5、【匿名内部类】
2.普通的成员内部类
1、定义在成员位置上的类,就是成员内部类
2、定义格式:
class 类名{
class 内部类类名 {
内部类成员
}
}
3、成员内部类的说明:
1、内部类可以直接访问外部类的所有成员,包括私有成员
2、外部类访问内部类的成员,必须先创建内部类的对象
3、在外部类以外,创建内部类的对象的格式:
外部类名.内部类名 内部类对象名 = new 外部类名().new 内部类名();
代码示例
public static void main(String[] args) {
//普通的成员内部类
//创建的内部类的对象
Body.Heart ssssbh = new Body().new Heart();
ssssbh.show();
Body b = new Body();
b.test();
}
class Body {
int high = 180;
//成员内部类
class Heart{
String color = "red";
//内部类中的方法
public void show(){
System.out.println(high +"......"+ color + "心扑通扑通跳");
}
}
//本类中的方法
public void test(){
System.out.println("-----------------------");
Heart h = new Heart();
h.show();
}
}
3.私有的成员内部类
1、也是一个成员内部类,在成员内部类前面加上一个private关键字
2、访问方式说明:
1、在外部类以外,不能直接访问外部类中的私有成员内部类
2、可以在外部类中,定义一个访问私有成员内部类的公有方法,让外界可以调用公有方法,间接的访问外部类中的私有成员内部类。
代码示例
public static void main(String[] args) {
//私有的成员内部类不能被外部类访问
//Body.Shen bs = new Body().new Shen();
//System.out.println(new Body().sex);
Body b = new Body();
b.test();
}
class Body {
private int high = 179;
//private int sex ;
//私有的成员内部类
private class Shen {
int age = 18;
public void show(){
System.out.println(high + "..."+ age +"多敲代码,少看小电影");
}
}
//对外提供公共的访问方法
public void test(){
System.out.println(high);
Shen s = new Shen();
s.show();
}
}
4.静态的成员内部类
1、也是一个成员内部类,在成员内部类前面加上一个static关键字
2、访问特点:
1、成员内部类是外部类的静态成员,所以可以通过外部类名.内部类名的方式直接访问,而不需要创建外部类的对象
2、静态内部类中的非静态成员,需要将所在的内部类对象创建出来之后,才能被调用。
3、静态成员内部类的对象创建格式:
外部类名.内部类名 内部类对象名 = new 外部类名.内部类名();
代码示例
public static void main(String[] args) {
//静态的成员内部类
//不能通过这种方式创建内部类对象
//Body.Gan bg1 = new Body().new Gan();
Body.Gan bg = new Body.Gan();
bg.show();
//System.out.println(Body.high);
Body b = new Body();
b.test();
}
class Body {
int high = 189;
static class Gan{
String color = "red";
public void show(){
System.out.println(new Body().high + "..." + color + "熬夜伤肝");
}
}
public void test(){
Gan g = new Gan();
g.show();
}
}
5.局部内部类
1、局部内部类:定义在方法中的内部类
2、局部内部类的访问说明:
方法中的局部变量,外界都没有办法访问到
所以方法中定义的内部类,外界也没有办法访问到
3、解决方式:
在方法内部,就创建局部内部类的对象,调用对象的方法
外界调用局部内部类所在的方法,间接的创建局部内部类的对象,间接的访问局部内部类的方法
代码示例
public static void main(String[] args) {
//局部内部类
breath();
}
public static void breath(){
int age = 10;
//内部类
class Lung{
String color = "black";
public void show(){
System.out.println(age + "..." +color + "少抽点烟吧,我都黑了");
}
}
//在方法中创建对象,调用自己的方法,和属性
Lung f = new Lung();
f.show();
}
6.匿名内部类
1、没有名字的内部类
2、匿名内部类的使用前提:
匿名类:继承一个类
匿名类:实现一个接口
3、格式:
new 父类类名或者接口名() {
父类方法的重写或者是接口内容的实现
}
4、本质:创建了一个类的子类对象、接口的实现类对象
5、内部类的名称总结:
1、如果是有名字的内部类,类名【外部类名$内部类名】
2、如果是没有名字的内部类,通过匿名内部类的顺序描述类名,第一个匿名内部类的名称【外部类名$1】,第二个匿名内部类类名【外部类名$2】
代码示例
public static void main(String[] args) {
//匿名内部类
Person p = new Student();
p.run();
Person p1 = new Person(){
@Override
public void run(){
System.out.println("");
}
};
p1.run();
//接口中的匿名内部类使用
Play pl = new Play(){
@Override
public void play(){
System.out.println("我要踢足球");
}
};
pl.play();
//匿名内部类的方法调用
new Play(){
@Override
public void play(){
System.out.println("我要打篮球");
}
}.play();
//new Student().方法名();
}
abstract class Person {
public abstract void run();
}
class Student extends Person{
int age;
public void run(){
System.out.println("我要在跑步机上跑步");
}
}
interface Play{
public abstract void play();
}
二、包
1.包的概述
1、包:用于分类存放类文件(.class)的文件夹
2、作用:
1、分类存放类文件
2、在不同的包中,可以起相同的类名(可以根据包名区分)
3、命名:
域名倒着写:com.ujiuye.demos(全球唯一)
4、包的声明:
使用package的关键字,声明当前的类是属于指定的包的
5、效果:
1、编译的这个类,就会进入到一个指定的文件夹中
2、当前的类,名称也发生了变化,类名变成了【包名 + 类名】
6、运行:
1、包文件夹以外,无法直接访问到这个类了
2、进入到包文件夹中,仍然无法访问到这个类:无论写类名还是全类名都无法找到这个类
3、【解决】在包文件夹所在的目录,运行这个类的全类名
7、访问:
在其他类中访问带包的类的时候,需要使用那个类的全类名:包名+类名
8、简化:
每次使用其他包的类的时候,都需要写很长一串全类名,所以非常麻烦,需要简化
使用import语句进行简化,在类的声明上,写一个import语句,将这个类的全类名导入进来,在该类中,就可以直接使用这个类的简写形式了。
注意事项:
1、即使在一个包中,有好多类都要使用,也不建议使用import *
2、如果在一个文件中,需要使用两个包中的同名类,那么不建议用import语句导包
否则无法区分使用的是哪个包中的类
2.权限修饰符
1、就是一些关键字,修饰成员,用于决定这些成员可以在什么位置被访问
2、这些关键字都是“封装”的体现形式
3、权限修饰符:
private: 只能在本类中被访问
默认的权限修饰符(啥都不写): 可以在本类中被访问
也可以在本包中的其他类中 被访问
protected: 可以在本类中被访问
也可以在本包中的其他类中被访问
可以在其他包的子类中被【继承】
public : 能在本类中被访问
能在本包中的其他类中被访问
能在其他包中的子类中被访问
能在其他包的无关类中被访问
三、iDea的快捷键
Ctrl+Shift + Enter,语句完成
Ctrl+E,最近的文件
Ctrl+F12,可以显示当前文件的结构
Ctrl+F7,可以查询当前元素在当前文件中的引用,然后按 F3 可以选择
Ctrl+N,可以快速打开类
Ctrl+Shift+N,可以快速打开文件
Alt+Q,可以看到当前方法的声明
Ctrl+P,可以显示参数信息
Ctrl+Shift+Insert,可以选择剪贴板内容并插入
Alt+Insert,可以生成构造器/Getter/Setter等
Ctrl+Alt+V,可以引入变量。例如:new String(); 自动导入变量定义
Ctrl+Alt+T,可以把代码包在一个块内,例如:try/catch
Ctrl+Enter,导入包,自动修正
Ctrl+Alt+L,格式化代码
Ctrl+Alt+I,将选中的代码进行自动缩进编排,这个功能在编辑 JSP 文件时也可以工作
Ctrl+Alt+O,优化导入的类和包
Ctrl+R,替换文本
Ctrl+F,查找文本
Ctrl+Shift+Space,自动补全代码
Ctrl+空格,代码提示(与系统输入法快捷键冲突)
Ctrl+Shift+Alt+N,查找类中的方法或变量
Alt+Shift+C,最近的更改
Alt+Shift+Up/Down,上/下移一行
Shift+F6,重构 – 重命名
Ctrl+X,删除行
Ctrl+D,复制行
Ctrl+/或Ctrl+Shift+/,注释(//或者/**/)
Ctrl+J,自动代码(例如:serr)
Ctrl+Alt+J,用动态模板环绕
Ctrl+H,显示类结构图(类的继承层次)
Ctrl+Q,显示注释文档
Alt+F1,查找代码所在位置
Alt+1,快速打开或隐藏工程面板
Ctrl+Alt+left/right,返回至上次浏览的位置
Alt+left/right,切换代码视图
Alt+Up/Down,在方法间快速移动定位
Ctrl+Shift+Up/Down,向上/下移动语句
F2 或 Shift+F2,高亮错误或警告快速定位
Tab,代码标签输入完成后,按 Tab,生成代码
Ctrl+Shift+F7,高亮显示所有该文本,按 Esc 高亮消失
Alt+F3,逐个往下查找相同文本,并高亮显示
Ctrl+Up/Down,光标中转到第一行或最后一行下
Ctrl+B/Ctrl+Click,快速打开光标处的类或方法(跳转到定义处)
Ctrl+Alt+B,跳转到方法实现处
Ctrl+Shift+Backspace,跳转到上次编辑的地方
Ctrl+O,重写方法
Ctrl+Alt+Space,类名自动完成
Ctrl+Alt+Up/Down,快速跳转搜索结果
Ctrl+Shift+J,整合两行
Alt+F8,计算变量值
Ctrl+Shift+V,可以将最近使用的剪贴板内容选择插入到文本
Ctrl+Alt+Shift+V,简单粘贴
Shift+Esc,不仅可以把焦点移到编辑器上,而且还可以隐藏当前(或最后活动的)工具窗口
F12,把焦点从编辑器移到最近使用的工具窗口
Shift+F1,要打开编辑器光标字符处使用的类或者方法 Java 文档的浏览器
Ctrl+W,可以选择单词继而语句继而行继而函数
Ctrl+Shift+W,取消选择光标所在词
Alt+F7,查找整个工程中使用地某一个类、方法或者变量的位置
Ctrl+I,实现方法
Ctrl+Shift+U,大小写转化
Ctrl+Y,删除当前行
Ctrl+Shift+F,全局查找
Ctrl+F,查找/Shift+F3,向上查找/F3,向下查找
Ctrl+Shift+S,高级搜索
Ctrl+U,转到父类
Ctrl+Alt+S,打开设置对话框
Alt+Shift+Inert,开启/关闭列选择模式
Ctrl+Alt+Shift+S,打开当前项目/模块属性
Ctrl+G,定位行
Alt+Home,跳转到导航栏
Ctrl+Backspace,按单词删除
【调试部分、编译】
Ctrl+F2,停止
Alt+Shift+F9,选择 Debug
Alt+Shift+F10,选择 Run
Ctrl+Shift+F9,编译
Ctrl+Shift+F10,运行
Ctrl+Shift+F8,查看断点
F8,步过
F7,步入
Shift+F7,智能步入
Shift+F8,步出
Alt+Shift+F8,强制步过
Alt+Shift+F7,强制步入
Alt+F9,运行至光标处
Ctrl+Alt+F9,强制运行至光标处
F9,恢复程序
Alt+F10,定位到断点
Ctrl+F8,切换行断点
Ctrl+F9,生成项目
Alt+1,项目
Alt+2,收藏
Alt+6,TODO
Alt+7,结构
Ctrl+Shift+C,复制路径
Ctrl+Alt+Shift+C,复制引用,必须选择类名
Ctrl+Alt+Y,同步
Ctrl+~,快速切换方案(界面外观、代码风格、快捷键映射等菜单)
Shift+F12,还原默认布局
Ctrl+Shift+F12,隐藏/恢复所有窗口
Ctrl+F4,关闭
Ctrl+Shift+F4,关闭活动选项卡
Ctrl+Tab,转到下一个拆分器
Ctrl+Shift+Tab,转到上一个拆分器
【重构】
Ctrl+Alt+Shift+T,弹出重构菜单
Shift+F6,重命名
F6,移动
F5,复制
Alt+Delete,安全删除
Ctrl+Alt+N,内联
【查找】
Ctrl+F,查找
Ctrl+R,替换
F3,查找下一个
Shift+F3,查找上一个
Ctrl+Shift+F,在路径中查找
Ctrl+Shift+R,在路径中替换
Ctrl+Shift+S,搜索结构
Ctrl+Shift+M,替换结构
Alt+F7,查找用法
Ctrl+Alt+F7,显示用法
Ctrl+F7,在文件中查找用法
Ctrl+Shift+F7,在文件中高亮显示用法