Java面向对象

本文深入探讨了面向对象编程的概念,包括类与对象的区别、属性和局部变量的异同、构造器的使用以及内存分析。重点阐述了封装、继承、多态等核心特性,并介绍了JavaBean、接口、抽象类与内部类的应用。此外,还讨论了静态与非静态代码块、对象的创建和初始化、以及方法重写等相关知识点。
摘要由CSDN通过智能技术生成

面向对象

面向对象(抽象)

面向对象的本质是:以类的方式组织代码,以对象的组织(封装)数据

对象的创建分析

类的声明

属性和局部变量:

  • 相同点:

    1. 定义变量的格式,数据类型 变量名 = 变量值
    2. 先声明,后使用
    3. 变量都有其对应的作用域
  • 不同点:

    1. 在类中声明的位置不同

      • 属性:直接定义在类的一对{}内
      • 局部变量:声明方法内,方法形参,代码块内,构造器形参构造器内部的变量
    2. 关于权限修饰符的不同

      • 属性:可以在声明属性时指明其权限,使用权限修饰符

        常用的权限修饰符:private,public,缺省,protected -->继承

      • 局部变量:不可以使用权限修饰符

    3. 默认初始化值

      • 属性:类的属性,根据其类型,都有默认初始化值,

        整型(byte,short,int,long):0

        浮点型(float,double):0.0

        字符型(char):0(或‘\u000‘)

        布尔型(boolean):false

        引用数据类型(类,数组,接口):null

      • 局部变量:没有默认的初始化值

        意味着,我们在调用局部变量之前,一定要显示赋值

        特别的,形参在调用时,我们赋值即可

    4. 在内存中加载的位置

      • 属性:加载到堆空间中(非static)
      • 局部变量:加载到栈空间

类和对象的关系

类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是不能代表某一个具体事物

对象是抽象概念的具体实例

类是对象的模板

创建初始化对象

使用new关键字创建对象

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

匿名对象:

  • 没有显示的赋给一个变量名,即为匿名对象
  • 特征:匿名对象只能调用一次
  • 使用
构造器
  • 类中的构造器也称为构造方法,是在进行创建对象时必须调用的,其特点:

    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void
    • 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
  • 作用:

    1. 使用new关键字本质是在调用构造器

      有参构造:一旦定义了有参构造,无参构造就必须显示定义

    2. 用来初始化值

  • 注意:定义了有参构造之后,如果想要使用无参构造,显示的定义一个无参的构造

创建对象内存分析

Java内存

堆 唯一目的是存放对象实例

栈 是指虚拟机栈,虚拟机栈用于存储局部变量

方法区 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

JavaBean

一种Java语言写成的可重用组件

所谓JavaBean是指符合如下标准的Java类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get,set方法

UML类图

+表示public类型,-表示private类型,#表示protected类型

方法的写法:方法的类型(+,-) 方法名(参数名:参数类型):返回值类型

面向对象的三大特性

封装
  • 作用:

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

  • 属性私有,private:私有

  • get/set

    提供可以操作该属性的方法, 提供一些public的get,set方法 alt+insert可以自动生成方法

    • get 获得这个数据
    • set 给这个数据设置值
继承

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

extends的意思是扩展,子类是父类的扩展,子类继承了父类就会继承父类所有的方法

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

  • object类:Java中,所有的类都默认直接或间接继承object类

  • super —— this

    super注意点:

    1. super调用父类的构造方法,必须在构造方法的第一个
    2. super必须只能出现在子类的方法或构造方法中
    3. super和this不能同时调用构造方法

    VS this:

    1. 代表的对象不同:
      • this:本身调用者这个对象
      • super:代表父类对象的应用
    2. 前提:
      • this:没有继承也可以使用
      • super:只能在继承条件下使用
    3. 构造方法:
      • this:本类的构造
      • super:父类的构造
  • 方法重写 重写是方法的重写,与属性无关 overried 重写

    子类的方法和父类必须要一致;方法体不同

    静态方法:只与左边定义的数据类型有关

    非静态方法:重写

    需要有继承关系,子类重写父类的方法

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

Object类 java.lang.Object

Object类中的功能(属性,方法)具有通用性

Object类只声明了一个空参的构造器

多态

对象的多态性:父类的引用指向子类的对象

多态的使用,虚拟方法调用

方便方法的使用,可以减少重复的代码

注意事项:

  1. 多态是方法的多态,属性没有多态

  2. 父类和子类,有联系, 类型转换异常ClassCastException

  3. 存在条件:继承关系,方法需要重写,父类引用指向子类

    不能重写的方法:

    • static方法属于类,不属于实例
    • final方法
    • private方法

instanceceof和类型转换

子类转换为父类,强制转换,可能丢失一些方法

static关键字

static静态代码块,随类一起执行,只执行一次

