【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类
1.0.0 Summary
Tittle:【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类
Style:EBook
Series:Java
Since:2017-09-04
End:....
Total Hours:...
Degree Of Diffculty:2
Degree Of Mastery:2
Practical Level:2
Desired Goal:2
Archieve Goal:....
Gerneral Evaluation:...
Writer:kingdelee
Related Links:
http://www.cnblogs.com/kingdelee/
package com.lee.test.java.ebook.crazy_java.u_6_oop_2.c_6_7_inner_test; // 1. 内部类提供了更好的封装
// 2. 在内部类,访问内部类非静态变量用 this.var,访问外部类非静态变量用 Out.this.var
// 3. 在外部类,访问内部类非静态变量用 new Inner().var
// 4. 在外部类,静态的方法不能调用非静态类
// 5. 在非静态内部类,不能存在静态声明
// 6. 外部类访问静态内部类的静态成员,StaticInner.staticVar
// 6.1 外部类访问静态内部类的非静态成员,new StaticInner().var
// 7. 静态内部类无法访问外部类的非静态成员
// 8. 在外部类的外部构造外部类的内部类实例 Out.In in = new Out().new In();
// 8.1 等价于 Out.In in1; Out out = new Out(); in1 = out.new In();
// 9. 子类继承外部类的非静态内部类时,子类构造器必须显式的调用父类的构造器
// 9.1 子类可以直接继承外部类的静态内部类,故优先使用静态内部类会更加方便
// 10. 在外部类的外部构造静态内部类实例 Out.In in = new Out.In();
// 10.1 等价于 Out.staticIn staticIn1; staticIn1 = new Out.staticIn();
// 11. 局部内部类,即定义在方法中的类,Out$NInner.class规则生成class文件:Cow.class Cow$1Inner.class Cow$1InnerSub.class
// 12.1 匿名内部类lambada无参版,接口必须是有唯一抽象方法(类方法、默认方法随意),即函数式接口 @FunctionInterface 下同
// 12.2 匿名内部类lambada有参版,@FunctionInterface
// 12.3 匿名内部类lambada有参版 有返回值 缩略return,@FunctionInterface
// 12.4 匿名内部类lambada有参版,有返回值 显式return,@FunctionInterface
// 12.5 匿名
// 12.6 将实现函数式的接口强转
// 12.7 常见的函数式接口 java.util.function
// xxxFunction, apply() 处理 数值 并返回新值
// xxxConsumer, accept() 处理 新值 不返回值
// xxxPredicate, test() 判断 返回boolean
// xxxSupplier, getAsXxx() 按某种逻辑算法 返回值
// 12.8.1 Lambada 未缩减 调用类方法
// 12.8.1.1 Lambada ::方法调用 省略参数,引用类方法 Converter converter1_1 = Integer::getInteger;
// 12.8.2 Lambada 未缩减 调用实例 Converter converter2 = str -> "".indexOf("");
// 12.8.2.1 Lambada ::方法调用 省略参数,引用实例方法 Converter converter2_1 = str -> "".indexOf("");
// 12.8.3 Lambada 未缩减 调用实例 MyTest converter3 = (a1, b, c) -> a1.substring(b, c);
// 12.8.3.1 Lambada ::方法调用 省略参数,第一个参数为调用者,之后的参数为形参传进来 MyTest converter3_1 = String::substring;
// 12.8.4 Lambada ::new 构造参数 Converter converter4 = Integer::new; public class Cow { private int weight;
private String color = "white"; public Cow(int weight) {
this.weight = weight;
} // 内部类提供了更好的封装
private class CowLeg { private int num;
private String color = "black"; // 5.1 在非静态内部类,不能存在静态声明
// static{
//
// } // 5.2 在非静态内部类,不能存在静态声明
// private static void t1(){
//
// } // 5.3 在非静态内部类,不能存在静态声明
// private static int a; public CowLeg(int num) {
this.num = num;
} public void printLeg() {
System.out.println("this cow weight:" + weight + ", has leg:" + num);
// 2. 在内部类,访问内部类非静态变量用 this.var,访问外部类非静态变量用 Out.this.var
System.out.println("leg color:" + this.color + ", cow color:" + Cow.this.color);
} } // 静态内部类
private static class Life {
private static int num = 5;
private int age; static {
// 7 编译失败,静态内部类无法访问外部类的非静态成员
// System.out.println(Cow.this.color);
} } public void getLife() {
// 6. 外部类访问静态内部类的静态成员,StaticInner.staticVar
System.out.println(Life.num);
// 6.1 外部类访问静态内部类的非静态成员,new StaticInner().var
System.out.println(new Cow(1).color);
} public void getLegInfo(int num) {
new CowLeg(num).printLeg();
// 3. 在外部类,访问内部类非静态变量用 new Inner().var
System.out.println("inner color:" + new CowLeg(1).color);
} public static void main(String[] args) {
new Cow(10).getLegInfo(2); // 4. 编译失败,外部类的静态方法,无法调用非静态的内部类
//new CowLeg(1); // 8. 在外部类的外部构造非静态内部类实例 Out.In in = new Out().new In();
Out.In in = new Out().new In();
// 8.1 等价于 Out.In in1; Out out = new Out(); in1 = out.new In();
Out.In in1;
Out out = new Out();
in1 = out.new In(); // 10 在外部类的外部构造静态内部类实例 Out.In in = new Out.In();
Out.staticIn staticIn = new Out.staticIn();
// 10.1 等价于
Out.staticIn staticIn1;
staticIn1 = new Out.staticIn(); // 11. 局部内部类,即定义在方法中的类,Out$NInner.class规则生成class文件:Cow.class Cow$1Inner.class Cow$1InnerSub.class
class Inner { } class InnerSub extends Inner { } // 12. 匿名内部类
new Cow(1).showFace(new Face() {
@Override
public void show() {
System.out.println("show Cow face");
}
}); // 12.1 匿名内部类lambada无参版,接口必须是有唯一抽象方法(类方法、默认方法随意),即函数式接口 @FunctionInterface 下同
new Cow(1).showFace(() -> System.out.println("show Cow face")); // 12.2 匿名内部类lambada有参版,@FunctionInterface
new Cow(1).drop(num -> System.out.println("drop egg:" + num)); // 12.3 匿名内部类lambada有参版 有返回值 缩略return,@FunctionInterface
Wallet2 w = (int banknote, int coin) -> banknote + coin; // 12.4 匿名内部类lambada有参版,有返回值 显式return,@FunctionInterface
Wallet wallet = (int[] bb, int[] cc) -> {
int count = 0;
for (int b : bb) {
count += b;
}
for (int c : cc) {
count += c;
}
return count;
}; int[] banknotes = {1, 2, 3};
int[] coins = {1, 2, 3};
int count1 = new Cow(1).count(wallet, banknotes, coins); // 12.5 匿名 Runnable r = () -> {};
Runnable r = () -> {
}; // 12.6 将实现函数式的接口强转
Object a = (Runnable) () -> {
}; // 12.7 常见的函数式接口 java.util.function
// xxxFunction, apply() 处理 数值 并返回新值
// xxxConsumer, accept() 处理 新值 不返回值
// xxxPredicate, test() 判断 返回boolean
// xxxSupplier, getAsXxx() 按某种逻辑算法 返回值 // 12.8.1 Lambada 未缩减 调用类方法
Converter converter1 = str -> Integer.getInteger(str);
// 12.8.1.1 Lambada ::方法调用 省略参数,引用类方法
Converter converter1_1 = Integer::getInteger;
// 12.8.2 Lambada 未缩减 调用实例
Converter converter2 = str -> "".indexOf("");
// 12.8.2.1 Lambada ::方法调用 省略参数,引用实例方法
Converter converter2_1 = str -> "".indexOf("");
// 12.8.3 Lambada 未缩减 调用实例
MyTest converter3 = (a1, b, c) -> a1.substring(b, c);
// 12.8.3.1 Lambada ::方法调用 省略参数,第一个参数为调用者,之后的参数为形参传进来
MyTest converter3_1 = String::substring;
// 12.8.4 Lambada ::new 构造参数
Converter converter4 = Integer::new; } public void showFace(Face face) {
face.show();
} public void drop(Egg egg) {
egg.show(2);
} public int count(Wallet wallet, int[] banknotes, int[] coins) {
return wallet.countMoney(banknotes, coins);
} } class Out { class In {
public In() {
System.out.println("in");
}
} static class staticIn {
public staticIn() {
System.out.println("staticIn");
}
} } // 9. 子类继承外部类的非静态内部类时,子类构造器必须显式的调用父类的构造器
class Sub extends Out.In {
public Sub(Out out) {
out.super();
}
} // 9.1 子类可以直接继承外部类的静态内部类,故优先使用静态内部类会更加方便
class Sub2 extends Out.staticIn { } @FunctionalInterface
interface Face {
void show();
} @FunctionalInterface
interface Egg {
void show(int num);
} @FunctionalInterface
interface Wallet {
int countMoney(int[] banknotes, int[] coins);
} @FunctionalInterface
interface Wallet2 {
int countMoney(int banknote, int coin);
} @FunctionalInterface
interface Converter {
Integer convert(String str);
} @FunctionalInterface
interface MyTest {
String test(String a, int b, int c);
}
【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类的更多相关文章
- 【Java】-NO.16.EBook.4.Java.1.011-【疯狂Java讲义第3版 李刚】- AWT
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.011-[疯狂Java讲义第3版 李刚]- AWT Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.012-【疯狂Java讲义第3版 李刚】- Swing
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.011-[疯狂Java讲义第3版 李刚]- Swing Style:EBook Series:Jav ...
- 【Java】-NO.16.EBook.4.Java.1.012-【疯狂Java讲义第3版 李刚】- JDBC
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.012-[疯狂Java讲义第3版 李刚]- JDBC Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.005-【疯狂Java讲义第3版 李刚】- 枚举
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.005-[疯狂Java讲义第3版 李刚]- 枚举 Style:EBook Series:Java Si ...
- 【Java】-NO.16.EBook.4.Java.1.006-【疯狂Java讲义第3版 李刚】- 垃圾回收
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.006-[疯狂Java讲义第3版 李刚]- 垃圾回收 Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]- Java基础类 Style:EBook Series:J ...
- 【Java】-NO.16.EBook.4.Java.1.008-【疯狂Java讲义第3版 李刚】- 集合/容器
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.008-[疯狂Java讲义第3版 李刚]- 集合 Style:EBook Series:Java Si ...
- 【Java】-NO.16.EBook.4.Java.1.009-【疯狂Java讲义第3版 李刚】- 泛型
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.009-[疯狂Java讲义第3版 李刚]- 泛型 Style:EBook Series:Java Si ...
- 【Java】-NO.16.EBook.4.Java.1.010-【疯狂Java讲义第3版 李刚】- 异常
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.010-[疯狂Java讲义第3版 李刚]- 异常 Style:EBook Series:Java Si ...
- 【Java】-NO.16.EBook.4.Java.1.001-【疯狂Java讲义第3版 李刚】- UML
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.001-[疯狂Java讲义第3版 李刚]- Style:EBook Series:Java Since ...
随机推荐
- 7.8CSS部分的学习!
<!DOCTYPE html> <html> <head> <title>CSS元素选择器</title> <style type=& ...
- E - Radar Installation
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...
- day3 三、基本数据类型和运算符
一.多行注释和单行注释 """ 多行注释 多行注释 多行注释 """ # 单行注释 # print('hello world') # pri ...
- WebLogic初学笔记
这两天在公司自己摸索着用WebLogic(因为可以问的同事不多),之前一直用的是tomcat.面对一个从不了解的技术,自己摸索似乎非常背劲.后来有同事指点果然事半功倍. 项目使用WebLogic版本: ...
- .NET Core开发日志——HttpContext
之前的文章记述了从ASP.NET Core Module到KestrelServer的请求处理过程.现在该聊聊如何生成ASP.NET中我们所熟悉的HttpContext. 当KestrelServer ...
- 【绿书】 模拟,rep大坑
https://vjudge.net/contest/229603#problem/B 绿书题 大模拟,绿书上用了个比较麻烦的输入,其实只要getchar()!='0'就行 坑: rep(i,0,s. ...
- 一道hive SQL面试题
一.hive中实现方法 基表: 组表: gt gid gname 1001 g1 1002 g2 1003 g3 create table g( gid int, gname string )ro ...
- 在windows下用nvm 安装node
nvm 可以帮助切换node版本 在此文中,会特意指明一些坑,防止再次踩坑.第一个坑就是,如果你已经单独安装了node,建议先卸载,再来看本文. 1. nvm 下载 nvm 的下载地址:https:/ ...
- Flannel配置详解
1.简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信, Flannel是CoreOS开发,专门用于docker多机 ...
- linux进程状态D
运行在KVM虚拟机里的一些进程突然出了问题,这些出了问题的进程无法用kill杀掉,使用ps可以看到这些进程处于D状态: [build@kbuild-john ~]$ ps -a -ubuild -o ...