Java基础之面向对象

Java面向对象

面向过程&面向对象

  • 面向过程思想
    • 步骤清晰简单,第一步做什么,第二部做什么...
    • 面对过程适合处理一些较为简单的问题
  • 面向对象思想
    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
  • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

什么是面向对象

  • 面向对象变成(Object-Oriented Programming,OOP)
  • 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
  • 抽象
  • 三大特性:
    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是现有对象后有类。对象,是具体的事物。类是抽象的,是对对象的抽象。
  • 从代码运行角度考虑是先有类后又对象。类是对象的模板。

类与对象的关系

  • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
    • 动物、植物、手机、电脑...
    • Person类、Pet类、Car类等,这些类都是用来描述或者定义某一类具体的事物应该具备的特点和行为
  • 对象是抽象概念的具体实例
    • 张三就是一个人的具体实例,张三家里的旺财就是狗的一个具体实例
    • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

创建和初始化对象

  • 使用new关键字创建对象

  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

  • 类中的构造器也成为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void
  • new一个对象的本质就是调用了一个构造器。

    public class Person {
        //一个类即使什么都不写,也会存在一个方法
        //显示的定义构造器
    
        String name;
    
        //实例化初始值
        //1.使用new关键字,必须要有构造器,new的本质就是调用了一个构造器
        //2.用来初始化值
        //无参构造
        public Person(){
    
        }
    
        //有参构造:一旦定义了有参构造,无参构造就必须显式定义,就是必须写出来
        public Person(String name){
            this.name=name;
        }
    }
    
    //一个项目应该只存在一个main方法
    public class Application {
    
        public static void main(String[] args) {
            Person person = new Person("zls");//括弧里没有参数就会调用无参构造,有参数调用有参构造
            System.out.println(person.name);
        }
    
    }
    

封装

  • 程序追求”高内聚,低耦合“。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露少量的方法给外部使用。
  • 封装(数据的隐藏)
    • 通常,应禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问,这称为信息隐藏。
  • 封装就是属性的私有,具体代码表现就是get方法和set方法

封装的作用

  1. 提高程序的安全性,保护数据
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 系统可维护性增加了

继承 extends

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

  • extends的意思是”扩展“,子类是父类的扩展。

  • Java中只有单继承,没有多继承

  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

  • 子类和父类之间,从意义上讲应该具有”is a”的关系。例如:student is a person

  • 在Java中,所有的类都默认继承Object类

  • 使用private修饰的,私有的东西,无法被继承

super

  • 调用父类的,与this对比,this是调用当前的
public class Student extends Person{
	//Student类的无参构造
    public Student(){
        //隐藏代码:调用父类的无参构造
        //super();调用父类的构造器,必须要在子类的第一行
    }
}
  • super注意点:
    • super调用父类的构造方法,必须在构造方法的第一个
    • super必须只能出现在子类的方法或者构造方法中
    • super和this不能同时调用构造方法

方法重写 Override

  • 重写就是子父类出现了一模一样的方法。当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。

  • 重写的规则

    1. 方法名必须相同。
    2. 参数列表必须相同
    3. 修饰符:范围可以扩大但是不能缩小 : public>protected>default>private
    4. 抛出的异常:范围可以被缩小但是不能扩大: ClassNotFoundException ---> Exception(大)

多态

  • 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作

  • 多态成员变量:编译运行看左边

    父 f = new 子();

    sout(f.num);//f是父中的值,只能取到父中的值

  • 多态成员方法:编译看左边,运行看右边

    父 f1 = new 子();

    sout(f1.show());//f1的门面类型是父,但实际类型是子,所以调用的是重写后的方法。

instanceof

  • instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Object object = new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
System.out.println("==========================");
Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//false
System.out.println(person instanceof String);//编译报错,两者不能比较
System.out.println("==========================");
Student student = new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
System.out.println(student instanceof Object);//true
System.out.println(student instanceof Teacher);//编译报错,两者不能比较
System.out.println(student instanceof String);//编译报错,两者不能比较

类型转换

//在子类Student中存在一个go方法
Person obj = new Student();
//如果想用obj来调用这个go方法,就要进行类型转换,父到子的过程需要强制转换
((Student)obj).go();//Student obj1 = (Student) obj; obj1.go();
//子类型转换父类可以直接转换,但是可能会丢失自己本来的一些方法
  • 父类引用可以指向子类的对象
  • 如果把子类转换成父类,向上转型,不需要强制转换
  • 把父类转换为子类,向下转型,需要强制转换
  • 方便方法的调用,不需要重新new一个对象,减少了重复的代码。

抽象类 abstract

  • abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
  • 抽象类不能使用new关键字来创建对象,它是用来让子类继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
  • 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

接口 interface

  • 接口只有规范,接口内无法写方法,使约束和实现分离。

  • 面向对象的精髓,就是对对象的抽象,最能体现这一点的就是接口,为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。

  • 实现了接口的类,就要重写接口的方法,接口的方法必须被重写。

  • 作用:

    1. 约束
      2. 定义一些方法,让不同的人实现
      3. 所有的方法都是默认public abstract
      4. 所有的常量都是默认public static final
      5. 接口不能被实例化,因为接口中没有构造方法
      6. implements可以实现多个接口
posted @ 2021-03-31 15:28  凊兰  阅读(56)  评论(0)    收藏  举报