Java面向对象(基础总结)

Java面向对象(基础总结)

面向对象是一种编程思想。

  • 面向对象的三大基本特征:
    • 封装
    • 继承
    • 多态
  • 面向对象的编程思想就是把事物看作一个整体,从事物的特征(属性)和行为(方法)两个方面进行描述。
  • 面向对象的过程就是找对象、建立对象、使用对象、维护对象的关系的过程

面向过程和面向对象

面向过程面向对象
设计思路自顶向下、层次化、分解自底向上、对象化、综合
程序单元函数模块对象
设计方法程序=算法+数据结构程序=对象=数据+方法
优点相互独立,代码共享,性能相对较高接近人的思维方式, 使用灵活,易维护、易复用、易扩展
缺点修改、维护困难性能相对较低
  • 面向对象是基于面向过程的
  • 面向对象能让复杂的问题简单化,程序员不需要了解具体的实现过程,只需要指挥对象去实现功能(从执行者变成指挥者)。

举例:

  • 洗衣服:
    • 使用面向过程思考:放入衣服 -> 打开洗衣机 -> 洗衣服 -> 关闭洗衣机
    • 使用面向对象思考:洗衣服我们操作了洗衣机这个对象,所以只要给洗衣机这个对象增加这些功能,就可以实现洗衣服操作。放入衣服 -> 洗衣机:打开、洗衣服、关闭
  • 面向过程:强调步骤;面向对象:强调对象。

面向对象的三大核心特性

  • 可重用性:代码重复使用,减少代码量,提高开发效率。面向对象的三大基本特征(继承、封装和多态)都围绕这个核心。
  • 可扩展性:指新的功能可以很容易地加入到系统中来,便于软件的修改。
  • 客观理性:能够将功能与数据结合,方便管理。

抽象

所谓的抽象,就是把同一类事物中共有的特征(属性)和行为(功能、方法)进行抽取,归纳,总结。

抽象的过程其实就是面向对象编程的核心思想

类:用来描述一类具有相同特征(属性)和相同行为(方法)的对象。(可以比喻为模板)

  • Java中用class关键字来描述类

    • 成员属性(变量):对应的就是事物的属性
    • 成员方法:对象事物的行为
  • 类的定义:

    public class 类名{
        //成员变量
        //成员方法
    }
    
  • 定义类:就是定义类的成员,包括成员变量和成员方法

  • 类的成员:

    • 成员变量:和之前定义的变量几乎时一样的,只不过位置发生了改变,成员变量位于类中,任何方法之外。
    • 成员方法:和之前定义的方法几乎是一样的,只不过把static关键字去掉

类和对象的关系:

  • 类是对象的抽象
  • 对象是类的实例化

对象

对象(Object)是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。

