1.什么是面向对象

1.1 引入

在Java语言的开发中有一中说法是:世间万物皆对象,即花鸟鱼虫,飞禽走兽点都可以是对象,那么我要去思考的是如何把这些对象用编程的思想去理解,又如何去展现?

1.2 概念

面向对象是相对于①面向过程的,通过对现实世界进行②理解和抽象的方式,把复杂的事物变得简单的一种③编程思想(OOP Object Oriented Programming)

①面向过程:(Procedure Oriented)是一种以过程为中心的编程思想,是以什么正在发生为主要目标进行编程。
②理解和抽象:现实世界中的一切事物都有两个特性,即静态的属性(一个事物的名字,性质等)和动态的方法(爬山,读书,打篮球等)。这些事物都有公共的部分,例如静态的标识一个事物的ID,名字...,又例如动态的表示事物方法的动,静...在以编程的方式呈现这些对象的时候就可以把这些事物都有的静态属性和动态方法抽取出来,只写一份让所有对象使用,就可以大大简化代码了,这就是编程的思想中的抽象。

1.3 对于类和对象的理解

image.png

1.3.1 类

类就是一类事物的统称(人类),是Java语言的基本单位,是事物的模板和设计图。

1.3.2 对象

对象是对类的具体化(小明),对象的状态来描述对象的基本特征,对象的行为用来描述对象的功能,对象的唯一标识指的是对象在内存中的唯一地址,用来和其他对象区分。

1.4 面向对象的特征

1.4.1 封装

通过类这个载体把对象的属性和行为封装为“类组件”,对于客户影藏具体的实现细节,只提供公共的访问方法,一方面提高了程序的安全性,一方面提高了代码的重用性,是面向对象的核心。

1.4.2 继承

子类自动继承父类的属性和方法,使得子类在遇到和父类同样的问题时,就可以用父类的方法来解决,实现了复用,是类与类之间的关系表现形式。

1.4.3 多态

将父类对象应用于子类的特征就是多态,增强了软件的灵活性和重用性。

1.5 面向对象的语法

1.5.1 类的创建和使用

package com.mtingcat.javabasis.object;
public class Student {
    public static void main(String[] args) {
        Person tom = new Person();
        tom.name = "tom";
        tom.age = 12;
        tom.sex = "Man";
        System.out.println(tom.name+","+tom.age+","+tom.sex);
        tom.Breathe();
        tom.Move();
    }
}

class Person{
    /**
     * 1.成员变量
     *     类的属性(特征)
     *     全局变量
     */
    String name;
    int age;
    String sex;
    
    /**
     * 2.成员方法
     *     类的方法(行为)
     */
    void Breathe(){
        /*
         * 局部变量:
         *     局部变量是在方法被执行时创建,在方法执行结束时被销毁,局部变量在使用时必须进行赋值操作或者被初始
         *    化,否则会出现编译错误
         *    可以将局部变量的有效范围称之为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止
         */
        @SuppressWarnings("unused")
        String air;
        System.out.println("呼吸");
    }
    void Move(){
        @SuppressWarnings("unused")
        String power;
        System.out.println("运动");
    }
}

1.5.2 对象在内存中的存储

image.png

1.5.3 单一对象在内存中的存储

image.png
①在栈内存中,创建一个引用变量p,持有对象的地址值
②在堆内存中,创建Person对象,并且开辟变量的空间,完成初始化
③给堆内存中的元素,分配一个唯一标志,地址值。交给p去保存。
④p.name=”lisi”;p.age=20;就去堆内存中找唯一的地址值,找到Person对象,并对其属性进行修改赋值。
⑤p.eat();就去堆内存中找唯一的地址值,找到Person对象,执行Person对象的方法。

1.5.4 程序时如何创建对象的:

image.png

image.png

1.6 构造器

1.6.1 构造方法

构造方法是一个与类同名并且返回值类型为同名类类型的一种特殊的函数,会在对象创建的时候用到。

1.6.2 作用和形式

作用

① 对对象进行初始化操作
② 完成类对象的创建

形式
修饰符 类名(参数){
    构造体
}

① 程序默认自带一个无参的构造方法。
② 如果手动添加了构造方法,那么系统默认的构造方法就会被覆盖,调用系统默认的无参构造方法的时候会调用失败(除非自己写了无参构造方法)。
③ 在定义构造方法的时候,构造方法是没有返回值的,,但是与普通的没有返回值的方法不同,普通的没有返回值的方法要用void修饰,但是构造方法不需要。

1.6.3 案例

使用系统默认的构造方法
class Bird{
    String name;
    int id;
    
}

image.png

使用手动添加的无参构造方法
class Bird{
    String name;
    int id;
    public Bird(){
        System.out.println("这是手动添加的无参构造方法");
    }
    
}

image.png

使用手动添加的无参有参构造方法
class Bird{
    String name;
    int id;
    public Bird(){
        System.out.println("这是手动添加的无参构造方法");
    }
    public Bird(String name){
        this.name = name;
        System.out.println("这是手动添加的有参构造方法");
    }
    public Bird(String name,int id){
        this.name = name;
        this.id = id;
        System.out.println("这是手动添加的全参参构造方法");
    }
    public String look(){
        System.out.println("局部代码块");
        return "gree";
    }
    
}

