面向对象

本文详细介绍了面向对象编程的基础概念,包括类、对象、封装、继承、多态等核心概念。通过实例展示了类的定义、对象的创建以及构造方法的使用。同时,讨论了方法重载、this关键字、静态成员、继承、方法重写、抽象类和接口等高级特性。此外,还提及了包的使用、访问控制符、javabean规范以及多态带来的好处。面向对象编程的原则如OCP和依赖倒置也有所提及。
摘要由CSDN通过智能技术生成

面向对象

对某一类事物的共性进行抽象,形成的叫类

面向对象与面向过程?

  • 面向过程是以方法为单位进行组织

  • 面向对象是以类为单位进行组织

合适的方法应该出现在合适的类中

面向对象特征

封装、继承、多态

基本概念

什么叫类?

对同类个体(对象)的共性进行抽象,形成的叫做类.

###类的特点

共性:

  • 属性(成员变量)

  • 行为(动作、方法)

一个文件中可以有多个类,但是只允许有一个类是public的,并且public这个类的名字要和文件名一致。

推荐做法: 一个文件一个类

类的定义

使用关键字class来进行定义

>calss{

}

对象

以类为模板创建出来的具体的某一个东西 叫做对象。

以为类模板创建对象的这个过程我们称为对象的实例化

使用new来创建对象

  • 属性的使用

    设置属性的值 :对象名.属性名 = 值;

    获取属性的值 :对象名.属性名

  • 方法的使用

    调用方法 : 对象名.方法名();

构造方法

  • 与类同名,没有返回类型(连void都没有)

  • 构造方法在创建对象的时候进行调用

  • 只要写好一个类(class)之后,这个class中自动会有一个没有参数的构造方法存在

    如果这个类中自己手动加了有参数的构造方法,那么这个没有参数的构造方法就消失了。

    如果非要调用没有参数的构造方法,需要在类中手动声明。

    public class A {
        A(){//手动声明的没有参数的构造方法
    ​
        }
       
        A(int a){//构造方法
            System.out.println("A的构造方法。。。。");
    ​
        }
        void A(){//不是构造方法
            System.out.println("普通方法。。。。");
        }
    ​
        public static void main(String[] args){
            A a = new A();
        }
    ​
    } class A {
        A(){//手动声明的没有参数的构造方法
    ​
        }
       
        A(int a){//构造方法
            System.out.println("A的构造方法。。。。");
    ​
        }
        void A(){//不是构造方法
            System.out.println("普通方法。。。。");
        }
    ​
        public static void main(String[] args){
            A a = new A();
        }
    ​
    }

     

方法重载

overload

  • 针对体是针对的方法

  • 什么样的方法构成重载,满足以下特点:

    1、方法名相同

    2、参数不同(参数的类型或者参数的个数不同)

    3、与返回类型无关

站在调用者的角度,你调用方法的时候能正确区分调用的是哪个方法,那么这两个方法就构成重载

 

构造方法同样支持重载

this

  • this只能出现在方法(非static的普通方法和构造方法)中

  • this就指的当前对象(谁调用 this就是谁)

  • 使用this调用构造方法

    • 直接使用this调用而不要使用this.

    • 必须方法构造方法的第一行

static

  • 可以修饰属性、方法、修饰内部类

    • static修饰属性的时候,这个属性的值是公用的,所有对象用的这个变量都是同一个值(对于这种static的属性我们可以使用类名.属性的方式进行访问)

    • 如果一个方法是static方法,那么这个方法可以使用对象.方法名调用,也可以使用类名.方法名调用

      如果这个方法是static方法,那么他直接调用(不是使用对象.方法名 这种方式调用)的其他方法应该是static方法

      非static的属性或者方法,只能使用对象去访问

      非static方法中,可以直接访问static或者非static的属性

      static方法中,只能直接访问static的属性或者static方法。

  • 什么时候使用static?

    • 如果这个属性 要公有的时候就需要声明static

    • 工具类中的方法一般都是static

  • static块、匿名块、构造方法

    • 执行顺序: static块----匿名块----构造方法

    • 执行次数: static块只执行一次

      匿名块和构造方法 产生一个对象就执行一次。

       

继承

  • 为什么要有继承

  • 代码层面怎么实现继承(extends)

  • 类与类之间是什么样的关系才能构成继承关系( is a)

  • 注意点

    在创建子类对象的时候,调用子类的构造方法,在调用子类构造方法的过程中,默认先调用父类的无参构造方法,如果父类没有无参的构造方法,那么会报错。

    解决办法:

    1、在父类加无参构造方法

    2、使用super调用父类有参数的构造方法(只能放在第一行)

     

重写