==和equal()的比较
  • == 运算符

    1. 可以引用基本数据类型和引用数据类型

    2. 比较基本数据类型,比较两个变量保存的数据是否相同

      比较引用数据类型,比较两个对象的地址值是否相同,即两个对象是否指向同一个对象实体

  • equal 方法而非运算符

    1. 只能使用与引用数据类型

    2. Object类中equal()的定义:

          public boolean equal(Object obj){
              return (this == obj);
          }
      

      说明:Object类中定义的equal和==作用是相同的,比较两个对象的地址是否相同,即两个引用是否指向同一个对象实体

    3. 像String、Date、File、包装类等都重写了Object中的equal()方法,重写以后比较的不是两个地址是否相同,而是比较两个对象的“实体内容”是否相同

    4. equal()重写

      对称性,自反性,一致性,任何情况下,equal(null)返回false

代码块(或初始化块)

作用:用来初始化类,对象

只能用static修饰

静态代码块和非静态代码块:

  • 静态代码块

    内部可以有输出语句

    随着类的加载而执行

    初始化类的信息

    如果一个类中定义了多个静态代码块,按照声明先后顺序执行

    静态代码块的执行优先于非静态代码块

    静态代码块内只能调用静态的属性,方法

  • 非静态代码块

    内部可以有输出语句

    随着对象的创建而执行

    每创建一个对象,就执行一次非静态代码块

    创建对象时,对对象的属性初始化

    非静态代码块年可以调用静态的属性,方法,非静态的属性,方法

//static的代码块
static{
    System.out.println("hello,static clock");
}
//非static的代码块
{
    System.out.println("hello block");
}

抽象类和接口

抽象类(抽象的抽象,约束)

在类前面使用abstract即可变成抽象类,类的本质还是继承,(接口可以实现多继承)

abstract用在方法上,为抽象方法,只有方法的名字,没有方法的实现

抽象类的所有方法继承了它的子类,都必须要实现它的方法,除非子类也是abstract

不能new出来,只能靠子类实现它

抽象方法必须在抽象类中

//是否存在构造器,存在的意义(抽象出来,提高开发效率)

接口

声明类的关键字是class,接口声明的关键字是intreface,接口都需要实现类

package com.company;

public interface users {
    //接口中定义的所有的属性默认的都是常量 public static final
    int age = 10;
    //接口中定义的所有的方法都是抽象的public interface
    void add(String name);
    void delate(String name);
    void uodate(String name);
}
package com.company;

public interface time {
    void  timer(String time);
}
package com.company;

//类可以实现接口,implements  接口
//实现了接口的类,就需要重写接口的方法
public class usersImpl implements users,time{
    @Override
    public void add(String name) {

    }

    @Override
    public void delate(String name) {

    }

    @Override
    public void uodate(String name) {

    }

    @Override
    public void timer(String time) {

    }
}

作用:

  1. 约束
  2. 定义一些方法,让不同的人实现
  3. public interface
  4. public static final
  5. 接口不能被实例化,接口中没有构造方法
  6. 通过implements可以实现多个接口
  7. 必须要重写接口中的方法

创建接口匿名实现类的对象

应用:

  • 代理模式
  • 工厂模式

内部类及OOP实战

内部类就是在一个类的内部定义一个类

  1. 成员内部类(静态,非静态)

    可以获得外部类的私有属性私有方法

    一方面,作为外部类的成员,

    • 调用外部类的结构
    • 可以被static修饰
    • 可以被四种不同的权限修饰

    另一方面,作为一个类

    • 可以定义属性,方法,构造器等
    • 可以被final修饰,表示不能被继承;不使用final,可以被继承
    • 可以被abstract修饰
    class Person {
        String name;
        int age;
        public void eat (){
            System.out.println("吃饭");
        }
        //静态成员内部类
        class Dog {
            String name;
            int age;
    
            public void show(){
                System.out.println("kala is a dog!");
            }
        }
        //非静态成员内部类
        class Bird {
            String name;
            public Bird (){
    
            }
            public void sing (){
                System.out.println("i am a bird!");
                Person.this.eat();
                eat();
                System.out.println(age);
            }
            public void display (String name){
                System.out.println(name);
                System.out.println(this.name);
                System.out.println(Person.this.name);
            }
        }
        public void method() {
            //局部内部类
            class AA {
    
            }
        }
            {
                //局部内部类
                class BB{
    
                }
            }
        public Person(){
            //局部内部类
            class CC{
    
            }
        }
    }
    
  2. 静态内部类

    一个Java类中可以有多个class类,但是只能有一个public class类

  3. 局部内部类(方法内,代码块内,构造器内)

    class Text{
        public void method(){
            //局部内部类
            class AA{
    
            }
        }
        //返回一个实现了Comparable接口的类对象
        public Comparable getComparable(){
            //创建一个实现了Comparable接口的类:局部内部类
            //方式一:
            class MyComparable implements Comparable{
    
                @Override
                public int compareTo(Object o) {
                    return 0;
                }
            }
            return new MyComparable();
            //方式二:
            return new Comparable() {
                @Override
                public int compareTo(Object o) {
                    return 0;
                }
            };
        }
    }
    
  4. 匿名内部类

包装类

Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特性

基本数据类型,包装类,String的转换

  1. 基本数据类型----------->包装类 调用包装类的构造器 自动装箱
  2. 包装类----------->基本数据类型 调用包装类Xxx的xxxValue() 自动拆箱
  3. 基本数据类型,包装类----------->String
    • 方式一:连接运算
    • 方式二:调用String重载的valueOf(Xxx xxx)
  4. String----------->基本数据类型,包装类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值