image.png

1.6.4 构造方法代码块和局部方法代码块 this关键字

1.6.4.1 构造方法代码块

① 在类的内部,方法外部,的代码块。
② 通常用于抽取构造方法中的共性代码。
③ 每次调用构造方法前都会调用构造代码块。
④ 优先于构造方法加载。
⑤ 局部变量是在方法被执行时创建,在方法执行结束时被销毁,局部变量在使用时必须进行赋值操作或者被初始 化,否则会出现编译错误。

1.6.4.2 局部方法代码块

① 在方法里面的代码块。
② 通常用于控制变量的作用范围,出了括号就失效即代码的生命周期。
③ 变量的范围越小越好,成员变量会有线程安全问题。
④ 构造代码块是最优先的,局部代码块顺序执行。

1.6.4.3 this关键字

当类中的成员变量与成员方法中的参数重名时需要用this进行区分。

1.7 继承:

1.7.1 形式

class Student extends Person{
    String grade;
    int score;
    public String exam(){
        return "exam";
    }
}

class Person{
    int id;
    String name;
    String sex;
    public String eat(){
        return "eat";
    }
}

image.png

1.7.2 特点

① 使用extends关键字
② 相当于子类把父类的功能复制了一份
③ java只支持单继承
④ 继承可以传递(爷爷,儿子,孙子的关系)
⑤ 不能继承父类的私有成员
⑥ 继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展
⑦ 像是is a 的关系

1.7.3 案例

image.png

package com.mtingcat.javabasis.object.construct;

public class studeng {
    public static void main(String[] args) {
        Student st1 = new Student("Cat","Man","三",100);
        System.out.println(st1.name+","+st1.sex+","+st1.grade+","+st1.score);
    }
}

class Student extends Person{
    String grade;
    double score;
    public Student(String name,String sex,String grade,double score){
        this.name = name;
        this.sex = sex;
        this.grade = grade;
        this.score = score;
    }
    public void showSleep(){
        super.sleep();
    }
    public String eat(){
        return "eat============";
    }
    public String exam(){
        return "exam";
    }
}

class Person{
    int id;
    String name;
    String sex;
    public String sleep(){
        return "sleep";
    }
    public String eat(){
        return "eat";
    }
}

1.7.3 super关键字

① 通过super关键字可以使用父类的内容
② super代表父类的一个引用对象
③ 如果用,必须出现在调用位置的第一行

1.7.4 方法的重写

① 发生在父子类中,方法名称相同,参数列表相同,方法体不同
② 重写方法被调用时,主要看的是对象的类型
③ 重写需要遵循"两同两小一大"
两同:1方法名称相同,2参数列表相同
两小:1派生类(子类)方法的返回值类型要小于或者等于超类(父类)方法的(void时----->必须相等,基本类型时-->必须相等,引用类型时--->小于或者等于,.派生类方法抛出的异常小于或者等于超类方法的)
2派生类方法抛出的异常小于或者等于超类方法的
一大:派生类方法的访问权限大于或者等于超类方法的
注意:
① 父类中的私有方法不能被重写
② 子类重写父类方法时,修饰符要大于等于父类修饰符的权限

1.7.5 实现

image.png

package com.mtingcat.javabasis.object.construct;

public class studeng {
    public static void main(String[] args) {
        Student st1 = new Student("Cat","Man","三",100);
        System.out.println(st1.name+","+st1.sex+","+st1.grade+","+st1.score);
        System.out.println(st1.sleep());
        System.out.println(st1.eat());
        System.out.println(st1.exam());
    }
}

class Student extends Person{
    String grade;
    double score;
    public Student(String name,String sex,String grade,double score){
        this.name = name;
        this.sex = sex;
        this.grade = grade;
        this.score = score;
    }
    public void showSleep(){
        super.sleep();
    }
    public String eat(){
        return "eat============";
    }
    public String exam(){
        return "exam";
    }
}

class Person{
    int id;
    String name;
    String sex;
    public String sleep(){
        return "sleep";
    }
    public String eat(){
        return "eat";
    }
}

1.8 拓展

1.8.1 this和super的区别

① this代表本类对象的引用,super代表父类对象的引用。
② this用于区分局部变量和成员变量。
③ super用于区分本类变量和父类变量。
④ this.成员变量 this.成员方法() this(【参数】)代表调用本类内容
④ super.成员变量 super.成员方法() super(【参数】),代表调用父类内容
⑤ this和super不可以同时出现在同一个构造方法里,他们两个只要出现都得放在第一行,同时出现的话,到底第一行放谁呢。

1.8.2 方法的重写和重载的区别

image.png

① 重载:是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
② 重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
③ 重写是父类与子类之间多态性的一种表现
④ 重载是一类中多态性的一种表现


MTingCat
12 声望2 粉丝

一路向阳。