override overwrite

  • 针对的是方法(方法的重写)

  • 要有继承

  • 特点:

    • 重写方法与被重写方法具有相同的方法名,相同的参数,返回类型一致或者兼容 (可以是子类)

    • 重写方法不 能使用比被重写方法更严格的方法控制权限

    • 未讲

  • 如何来检验是否是构成重写 : @Override

Object

  • toString()

    将一个对象用字符串的形式表示出来,默认的实现是:包名+类名 @ 十六进制hash码

    更多的时候这个默认实现对我们来说毫无意义,所以我们需要重写 toString方法

    在输出这个对象的时候默认会调用这个对象的toString方法。

  • equals()

    用于判断两个对象是否相等

    默认的实现 == (比较的引用地址)

    重写

     public boolean equals(Object obj){
            //用于自己定义两个 狗对象  怎么才算相等的标准
            if(this == obj) return true;
            if(obj instanceof  Dog){//判断 obj是狗的类型
                Dog d = (Dog)obj;
    //            if((this.id == d.id) && this.name.equals(d.name)){
    //                return true;
    //            }
    ​
                return (this.id == id) && (this.name.equals(d.name));
            }
            return false;
    ​
        }public boolean equals(Object obj){
            //用于自己定义两个 狗对象  怎么才算相等的标准
            if(this == obj) return true;
            if(obj instanceof  Dog){//判断 obj是狗的类型
                Dog d = (Dog)obj;
    //            if((this.id == d.id) && this.name.equals(d.name)){
    //                return true;
    //            }
    ​
                return (this.id == id) && (this.name.equals(d.name));
            }
            return false;
    ​
        }

     

  • hashcode()

    返回这个对象的hashcode的值(可以认为是这个对象的身份证号)

  • wait()

  • notify()

  • clone(): 自学

  • finalize()

包是类的容器,分隔类名空间;

##为什么使用包?

1、类重名问题

2、具有相同功能,一类 我们应该归到一起

包的使用

使用package来声明包,包里面建类

import

import a.b.c.D;(精确导入) 推荐

import a.b.c.*(模糊导入)

 

有一个包下的类是不需要import的,这个包就是java.lang包

包命名

公司的域名 倒着写

所有的包名都是小写的

访问控制符

private、default(不写,并不是使用default关键字来修饰)、protected、public

  • 都能修饰类(private\protected 修饰的是内部类)、都能修饰属性、都能修饰方法

  • private修饰的属性或者方法 只能在当前类能访问

  • default修饰的属性或者方法 只能同包的类中能访问(当前类能访问)

  • protected修饰的属性或者方法 只要在子类中都能访问(可以不同包 ,当前类能访问)

  • public 都能访问

使用的时候遵循的原则: 能用最小就不用最大的。

javabean的规范

遵循javabean规范的 我们一般才称为javabean(狭义javabean)

规范:

1、属性私有化

2、提供对应的getter 和setter方法

3、需要提供无参的构造方法

抽象类

  • 抽象类的来历

    反正子类都要重写父类的方法,那么父类这个方法的实现就毫无意义,我们只需要方法的签名就可以了,在java中只有方法的签名没有方法的实现,这个方法只能是abstract或者native修饰,在这里指的是abstract的,一个类中只要有一个方法是abstract的,那么这个类一定是abstract的。

  • 注意点

    所以抽象类天生就是用来被继承的。

    抽象方法就是用来被重写的。

    1、有抽象方法的类一定是抽象类

    2、抽象类中一定有抽象方法吗?(不一定)

    3、抽象类有构造方法

    4、抽象类不能实例化

final

  • 能修饰类、属性、方法

  • final修饰的类 是不 能被继承的

  • final修饰的属性 或者变量都是常量

  • final修饰的方法 不能被重写的

接口

为什么引入接口?

接口 解决java中类的单继承问题

接口强调的能力

接口具有什么样的特点?

接口中的方法全是抽象方法,默认是public abstract的(jdk8之前是正确的),jdk8之后里面允许有default方法

接口中的变量 一定是常量,默认是public static final的

接口中是没有构造方法的

  • 接口和类之间的关系

    类与类 只能继承关系 一个类只能继承一个类

    类与接口 是实现关系 一个类可以实现多个接口

    接口与接口是继承关系,并且可以是多继承

接口与抽象类

区别:

1、抽象类中的方法不一定是抽象方法,接口中的方法绝大多数都是抽象(除了default)

2、接口中的变量一定是常量,抽象类中的变量不一定是常量

3、抽象中有构造方法 ,接口没有构造方法

 

接口和抽象类、普通类的选择?

1、满足is-a关系 继承关系 has-a的关系应该是实现关系

2、根据 是否是常量来进行选择

3、为了满足多继承,可以设计为接口

多态

  • 如何来认识多态

    1、有继承或者实现 2、要有重写 3、父类引用指向子类对象

  • 带来的好处

    扩展性

面向对象的原则

  • OCP原则

  • 职责单一

  • 依赖倒置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值