面向对象(四)

多态

多态:一种事物的多种形态
行为多态
多态的前提:继承|实现
多态的最终表现形式:父类引用指向子类对象
多态的调用:

成员变量:
编译运行看父类|左边|类型
成员方法:
编译看父类|左边|类型 ,运行看子类|右边|对象

注意

 如果没有配合方法的重写,多态就没有意义。

代码:

public class Class001_Poly {
    public static void main(String[] args) {
        Person sp=new Student();//多态
        sp.test();//多态的调用
    }
}
class Person{
    String str="父类";
    public  void  test(){
        System.out.println("父类---->test");
    }
}
class Student extends Person{
    String str="Student";
    public  void  test(){
        System.out.println("Student---->test");
    }
}
class  Teacher extends  Person{
    String str="Teacher";
    public  void  test(){
        System.out.println("Teacher---->test");
    }
}

基本 : 数据类型转换

    自动类型提升 : 小 ---> 大
    强制类型转换 : 大 ---> 小
        小范围类型 变量 = (小范围类型)大范围类型数据;

引用 : 转型

    小: 子类   大 : 父类
    向上转型 : 子类 --> 父类
    向下转型 : 父类 --> 子类
            子类类型 变量 = (子类类型)父类引用;
            需求 : 当多态调用不能调用子类独有内容时候,可以向下转型,然后调用子类独有内容

java.lang.ClassCastException类型转换异常
    在向下转型的时候,如果抓成其他的子类类型,就会遇到这个异常

instanceof 运算符
    引用 instanceof 类型 : 判断前面的引用是否指向后面类型的对象或者后面类型的子类对象,如果是返回true,不是返回fales

代码:

public class Class001_Cast {
    public static void main(String[] args) {
        int i = 1;
        //自动类型提升
        long l = i;
        //强制类型转换
        int i2 = (int)l;


        Zi zi = new Zi();
        //向上转型
        Fu fu = zi;
        //多态
        Fu f = new Zi(); //f对子类新增内容不可见



        //向下转型
        //Zi zi2 = (Zi)f;  //Zi zi2 = new Zi();  --> 可以调用子类独有内容
        //转型转错了,转成了其他的子类类型---> java.lang.ClassCastException类型转换异常

        if(f instanceof Brother){
            Brother zi2 = (Brother)f;  //Brother zi2 = new Zi();  --> 可以调用子类独有内容
            zi2.test();
        }else if(f instanceof Zi){
            Zi zi2 = (Zi)f;
            zi2.test();
        }

        System.out.println(f instanceof Fu);  //T
        System.out.println(f instanceof Zi);  //T
        System.out.println(f instanceof Brother);  //F
    }
}
class Fu{}

class Zi extends Fu{
    String str="Zi";
    void test(){
        System.out.println("子类Zi方法test");
    }
}

class Brother extends Fu{
    String str="Brother";
    void test(){
        System.out.println("子类Brother方法test");
    }
}

Object

    Object : 老祖宗类
    是java中所有类的父类
    如果一个类没有显示的继承父类,默认继承自Object类

toString : 返回对象的字符串表现形式

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    当输出一个对象 的引用的时候,输出的是对象的引用调用toString方法的返回值==>默认调用toString

为什么要在子类中重写toString方法 :

        因为输出对应的引用时候不想是打印对象的地址值,想要输出对象的所有属性值,对从Object中继承的toString需要,toString实现不满意,在子类中重写toString

注意 : 当定义javabean类型,规范都需要重写toString

== : 比较两个数据是否相等
    基本 : 数据值
    引用 : 对象地址值
equals : 比较两个对象数据是否相等
    Object类中的equals方法 : 默认比较对象的地址值
        public boolean equals(Object obj) {
            return (this == obj);
        }

为什么要子类中重写equals方法 :

        使用Object类的equals方法,默认比较对象地址,业务需求想要比较根据对象的属性值比较是否相等,可以在子类中根据需要重写equals,实现比较对象所有属性而非地址值

注意:

    javabean的定义规范 :
        1.类是公共的
        2.至少提供一个空构造
        3.属性私有化
        4.公共的访问方式
        5.重写equals与toString方法

代码:

public class Class001_Object{
    public static void main(String[] args) {
        Student s1 = new Student(1001,"张三丰",100);
        Student s2 = new Student(1001,"张三丰",10);
        System.out.println(s1);
        System.out.println(s1.toString());

        System.out.println(s1.equals(""));;
    }
}

class  Student{
    int no;
    String name;
    int age;

    public Student(){}
    public Student(int no,String name,int age){
        this.no = no;
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return no+"-->"+name+"-->"+age;
    }

    //比较字符串类型的数据 : 使用String重写的equals比较字符串对象的内容而非地址
    public boolean equals(Object obj) { //Object obj = new Student(1001,"张三丰",100);
        //增强程序健壮性判断
        if(this==obj){
            return true;
        }
        //两个对象 : this  obj
        //obj向下转型
        if(obj instanceof Student){
            Student s = (Student)obj;
            //两个对象 : this  s
            return this.no==s.no && this.age==s.age && this.name.equals(s.name);
        }
       return false;
    }
}

abstract

abstract 抽象的

抽象类 : 被abstract修饰的类
抽象方法 :

  被abstract修饰的方法
        没有方法体
        必须存在与抽象类中

需求 : 定义开发部门不同职位工作内容

    开发部门 Develop --> work()
    java攻城狮 : work--> 后端开发
    web程序猿 :  work--> 前端开发

注意 :

    1.抽象类不能实例化
    2.抽象方法必须存在与抽象类中
    3.抽象类中可以定义可以不定义抽象方法,可以定义任意内容
    4.抽象类的使用 :
        1)具体子类对象调用成员
            重写所有的抽象方法 + 按需新增
        2)抽象子类
            按需重写 + 按需新增
    5.抽象方法必须被重写的,但是只需要重写一次,按需重写多次
    6.abstract不能与private,final,static,native一起使用

代码:

public class Class001_Abstract {
    public static void main(String[] args) {
        //抽象类不能实例化
        //Develop d = new Develop();

        //具体子类对象
        Java java = new Java();
        java.sleep();
        java.work();
        java.test();
        java.insert();
    }
}

//父类
abstract class Develop{
    //work方法体不知道怎么写,不知道写什么--->
    public abstract void work();
    public abstract void sleep();

    public void test(){
        System.out.println("抽象方法的test");
    }
}

//具体子类
class Java extends Develop{

    @Override
    public void work() {
        System.out.println("后端开发");
    }

    @Override
    public void sleep() {
        System.out.println("边敲代码边睡觉... ");
    }

    //新增
    public void insert(){
        System.out.println("java中新增方法");
    }
}

//抽象子类
abstract class Web extends Develop{

    @Override
    public void work() {
        System.out.println("前端开发");
    }

    //新增
    public void webInsert(){
        System.out.println("web 新增");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库的表转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的表名和字段名的支持,例如表名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成的Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选表功能,在文本框中已选中的表在打开选表对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值