- 银行案例
package com.uncle.strategy.src.bank;
/**
* 内部类
* 指的是在Java中可以将一个类定义在另一个类的内部
* 内部类可以定义在 类的内部 (与类成员层次一致)
* 内部类可以定义在 方法/块内部 (与类成员相差一个层次 方法的局部变量一个层次)
* LinkedBox Node内部类
*
* *1.成员内部类
* 将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
* 成员内部类可以与正常类一样 使用不同的修饰符来修饰
* 好处1.省略了一个.java文件 好处2.成员内部类中可以访问外部类的所有成员 包括私有的
* 若想要在内部类中通过对象.调用外部类成员 外部类.this.外部类成员;
* 内部类存在后 源代码进行编译 产生一个字节码 Demo$InnerDemo.class
* 2.局部内部类
* 将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
* 局部内部类像是一个局部的变量一样,不能用public protected private及static
* 只能用abstract或final
* 局部内部类命名规则Demo$1InnerTestMethod Demo$2InnerTestMethod
* 局部内部类使用的变量只能是final修饰
* *3.匿名内部类
* 成员匿名内部类
* 局部匿名内部类
* public interfase Test{
* public void test();
* }
* Test t = new Test(){
* public void test(){
* }
* };
* 通常接口或抽象类的具体子类这样写
* 开发中为了省略一个类文件 上述写法比较常见
* 匿名内部类很特殊 只有类体 没有类的所有结构( 修饰符 名字 继承 实现)
* 不能用任何修饰符来修饰 匿名内部类也没有构造方法
* Swing 做一个按钮 绑定一个事件监听器
* 4.静态内部类
* 成员静态内部类
* 不需要外部类对象,通过正常的方式直接创建内部类
* 静态元素不能访问非静态成员(自己类和外部类)
*/
public class Test {
public static void main(String[] args){
Bank bank = new Bank();
Person p = new OldMan("长者");
bank.profession(p);//银行欢迎长者进来办理业务
// Person p = new YoungMan("年轻人");
// bank.profession(p);
// Person p = new Toff("土豪");
// bank.profession(p);
//按照刚才的设计 可能有问题
//1.三个不同的人类方法名不一致(可以)
//2.银行办理业务的方法写了三个
//解决如上所述的问题 可以在三个人类之上创建一个父类
//1.解决三个人类中的相同代码 比如name属性 比如get方法之类的
//2.父类定义的三个方法可以是抽象 解决了子类命名不一致的问题 子类执行也不一致
//3.父类可以作为参数传入银行
}
}
package com.uncle.strategy.src.bank;
public class Bank {
//开门 等待用户进来办理业务
public void profession(Person person){
System.out.println(person.getName()+"客户进入银行啦");
person.callNumber();
person.transact();
person.leave();
}
}
package com.uncle.strategy.src.bank;
public class OldMan extends Person{
public OldMan(){}
public OldMan(String name){
this.name=name;
}
//1.进银行 叫一个号码 排队
public void callNumber(){
System.out.println("年事已高 不知道在哪儿叫号 请求大堂经理的帮忙");
}
//2.去窗口办理
public void transact(){
System.out.println("到窗口 掏出手绢儿 拿出存折 取钱");
}
//3.办理完毕离开啦
public void leave(){
System.out.println("办理完毕 慢慢的离开啦");
}
}
package com.uncle.strategy.src.bank;
public abstract class Person {
protected String name;
public String getName(){
return this.name;
}
//1.进银行 叫一个号码 排队
public abstract void callNumber();
//2.去窗口办理
public abstract void transact();
//3.办理完毕离开啦
public abstract void leave();
}
package com.uncle.strategy.src.bank;
public class Toff extends Person{
public Toff(){}
public Toff(String name){
this.name=name;
}
//1.进银行 叫一个号码 排队
public void callNumber(){
System.out.println("我是土豪我有钱 不需要叫号排队 直接进入VIP窗口");
}
//2.去窗口办理
public void transact(){
System.out.println("我是土豪我有钱 甩一张限量黑卡 取1000W 买车");
}
//3.办理完毕离开啦
public void leave(){
System.out.println("帅气的提着一袋子钱离开啦");
}
}
package com.uncle.strategy.src.bank;
public class YoungMan extends Person{
public YoungMan(){}
public YoungMan(String name){
this.name=name;
}
//1.进银行 叫一个号码 排队
public void callNumber(){
System.out.println("自己知道在门口按按钮 拿到号码小票");
}
//2.去窗口办理
public void transact(){
System.out.println("去窗口 汇款");
}
//3.办理完毕离开啦
public void leave(){
System.out.println("办理完迅速离开啦");
}
}
- 匿名内部类
package com.uncle.strategy.src.innerclass;
public class TestMain {
public static void main(String[] args){
//内部类属于外部类的(相当于是一个成员) 需要外部类对象才能操作
//创建内部类的对象---调用内部类的方法
Demo demo = new Demo();
Demo.InnerDemo innerDemo = demo.new InnerDemo();
//调用内部类的方法
innerDemo.testInnerDemo();
//静态的成员内部类
//InnerDemoStatic ids = new InnerDemoStatic();
}
}
package com.uncle.strategy.src.innerclass;
public class Demo {
private String name = "这是正常类中的属性";
public void testDemo(){
System.out.println("这是正常类中的方法");
}
public void testDemoOne(){
String s = "";
//定义一个局部内部类
class InnerTestMethod{
//局部内部类中使用的局部变量都需要加final修饰
}
}
public void testDemoTwo(){
String s;
//定义一个局部内部类
class InnerTestMethod{
}
}
//成员内部类
public class InnerDemo{
private String name="我是内部类的属性";
public void testInnerDemo(){
System.out.println("我是成员内部类的方法:"+this.name);
Demo.this.testDemo();
}
}
private static class InnerDemoStatic{
}
}