它们是有形的,如一个人、一件物品;也可以是无形的,如一个计划、一次交易。(万事万物,皆对象

  • 创建对象

    类名 对象名 = new 类名();
    
  • 使用对象:

    调用成员变量:

    对象名.成员变量;

    调用成员方法:

    对象名.方法名(参数列表);

  • 成员变量(属性)都有默认值,所以在声明成员变量时,可以不用初始化(默认值和数据类型有关:)

    数据类型默认值
    byte0
    short0
    int0
    long0
    float0.0
    double0.0
    booleanfalse
    char空字符
    引用类型null
全局变量(成员变量)
  • 定义在方法的外部,类的内部。使用范围是整个类
  • 不需要初始值
  • 存储在堆内存中(对象存在时才在存在)
局部变量

(方法中的变量)

  • 定义在方法的内部或者某一个语句块的内部,适用范围仅限于方法内或者语句块内
  • 必须有初始值
  • 存储在栈内存
成员方法
  • 语法:

    访问修饰符 返回值类型 方法名称(参数列表){
        方法体
    }
    
    • 访问修饰符:public
    • 返回值类型由返回值决定
  • 成员变量可以直接在成员方法中使用,但是main方法中如果调用成员变量和方法必须通过对象.属性名\方法名(参数列表)的形式来调用

  • 成员方法之间的调用,直接写方法名(参数列表)即可

构造方法

对象一建立就会调用构造方法,可以创建对象,给成员变量(属性)初始化

  • 方法名和类名相同
  • 没有返回值和void,没有return
  • 不能被static等关键字修饰
  • 可以方法重载(定义多个参数列表不同的构造方法)
  • 当一个类中没有写构造方法时,系统会默认给该类一个默认的无参构造方法。当自己定义构造方法后默认的构造方法就不存在了。(自己定义有参的构造方法后,如果还想使用无参的构造方法,就要自己再添加一个无参的构造方法)
public class Animal {
    String name;
    int age;
    //构造方法
    public Animal(){
        System.out.println("------无参的构造方法------");
        name = "动物";
        age = 0;

    }
    public Animal(String name,int age){
        System.out.println("------有参的构造方法------");
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        //创建对象
        Animal a1 = new Animal();
        System.out.println(a1.name+","+a1.age);

        Animal a2 = new Animal("兔子",2);
        System.out.println(a2.name+","+a2.age);
    }
}
this关键字

this代表它所在方法所属对象的引用。哪个对象调用的this所在的方法,this就代表哪个对象。

  • 在没有static关键字修饰的方法中使用

  • this关键的字用来区分成员变量和局部变量同名的情况:

    public class Student{
        //成员变量
        String name;
        int age;
        int classNum;
    
        public Student(String name,int age,int classNum){    
            //s1调用了构造方法,所以这里的this代表s1对象
            this.name = name; //成员变量name=局部变量name
            this.age = age;
            this.classNum = classNum;
        }
        
        public static void main(String[] args){
            Student s1 = new Student("张三",18,1);
            System.out.println(s1.name);//打印 张三
        }
    }
    
  • this关键字在构造方法中的第一行以 this(参数列表) 的形式出现时,就表示当前构造方法调用了该类中其他的构造方法(于参数列表相匹配的构造方法):

    public class Test1 {
        
        public Test1(){
            this("张三",18);
        }
        public Test1(String name,int age){
            System.out.println("姓名:"+name+",年龄:"+age);
        }
    
        public static void main(String[] args) {
            Test1 test1 = new Test1();
        }
    }
    

封装

封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。

  • 封装的目的在于保护信息,保证数据的安全性
  • 封装包括两个方面:属性的封装和方法的封装
  • Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问, 封装不是绝对的封装,如果想要访问封装起来的数据,可以通过指定的入口即可
  • 属性和方法的封装两者时相辅相成、密不可分的

继承

程序中的继承性是指子类拥有父类的全部特征和行为,这是类之间的一种关系。

  • 继承的特点:
    • 继承要有一定的层次结构,而且还要具备一定的可传递性
    • 子类继承了父类的所有属性和方法,但是不包括私有属性(private)和构造方法
    • 子类继承父类的属性和方法同时也可以有自己的属性和方法。
    • Java 只支持单继承。 也就是说一个子类只能有一个父类,父类可以有多个子类
  • 继承可以减少重复代码、提高了复用性和维护性
  • 继承让类与类之间产生了关系,类的耦合性增强了,父类发生变化子类也会跟着改变
      //子类继承父类        (继承前面的Animal)
      public class Dog extends Animal{
          public Dog(){
              super();
              System.out.println("---dog---无参的构造方法------");
          }
          public Dog(String name,int age){
              super(name, age);
          }
      	//测试
          public static void main(String[] args) {
              Dog dog = new Dog();
              Dog d2 =new Dog("狗",10);
              System.out.println(d2.name+",age:"+d2.age);
          }
      }

运行结果:

------无参的构造方法------
—dog—无参的构造方法------
------有参的构造方法------
狗,age:10

继承中的构造方法
  • 创建有继承关系的子类对象时,会先执行父类中默认的构造方法,然后执行子类中相关的构造方法
  • 如果父类中不存在默认的构造方法,那么此时的解决问题,第一种就是手动添加一个默认的构造方法。
super关键字
  • 表示当前类的父类的引用
  • 只能出现在有继承关系的子类中
  • super两种用法:
    • super.属性名、super.方法名(参数列表)
      • 表示父类的属性和方法,和子类中的属性或方法重名时使用
    • super(参数列表)
      • 出现在子类构造方法的第一句代码时
      • 就是通过参数列表匹配父类的构造方法来创建父类对象

多态

多态就是同一函数在不同类中有不同的实现;

  • 面向对象的多态性,即“一个接口,多个方法”。
  • 多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。
  • 多态性允许一个接口被多个同类使用,弥补了单继承的不足。

实例:

//父类
public class Animal {
    public void talk(){
        System.out.println("讲话");
    }
}
*******************************************
//子类
public class Cat extends Animal{
    public void talk(){
        System.out.println("喵喵");
    }
}
*******************************************
//子类
public class Dog extends Animal{
    public void talk(){
        System.out.println("汪汪");
    }
}
*******************************************
//测试类
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.talk();
        //以父类的名义实例化
        Animal dog = new Dog();
        //以子类自己的方法实现
        dog.talk();
        Animal cat = new Cat();
        cat.talk();
    }
}

运行结果:

讲话
汪汪
喵喵

利用父类类型实例化,子类覆写父类的方法后,运行时,动态的再指向子类的实现,即为多态 详解

对象的内存分析

在这里插入图片描述

  • 通过上图分析,我们可以理解,在栈内存中运行的方法,遵循“先进后出,后进先出”,对象b指向堆内存中的空间,在调用方法时,也去堆内存中寻找方法信息,然后去方法区执行对应的方法
面向对象是一种编程思想,通过这种思想可以将复杂的事物简化。它基于面向过程,强调结果而不是过程。面向对象的编程中,类是将具有相似行为或属性的事物抽象或集合而成的。对象是类的具体实例,是类的模板。在Java语言中,可以通过类来描述现实世界的事物,将事物的属性作为成员变量,将行为作为成员方法。类和对象的创建与使用可以通过class关键字创建类,通过new关键字创建对象。类与对象在内存中的存储通过引用来实现。 Java面向对象基础知识还包括封装、构造方法、构造代码块、局部代码块、this关键字、继承、static关键字、多态、抽象类、接口等。封装是面向对象的三大特征之一,可以用来保护类的成员变量。构造方法用于创建对象的同时初始化对象的成员变量。构造代码块在创建对象时执行,并且在构造方法之前执行。局部代码块是在方法内部定义的代码块。this关键字指代当前对象。继承是面向对象的重要特性,可以通过父类和子类之间的关系实现代码的复用。static关键字用于修饰成员变量和成员方法,可以实现数据的共享。多态是指一个对象可以有多种形态,能够根据上下文自动选择使用哪种形态。抽象类和接口是抽象类型的具体表现,可以提高程序的复用率和可维护性。 在Java中,由于不允许多重继承,如果要实现多个类的功能,则可以通过实现多个接口来实现。面向接口和面向抽象类的编程是提高程序复用率和可维护性的重要手段。正确地使用接口和抽象类是面向对象编程的关键。 总结一下,Java面向对象基础知识包括类与对象、封装、构造方法、构造代码块、局部代码块、this关键字、继承、static关键字、多态、抽象类、接口等概念和特性。掌握这些知识可以帮助我们更好地进行面向对象的编程。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值