zoukankan      html  css  js  c++  java
  • 面向对象思想

    面向对象思想(理解)

      a.面向对象与面向过程对比:

        面向对象注重的是结果,不注重过程

        面向过程既注重过程也注重结果,面向过程得实现每个细节

    举例:烤鸭:

              面向过程:鸭苗慢慢养大变成鸭大

                       烤箱

                       拔毛洗鸭子掏内脏

                       配料涂抹鸭子

                       扔进烤箱拷

                       出炉吃胡的鸭子

              面向对象:

                     请去全聚德

                     给钱

                     吃鸭子

     

    面向对象的优点

     

        1.面向对象由原来的执行者变成了指挥者(调用者,领导者)

     

        2.面向对象思想更贴近于现实生活

     

        3.面向对象可以讲复杂事物简单化,因为面向对象只注重结果

    局部变量与成员变量

    1.定义位置

           局部变量:方法内

           成员变量:类内方法外

    2.作用域

           局部变量:方法内

           成员变量:整个类都能使用

    3.默认值与所在内存空间

           局部变量:方法栈,和方法同生(随着方法入栈)共死(方法执行完局部变量也被销毁),局部变量没有默认值,要想使用必须先赋值后使用

           成员变量:堆中,和对象同生(new的时候属性存在于堆中)共死(堆中的对象被回收),有默认值

    面向对象之封装

    封装的体现

         :封装了属性和方法

         方法:封装了很多语句

    封装的好处:

          1.提高代码的安全性(为年龄在setAge()加判断)

          2.提高了代码的复用性(例如方法一旦定义好可以多次调用)

       c.封装的实现:private,getter与setter

    this关键字作用

         1.为了区分成员变量和局部变量

         2.谁调用成员方法,该成员方法中的this就指向谁

    继承

    概述

        1.有继承关系的两个类必须遵循现实事物的客观规律

     2.子类会自动拥有父类的所有非private修饰的成员(成员属性和成员方法)

    继承的优点

         1.在父类中定义的所有子类共有的属性和方法,子类继承父类,子类中就不用再重复定义

           提高了代码的重用性

     

    继承的注意事项

     

         1.Java中的继承都是单继承

         2.Java中所有的类都直接或间接继承自Object类

           Java中所有的类都具有Object类中非private成员属性和方法

    重载和重写对比:

    权限修饰符

               重载:与权限修饰符无关

               重写:子类的方法的权限>=父类的方法的权限(如果父类是private,子类就不能继承,何谈重写)

    方法名

               重载:重载的两个方法名必须相同

               重写:重写的两个方法名也是必须相同

    形参列表

               重载:重载的两个方法形参列表必须不同

                     形参类型

                     形参个数

                     形参类型的顺序

                     以上三点至少满足一个

               重写:重写的两个方法形参列表必须相同

     

    返回值类型

               重载:重载与返回值类型无关

               重写:重写的两个方法返回值必须相同

    抽象类特点

        1.抽象的类不能new对象

        2.含有抽象方法的类一定是抽象类

        3.抽象类既可以有抽象方法,也可以有非抽象方法

        4.抽象类中可以没有一个抽象方法,作用

          a.不想让该类创建对象

          b.子类继承该抽象类,可以直接拿到抽象类中的方法使用

    接口

    概念

        接口是一种约束,规则,规范

        例如:

          笔记本上的各种接口:例如USB接口,要想传输数据必须实现USB接口上的规范(设备得制作成方形,还得有4个金属触点)

          电源接口:电源要么有两相,要么有三相的,这个是由电器协会规定的

    特点:

       1.接口中所有的方法都是抽象方法

       2.接口中的变量都是常量

       3.要想使用接口不能创建接口的对象,因为接口中的所有方法都是抽象方法

         new 接口调用抽象没有任何意义.必须创建一个类去实现接口,然后创建该实现类的对象

    定义:(重点)

    interface Father{
          public abstract void method();//接口中方法的修饰符,可写可不写或者写一部分
                                       //但是在编译后方法上的修饰符一定是public abstract
          
          void method(int i);//虽然什么都没写,最后还是要被编译器加上public abstract
          public void method(double i);//虽然只写了public,最后还是要被编译器加上public abstract
    
          public static final int a=3;//static:在类外可以直接通过Father.a来调用不用再创建对象,然后通过
                                      //对象名来调,简化了书写 
                                      //final:被final修饰的变量是常量(恒定不变的量),一旦被final修饰,只能赋值一次
                                      //Father.a=10;//错误,不能重复赋值
                                        Father.a;
                                        Father f=new Father()
                                        new Father().a
       }

    接口的使用方式:

        1.一个类实现一个接口
        interface Father{
           public abstract void method(); 
    
        }
        class Son implements Father{
           @Override//防止忘掉重写
           public void method(){
    
           }
        }  
        Son son=new Son();
        son.method(); 
       2.一个类只实现了接口中的部分抽象方法
           interface Father{
              public abstract void method(); 
              public abstract void method2(); 
           }
            abstract class Son implements Father{//因为Son类仅实现了method()方法,而method2()这个抽象方法被继承下来没有重写
                                                 //那么这个Son类依然是抽象类(含有抽象方法的类一定是抽象类)
              @Override//防止忘掉重写
              public void method(){
    
              }
           }  
        3.一个类实现多个接口:接口中的方法都是抽象方法
          interface Father{
             public abstract void method(); 
          }
          interface GanFather{
            public abstract void method(); 
          }
          abstract class Son implements Father,GanFather{ 
             @Override
             public void method(){//由于接口中的方法都是抽象方法,那么Father接口中的method()和ganFather中的method()方法
                                  //同时被重写(实现)
    
             }
          }  
        4.一个实现继承类的同时还实现接口
          interface Father{
             public abstract void method(); 
          }
          interface GanFather{
            public abstract void method(); 
          }
          class OldGanMother{
              public void oldGanMotherJiang(){
                  System.out.println("老干妈牛肉酱,拌饭吃着香");
              }
          }
         class Son extends OldGanMother implements Father,GanFather{ 
             @Override
             public void method(){ 
    
             }
    
          }  
        5.一个接口可以继承多个接口:因为接口中的方法都是抽象方法,没有方法体,不会存在歧义
          interface Father{
             public abstract void method(); 
          }
          interface GanFather{
            public abstract void method(); 
          }
          interface GanDaughter extends Father,GanFather{
    
          }

    抽象类和接口对比:

    相同点:

           1.抽象类和接口中都可以含有抽象方法

           2.都不可以直接new对象

           3.都需要子类来继承或者实现

    不同点:

           1.接口中的方法一定是抽象方法,并且都是public abstract修饰

           2.一个类只能继承一个抽象类,但是一个类可以实现多个接口

    多态

    概述(多种形态)

       人的一生:(人的一生有很多形态,但是自始自终都是一个人)

                     

           宝宝,孩子,学生,程序员,丈夫,爸爸,爷爷,曾爷爷,go to dead

    封装:

         类和方法体现

         封装提高了代码复用性

    继承:

         实现了父子关系,让类与类产生关系

         继承提高了代码复用性,为多态提供了前提条件

    多态:

         父类引用指向子类对象

         多态提高了代码的复用性和拓展性

    构造方法(构造函数,构造器 constructor)

    作用

         在创建该类的对象的时候,给该类的属性赋值(初始化该类属性)

    注意事项

         1.如果一个类中没有写任何构造函数,编译器在编译该类后会默认添加一个空参构造

             public 类名(){

            }  

           如果手动给出的构造方法,编译器就不在添加默认构造方法,想用,手动写

         2.在new对象的时候一定会找相应形参的构造方法执行

    thissuper

     

     a.this关键字

     

        1.this关键字:

     

          a.我们可以使用this.成员变量名来区分同名的成员变量和局部变量

     

          b.构造方法和非static修饰的方法都有this引用,谁new对象,或者是通过对象调用方法,

     

            该方法(构造方法和成员方法)this就指向调用方法的对象 (简单来说:谁调用我,我就指向谁)

     

        2.this(参数)//this语句:

     

          1.this(参数)调用本类中的其它构造方法,调用的构造方法由传递参数来决定

     

          2.this()语句一定放在构造方法的第一行,如果不写,第一行根本没有默认的this()语句

     b.super关键字

        1.super关键字:

         a.我们可以使用 super.成员变量/super.成员方法 来使用父类的非private修饰的成员变量和成员方法

           当子类的成员和父类的成员重名的时候,我们用super调用父类的成员

        2.super(参数)//super语句:

         a.super(参数)会自动调用父类的构造方法,调用父类哪个构造方法还是由传递的参数决定

         b.super(参数)语句一定也是放在构造方法第一行,如果不写,第一行会自动添加super()语句

           如果第一行已经写了this(参数)语句,super(参数)语句不再添加,虽然第一行写了this(参数)

           会调用其它的构造方法,但是该构造方法依然要走父类的构造方法

    3.综合案例:

     public class Person {
         private String name;
         private String sex;
         public Person(String name,String sex){
             this.name=name;
             this.sex=sex;
         }
         public String getName() {
             return name;
         }
    
         public void setName(String name) {
             this.name = name;
         }
    
         public String getSex() {
             return sex;
         }
    
         public void setSex(String sex) {
             this.sex = sex;
         }
    
     }
     public class Student extends Person {
         private String sno;//学生编号
           
         //具有姓名,性别,学号参数的构造器
         public Student(String name,String sex,String sno){
              super(name,sex);//将共有的属性交给父类来初始化
                              //而子类特有的属性自己初始化
              this.sno=sno;//儿子自己的初始化动作
         }
         public Student(String name,String sex){
             this(name,sex,"默认:110");//name,sex不再由Student(String name,String sex)来初始化
                                   //而交给它的兄弟public Student(String name,String sex,String sno)来初始化
         }                        //this("江旻(min)","LitteLitteBoy","默认:110")
         
         
          
         
         public String getSno() {
             return sno;
         }
    
    
         public void setSno(String sno) {
             this.sno = sno;
         }
         public String getStuInfo(){
             return super.getName()+".."+super.getSex()+".."+this.sno;
         }
         
     }
     public class Demo {
         public static void main(String[] args) {
            Student s=new Student("山山","LittleBoy","201310101");//学生一有就
                                                      //让它具有姓名,性别,学号
            System.out.println(s.getName()+"..."+s.getSex()+"..."+s.getSno());//前两个getXX方法都是Student从父类继承下来的
               Student s2=new Student("江旻(min)","LittleLittleBoy");//学生一有就
               //让它具有姓名,性别,学号
                System.out.println(s2.getName()+"..."+s2.getSex()+"..."+s2.getSno());//前两个getXX方法都是Student从父类继承下来的
               System.out.println(s2.getStuInfo());
         
         }
     }

     

  • 相关阅读:
    BZOJ 2226 [Spoj 5971] LCMSum | 数论拆式子
    BZOJ 2705: [SDOI2012]Longge的问题 | 数论
    BZOJ 1257[CQOI2007]余数之和sum | 数论
    BZOJ 3781: 小B的询问 | 莫队
    文件切割与合并
    [科普贴]为何Flash被淘汰?附Chrome看视频最完美教程!
    JQ模仿select
    JS正则表达式
    Vuejs——Vue生命周期,数据,手动挂载,指令,过滤器
    Vuejs——v-on
  • 原文地址:https://www.cnblogs.com/xwb583312435/p/9115018.html
Copyright © 2011-2022 走看看