【学习】面向对象

一. 面向对象思想介绍

面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的。(C语言)

面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的功能。(Java,C++,Python)

 

类与对象

类是对象的描述  对象是类的实体。

  • 前提 :  Java中想要创建对象, 必须要先有类的存在
  • 类 :  是一组相关属性和行为的集合,  将其看做为是对象的设计图
  • 对象 : 根据类(设计图)创建出来的实体.
  • 关系 :

    依赖关系 :  需要根据类创建对象

    数量关系 :  一对多的关系,  根据一个类创建出多个对象

对象内存图

单个对象内存图

 

两个对象内存图

两个引用指向相同内存图 

 

成员变量和局部变量的区别

 

 

this关键字

this关键字的作用:可以调用本类的成员(变量, 方法)解决局部变量和成员变量的重名问题

this可以解决的问题

  • 问题:在一个类中,如果成员变量和局部变量重名了,那么在使用的时候,会使用谁?
    • Java 会根据就近原则优先使用局部变量
  • 问题:非要使用成员变量怎么办?
    • 可以使用 this 关键字进行区分
  • 总结:

        this 可以调用本类的成员(成员变量,成员方法)

        使用 this 可以区分出成员变量和局部变量的重名问题.

 this本质

this 代表当前类对象的引用(地址)

public class Student {
    public void print(){
        System.out.println("打印this关键字----------------" + this);
    }
}


public class Demo3This {
    public static void main(String[] args) {
        Student stu1 = new Student();
        System.out.println("打印stu1对象名----------------" + stu1);
        stu1.print();

        Student stu2 = new Student();
        System.out.println("打印stu2对象名----------------" + stu2);
        stu2.print();
    }
}


打印stu1对象名----------------com.itheima.mthis.Student@7b23ec81
打印this关键字----------------com.itheima.mthis.Student@7b23ec81
打印stu2对象名----------------com.itheima.mthis.Student@6acbcfc0
打印this关键字----------------com.itheima.mthis.Student@6acbcfc0

this内存图解

 

构造方法

构造方法介绍

构建、创造对象的时候,所调用的方法

09-构造方法介绍.png

 

构造方法格式

1.方法名与类名相同,大小写也要一致

2.没有返回值类型,连void都没有

3.没有具体的返回值(不能由return带回结果数据)

构造方法执行时机

1.创建对象的时候调用,每创建一次对象,就会执行一次构造方法

2.不能手动调用构造方法

构造方法的作用

1.本质作用:创建对象

2.结合构造方法执行时机:给对象中的属性(成员变量)进行初始化

构造方法内存图解

构造方法也是方法,在执行的时候,也会进入栈内存

10-构造方法执行内存图解.png

 

二、面向对象三大特性

三大特性之封装

封装介绍

隐藏实现细节,仅对外暴露公共的访问方式

封装在代码中的常见体现:

将属性抽取到当中,这是对数据的一种封装

将代码抽取到方法中,这是对代码功能的一种封装

私有成员变量,提供setXxx和getXxx方法

封装的好处:

1、提高了代码的安全性

2、提高了代码的复用性

private 关键字

是一个权限修饰符

可以修饰成员(成员变量和成员方法)

private修饰的成员只能在本类中才能访问

针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供get变量名()方法,用于获取成员变量的值,方法用public修饰
  • 提供set变量名(参数)方法,用于设置成员变量的值,方法用public修饰
  • 权限修饰符,权限修饰符可用来修饰成员
    • private
    • (defalut)
    • protected
    • public
  • 被 private 修饰的成员,只能在本类中进行访问

 标准 JavaBean 编写


● 成员变量使用 private 修饰
● 构造方法
        ○提供一个无参构造方法【推荐必需】
        ○提供一个带参的构造方法【建议要有】
● 成员方法
        ○提供每一个成员变量对应的 setXxx() / getXxx()

三大特性之继承

把多个类中的共同属性和方法提取出来,定义成一个类;由关键字extends来实现父子关系,除了不能继承父类中private,final 修饰的【属性】或者【方法】还有【构造方法】,其他都能继承并且能调用:

