面向对象(个人笔记)

面向过程和面向对象的设计思想

java面向对象语言

object oriented programming OOP

面向过程和面向对象都是语言设计思想.

案例: 把大象装进冰箱 图书馆管理系统 书类 管理员类 借阅…

**面向过程:**关注于具体的流程,一步一步实现解决问题

​ 3步可以实现

​ 1.开门();

​ 2.装大象();

​ 3.关门();

面向对象:

先设计 对现实中客观事物进行分类,创建出类(在类中定义功能), 创建出具体的对象,让对象去做具体的事情.

类是对象现实事物的抽象.

冰箱类{

开门()

关门()

装大象()

}

大象类{

}

难?

概念多,设计复杂.

类是对象现实事物的抽象.

实际生活中,先有对象(具体存在),后有类.

人 人类(概念)

张三 对象(具体的一个人)

类的结构

成员变量: 类中的属性 名词: 品牌,颜色 价格 型号

方法 : 类中行为(功能) 动词: 行驶,加速,停止…

构造方法

代码块

内部类

类是一个模型,对现实事物的抽象.是模板.

对象时从类这个模型创建出的一个具体实例.

java对象

对象是类的一个实例,是以类为模板在内存中创建的实际存在的实例

● 对象的创建和使用
Car x1 = new Car();
Car x1:使用Car类作为类型声明一个变量x1.

new Car():使用new + Car类构造方法创建对象.

= :将右边创建的对象地址 赋给 左边的x1变量
使用x1变量访问对象中的成员变量和成员方法.

● 同一类的每个对象有不同的成员变量存储空间。
● 同一类的每个对象共享该类的方法。

对象内存简图

在这里插入图片描述

变量分类

● 成员变量

成员变量是定义在类中方法体之外的变量。
成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。

在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。引用类型默认值为null 整数-0,浮点-0.0 ,boolean-false ,char- ‘ ’ ;

成员变量在创建对象的时候会从类中复制一份到对象中。
成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员变量的作用范围为整个类体。

● 局部变量

在方法、构造方法或者语句块中定义的变量被称为局部变量。
局部变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
局部变量在使用前必须初始化赋值。
变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

方法分类

成员方法:成员方法是定义在类中。 语法格式:
修饰符 返回值类型 方法名 ( 参数列表) {
方法体语句;
[return 返回值]
}
构造方法:用来初始化对象的方法

• 构造方法名与类名相同,且没有返回值,且不需要使用void修饰。
• 作用:在构造方法中为创建的对象初始化赋值,
• 在创建一个对象的时候,至少要调用一个构造方法。
• 每个类都有构造方法。如果没有显式地为类定义构造方法,Java将会为该类提供一个默认
构造方法,但是只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效。
• 一个类可以有多个构造方法。
例: public class Car{
public Car(){ }
public Car(String name){ // 这个构造方法有一个参数:name }
}
例:创建Car类的对象
Car car1 = new Car();
Car car2 = new Car(“宝马”)

方法的重载

● 方法的重载是指同一个类中具有相同的名字,但参数不同的多个方法
● 参数不同(可以有三方面的不同)
● 数量不同
● 类型不同
● 顺序不同
● 调用时,会根据不同的参数表选择对应的方法。
• 注意:方法重载跟方法的返回值类型没有任何关系

对象与引用

  • java中除8种基本数据类型之外的变量类型都称之为引用类型

  • java中的对象是通过引用对其操作

    例如: 我们有一个自定义类为Car(汽车类)
    class Car{
    String color;
    String name;
    String model;
    }
    Car bm= new Car();
    通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作

    1)右边的“new Car()”,是以Car类为模板,调用Car类的构造函数,在堆空间里创建一个Car类对象。
    2)左边的“Car bm”创建了一个Car类型引用变量。所谓Car类的引用,就是以后可以用来指向Car
    对象的对象引用。
    3)”=”操作符使对象引用指向刚创建的那个Car对象。
    我们可以把这条语句拆成两部分:
    Car bm;
    bm= new Car();
    这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

    public class Person {
    //成员表变量
    public String name;
    int age;
    //构造方法
    public Person(){}
    public Person(String name,int age){
    this.name=name;
    this.age=age;
    }
    //成员方法 哪个对象调用showInfo方法,那么name,age就是哪个对象中的属性
    //this 表示当前正在操作的对象 在成员方法,构造方法中使用成员变量,使用this调用.
    public void showInfo(){
    System.out.println(“姓名:”+this.name+" 年龄:"+this.age);
    }
    }

    ​ 此处省略测试类创建对象初始化和调用方法

