java多态与内部类

多态

同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果要想实现多态的效果 需要现有继承关系
体现:

  1. 父类类型的引用 指向 子类的对象 Person p = new Teacher();
  2. 该引用只能调用父类中定义的属性或方法
  3. 如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果
    如果父类与子类有同名的属性 执行父类的属性
    如果父类与子类有同名的方法(重载) 执行子类重写之后的方法
  4. 若想要调用子类中独有的成员 (强制类型转化) 造型 铸型 (向上/向下转型)
  5. 造型时(强制向下转型时) 可能会出现一个运行时异常
    ClassCastException 造型 铸型 异常
    如果想要避免造型的异常 可以用instanceof关键字来进行判断
    对象 instanceof 类
        //1.创建对象
		          Person p = new Teacher();//自动向上转型  Teacher--->Person
		          p.eat();
		          p.sleep();
		          p.talk();
          //如果想要调用子类独有的属性或方法
          //需要将类型还原会真实类型    强制类型转化  造型  向上转型  向下转型
		         Teacher t = (Teacher)p;
		          t.eat();
		          t.sleep();
		          t.talk();
		          t.teach();

内部类

指的是在Java中可以将一个类定义在另一个类的内部
内部类可以定义在 类的内部 (与类成员层次一致)
内部类可以定义在 方法/块内部 (与类成员相差一个层次 方法的局部变量一个层次)

  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 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();
        }
    }
    //匿名内部类(主要是针对那些不能直接创建对象的抽象类和接口而来的)
    Person p=new Person(){
            public void eat(){
                System.out.println("匿名");
            }
        };
	//静态内部类
    private static class InnerDemoStatic{

    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值