Java面向对象

1.初始面向对象

1.1面向对象&&面向过程

  • 面向过程

    • 步骤清晰简单,第一步做什么,第二部做什么……

    • 面向过程适合处理一些较为简单的问题

睡觉:上床,盖被子,睡觉

  • 面向对象思想
    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,再对某个分类下的细节进行面向过程的思索。
    • 面向对象适合处理复杂的问题,是和处理需要多人协作的问题!

人---->睡觉

  • 对于面熟复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

1.2面向对象编程(Object-Oriented Programming,OOP)

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

  • 一个比较抽象的概念

  • 三大特性:

    • 封装
    • 继承
    • 多态
  • 从认知的角度考虑,是先有对象后有类。对象,是具体的事物;类是抽象的,对对象的抽象。

  • 从代码运行角度考虑,现有类后有对象。**类是对象的模板**

2.方法回顾及加深

方法的定义

  1. 修饰符

    • public
    • static
    • ……
  2. 返回类型

    与返回值相对应

  3. break 与 return的区别

    • break:跳出switch循环,结束循环

    • return 结束方法,返回一个返回值

  4. **方法名:**注意规范即可!驼峰命名法!见名知意!

  5. 参数列表

    参数类型,参数名。(可变参数)

  6. 异常抛出

方法的调用

  1. 静态方法:static

  2. 非静态方法

  3. 形参和实参

    形式参数和实际参数的类型要相互队形

  4. 值传递和引用传递

  • Java是值传递
public class Demo01 {
    public static void main(String[] args) {
        int x = 1;
        System.out.println(x);//1
        //java为值传递,将x传入函数中后,当前的x为10,当调用方法完之后,还是原来的值
        //只是将10这个值丢给x了,并没有改变x的值
        change(x);
        System.out.println(x);//1
    }
    public static void change(int a){
        a = 10;
    }
}
  • 引用调用传递
//引用传递: 传递一个引用类型即实例对象
public class Demo02 {
    public static void main(String[] args) {
        Student stu = new Student();
        change1(stu);
        System.out.println(stu.name);
    }
    public static void change1(Student stu){
        stu.name = "dog";
    }
}
class Student{
    public String name;
}

  1. this关键字
  • 可以再当前对象里调用当前这个对象的方法及属性

3.对象的创建分析

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

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

    • eg:张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
    • 能够体现出特点,展现出功能的是具体的实例
  • 使用new关键字创建对象

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

  • 构造器

    1. 必须和类的名字相同
    2. 必须没有返回类型,也不能写void
  • 作用

    1. new的过程,实质是再调用构造方法

    2. 初始化对象的值

  • 注意点

  • 定义有参构造之后,如果想使用午餐构造,显示的定义一个无参的构造

小结

  1. 类与对象

    • 类是一个模板:类是一个抽象的
    • 对象是类的一个实例,将类具体化
  2. 方法

    • 掌握定义和调用
  3. 对应的引用

    • 引用类型;基本类型(8种)

    • 对象都是引用类型

    • 对象是通过引用来操作的:栈–>堆

    • 类的属性(字段,成员变量)

      • 默认初始化

        • 数字:0,0.0
        • char: u0000
        • boolean:false
        • 引用: null
      • 修饰符 属性

  4. 对象的创建和使用

    • 必须使用new关键字创造对象,构造器。Person teacher = new Person();

    • 对象的属性 teacher.name;

    • 对象的方法:teacher.sleep;

  5. 类:

    • 静态的属性 属性
    • 动态的行为 方法
    • 每个类都只有方法和属性!!!

4.面向对象三大特性

封装、继承、多态

4.1封装

  • 高内聚,低耦合

    • 高内聚:一个方法尽可能做一件事,并且可以最大化复用
    • 低耦合:方法与方法之间,模块模块之间之间尽量不要相互影响
  • 封装实现的是数据的隐藏

    • 通常禁止直接访问一个对象的数据的实际表示,而应该通过操作接口来访问,为信息的隐藏
  • 属性私有,通过get/set去访问属性

  • 作用:

    1. 提高程序的安全性,保护数据
    2. 隐藏代码的实现细节
    3. 统一接口(get/set)
    4. 系统可维护增加

4.2继承

**Java中类的继承只有单继承,没有多继承!!!**一个儿子只有一个爸爸!一个爸爸可以有多个儿子!!!