在这里插入图片描述

  • 值传递与引用传递

  • java中进行方法调用传递参数时,参数传递有两种(严格来说都是传值):

  • 值传递

    例:class Demo{

    public static void main(String []args){

    Demo d = new Demo();

    ​ int a = 10;

    ​ d.test(a);

    ​ System.out.println(a);

    }

    //形参a的值直接对b赋值,在内存中有两个独立的存储空间 a,b

    public void test(int b){

    ​ b = 20;

    ​ }

    }

    //测试结果为10;

    (形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给
    对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

  • 引用传递

    Package

    class Person{

    public String name;

    public int age;

    //省略构造方法

    }

    class Demo{

    public static void main(String []args){

    Demo d = new Demo();

    Person zs = new Person (“张三,age:20”);

    ​ d.test(zs);

    ​ System.out.println(张三.name);

    }

    public void test(Person p) {//zs和p指向同一个对象

    ​ p.name = “李四”;

    ​ }

    } //测试结果name为李四

    this关键字

    this关键字代表当前对象
    使用this关键字引用成员变量
    使用this关键字引用成员方法

  • 在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的
    格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。

    static关键字

    概念
    ● static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
    随着类的加载而加载
    优先于对象存在
    • 修饰的成员,被所有对象所共享
    • 可不创建对象,直接被类调用

    static属性
    静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存中只有一个。

    ● static方法可以使用对象调用,也可以直接用类名调用,建议用类名直接调用。

    在static方法内部只能访问类的static属性,不能访问类的非static属性,static属性先加载。

    代码块

    代码块在类中声明,类似一个没有名称的方法体(代码块),代码分实例代码块静态代码块
    实例代码块块:每次创建对象时自动调用
    {
    //任何符合语法的Java代码
    }
    静态代码块:类加载时自动调用,仅一次,与是否创建对象无关。
    static {
    //任何符合语法的Java代码
    }

    类什么时候加载?

    ·main方法在哪个类中执行,这个类加载

    ·创建某个类的对象

    ·调用某个类静态属性,方法

    类的加载执行

    创建对象先于类加载执行

    public class Test {

    ​ Person person = new Person(“Test”);//第二个执行

    ​ int age;

    ​ static{

    ​ System.out.println(“test static”);//先执行

    ​ }

    {

    ​ System.out.println(“test”);//第三步执行

    ​ }

    public Test() {

    ​ System.out.println(“test constructor”);//最后一步执行

    }

    ​ public static void main(String[] args) {

    ​ new Test();//两个过程 对象创建 类加载初始化

    ​ }

    }

    class Person{

    ​ static{

    ​ System.out.println(“person static”);

    ​ }

    ​ public Person(String str) {

    ​ System.out.println("person "+str);

    ​ }

    }

    //静态代码块加载先于实例代码块

    实例代码块加载快于构造方法

    为了更好的组织类,Java提供了包机制

    ● 包可以更好得管理逻辑相关的类,可以控制不同包之间的访问权限
    ● 导入外部包的类,关键字“import

    避免类重名

    import导入的是类的全类名

    同一个类名简称只能用一次

    如 :import java.util.Data;

    ​ import java.sql.Data;不能重复

    按功能管理(目前按日期管理)

    Gui(窗口)

    数据访问层

    工具类

    包的命名规则

    包名都小写

    项目类型 :com(商业) org(组织) edu gov

    公司名称:oracle huawei sun

    项目名称: oa erp cms

    功能模块:窗口/视图层 数据访问层 服务层 工具类

    ​ 细分子模块

    例 com.ffyc.javaoop.day2.pack.

    访问权限修饰符

    ●访问权限修饰符
    public (公共的) 类,成员变量,方法,内部类
    protected (保护的) 成员变量。方法,内部类
    (default) 默认的(无) 类,成员变量,方法,内部类

    private (私有的) 成员变量,方法,内部类

    在这里插入图片描述

    面向对象特征

    封装

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,
    而是通过该类提供的方法来实现对隐藏信息的操作和访问 。

    ​ 设计模式:解决一类问题的解决方案。

    ​ 单例模式: 让一个类在一个程序,只能创建一个对象。

    ​ 解决方法:构造方法设置为私有权限。

    继承

    extends关键字

    java只支持单继承(一个父亲)

    继承具有传递性 A继承B B继承C 那么C也继承A的非私有属性和方法

    当没有extends 默认都继承Object

    创建子类对象后,调用构造方法时,从上向下,先初始化父类后子类

    使用supe() 在子类构造方法第一行默认执行

    super关键字

    注:super不是父类对象,只是将父类信息加载到子类对象来

    super()调父类无参构造 只能放第一行

    方法重写

    方法名,参数列表,返回值类型相同

    访问权限修饰符大于等于父类权限

    @override java中提供的注解标签

    多态

    同一种事物,在不同时刻表现不同的状态

    多态条件

    1需有继承关系(类继承类,类实现接口,类继承抽象类)

    2需方法重写

    3父类的引用执行子类对象(Animal d = new dog( ));

在这里插入图片描述

非静态成员方法 : 编译看左,运行看右;

语法:

优缺点:

父类型引用指向子类型,提升程序扩展性

父类不能调用子类特有的方法 (调用子类得向下转型,用instanceof判断)

接口和抽象类

抽象类

只有声名,没有实现

子类要么重写全部方法,要么也声名为抽象类

接口

接口类似于抽象类(更彻底的抽象类

接口和抽象类都用于在顶层类,制定规范。(设计功能)

●接口中成员变量默认为静态常量 // 接口名只能调用接口中静态成员

●接口中定义静态抽象方法 //接口名.方法名可调用

●默认方法public default void xx( )只能通过子类调用

●一个接口可以继承一个/多个接口,一个类可实现多个接口

●接口不能实例化对象**,无构造方法**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值