注意:

  • 当父类中与子类中属性或者方法同名时候的调用格式:this和super。
  • 当父类中的方法不满足子类要求时候,还可以重写方法。
  • 父类中非私有的成员变量、方法

继承体系

支持单继承,不能多继承。

但可以多层继承:A->extends B ->extends C   A间接继承了C

所有的类默认直接或间接继承于Object类

子类访问父类构造方法

子类创建对象的特点
⚫ 特点:子类对象创建时, 默认先执行父类的无参构造方法。
⚫ 原理:在子类的所有构造方法的第一行,默认有super(),表示调用父类的无参构造方法。


如果父类中没有无参构造器,会出现什么现象呢?
⚫ 会报错。因为子类默认是调用父类无参构造器的。

public class Person {
    private String name;
    private int age;


    public Person() {
    }

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

public class Teacher extends Person{
    private String salary;


    public Teacher() {
        super(); //默认隐藏
    }

    public Teacher(String name, int age, String salary) {
        super(name, age); //父类有参构造器
        this.salary = salary; //子类有this初始化
    }
}

super 与 this

super关键字是在子类对象内部指代其父类空间的引用

super:指定的是父类中的内存,代之父类对象。

  • 需要注意:必须放到首位(第一行)
  • 常在父类和子类同名的时候使用(方法名或者是变量名)
  • 在子类的构造方法中,内存会默认调用super()——调用父类的无参构造

this:代指这个对象;

 

方法重写

在子类中创建一个父类一模一样的方法,覆盖掉父类的方法

使用场景:如果子类觉得父类的方法不够满足自己的需求,就重写

重写的方法是非私有的

条件

  • 必须有继承关系
  • 一般与父类的方法格式保持一致,只能改写方法体【推荐】
  • @Overwrited为格式检查注解
  • 权限关系:必须大于父类。
  • 返回值类型:比父类小或等
  • 私有方法和静态方法不能被重写。 还有final

image.png

 

三大特性之多态

概念

多态是同一个行为具有多种不同表现形式。属性不具有多态性。

基于继承\实现的一种现象,一定要有方法重写

在Java中的体现形式是:
⚫ 父类的引用指向子类的对象。
⚫ 接口的引用指向实现类的对象。

Printer p1 = new ColorPrinter();

printer为父类,ColorPrinter为子类。

多态的前提

有继承/实现关系

有方法重写

有父类引用指向子类对象

多态访问成员访问特点

方法的调用 :

父类中必须有同名的方法,否则会报错。(方法重写)

左边看编译,右边看运行。Animal a =new Dog ( );

多态的表现方式

对象多态 : 父类\接口 对象名 = new 子类();

行为多态 :方法重写之后,调用子类的方法

注:属性是没有多态

我们平时指的多态一般是行为多态

多态的优缺点

多态优点:

1.解耦【方案的切换】
2.提高代码的扩展性。
定义方法时,如果将父类 或 接口 作为参数,在调用方法
时,可以传递任意子类对象极大提高方法的通用性。


多态缺点:——由instanceof关键字解决
多态下不能使用子类的特有功能

多态的类型转换

package com.itheima02多态的特点和类型转换;

/*
    多态的缺点:
        在多态下,无法访问子类特有的成员。
    解决办法:
        使用强制类型转换
                Animal a = new Dog();
                Dog dog = (Dog) a;
        解决类型转换异常:使用 instanceof 判断类型
 */
public class Test02 {
    public static void main(String[] args) { 
        //自动类型转换 【向上转型】
        Animal a = new Dog();

        //强制类型转换(向下转型)
        //可能有类型转换异常 ClassCastException
        //在强转前,做类型的判断
        /*
            对象名 instanceof  类名
                判断 对象   
        */
        if(a instanceof Dog){
            Dog dog = (Dog) a; //强转
            dog.lookHome();
        }else {
            System.out.println("当前类型不是Dog"); 
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值