子类即是父类

  1. object类

    它是Java中所有类的根类,祖先!

    所有的类都默认直接或者间接继承了object类

  2. super

    • 调用父类的一些属性或者方法。私有属性和方法无法被调用!!!
    • 子类的构造方法默认第一步执行父类的无参构造方法。且必须放在子类的第一行!!!父类如果没有无参构造方法,必须调用父类的有参构造方法!!!
    • super只能出现在子类的方法或者后遭方法中

    VS this

    1. 代表的对象不同

      • this代表当前对象
      • super代表父类对象
    2. 前提

      • this 没有继承也可以使用
      • super只有在继承条件下才可以使用
    3. 构造方法

      • this() 本类的构造
      • super() 父类的构造
//父类

public class Person {
    private String name;

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

//子类
public class Student extends Person{
    private int age;
    public Student(int age){
        this.age = age;
    }
}

在这里插入图片描述

  1. 方法重写

必须要有继承关系!方法名相同,参数列表相同,方法体不一样

  • 静态方法和非静态方法重写有很大区别
//A继承B
A a = new A();
B b = new A();
/*  
    静态方法:调用方法只和左边的对象有关
    非静态方法:调用方法只和右边的对象有关
*/
  • 修饰符:范围可以扩大,但不能缩小

  • 抛出的异常:范围可以被缩小 但是不能被扩大

  • 意义:

    父类的功能子类不一定需要,或者不一定满足

4.3多态

  • **概念:**同一个方法可以根据发送对象的不同而采用多种不同的行为方式
  • 一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多
//实际类型均为Student  指向的引用类型却一个为Student一个为Person
Person person = new Student();
Student student = new Student();
//Student继承了Person且Student重写了Person的run方法
person.run();
student.run();
//均为调用子类student的方法
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不太大,优先执行子类重写的方法
  • 子类调用的方法都是自己的或者继承父类的!
  • 父类 可以指向子类,但是不能调用子类独有的方法!可以调用子类重写的方法
  • 注意事项
    1. 多态是方法的多态,属性没有多态
    2. 父类和子类,有联系,可以类型转换。毫无关系的两个对象类型转换会报错:ClassCastException
    3. 存在条件:继承关系,方法需要重写,父类引用类型指向子类。
    4. 有些方法不能被重写
      1. static方法 属于类,不属于实例
      2. final 常量;
      3. private方法 私有!

4.4instanceof 和 类型转换

  • instanceof

    判断一个对象是什么类型

Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();

System.out.println("s1 instance Student");//true
System.out.println("s2 instance Teacher");//编译报错
System.out.println("s1 instance Person");//true
System.out.println("s1 instance Object");//true
System.out.println("s3 instance String");//编译报错
System.out.println("==================");
System.out.println("s2 instance Student");//true
System.out.println("s2 instance Teacher");//false
System.out.println("s2 instance Person");//true
System.out.println("s2 instance Object");//true
System.out.println("s3 instance String");//编译报错
System.out.println("==================");
System.out.println("s3 instance Student");//true
System.out.println("s3 instance Teacher");//false
System.out.println("s3 instance Person");//true
System.out.println("s3 instance Object");//true
System.out.println("s3 instance String");//false
  • 类型转换

    1. 父类引用指向子类的对象
    2. 把子类转换为父类,向上转型;自动
    3. 把父类转换为子类,向下转型;强制转换
    4. 方便方法的调用,减少重复的代码!
  • 详解static方法

    • 静态代码块:只执行一次!!!

    • 匿名代码块:赋初值

public class Person{
    {
        System.out.println("匿名代码块")
    }
    static{
        System.out.println("静态代码块")
    }
    public Person(){
        System.out.println("构造方法")
    }
    public static void main(String[] args){
        Person p1 = new Person();
        System.out.println("=====================")
        Person p2 = new Person();
    }
}

输出结果:
输出结果

ps:静态导入包~

import static java.lang.Math.random;
import static java.lang.Math.PI;
//可以直接使用PI 和random()函数

5.抽象类和接口

  • 抽象类

    • abstract关键字实现
      • 可以写抽象方法和普通方法
      • 被继承的类必须要实现它的所有抽象方法
  • 接口

    • interface
      • 接口的方法只会有抽象方法和静态方法
      • 方法名默认有public、abstract修饰
      • 属性会有默认的public,static,final修饰
      • 接口侧面实现了java的多继承!!!

6.内部类

  1. 成员内部类
  2. 局部内部类
  3. 静态内部类
  4. 匿名内部类
public class User {
    private String name;
    private int ID;

    //成员内部类
    public class Uesr_son{
        public void getName()
        {
            System.out.println(name);
        }
    }

    //局部内部类
    public void run(){
        class User_son{

        }
    }

    //静态内部类
    static class USer_son{

    }

    public static void main(String[] args) {
        new User().run();//匿名内部类
        User user = new User();
        Uesr_son son = user.new Uesr_son();//创造成员内部类的实例

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值