首页 > 编程语言 >第五章java面向对象编程(上)

第五章java面向对象编程(上)

时间:2025-01-23 21:31:01浏览次数:3  
标签:java name void 第五章 面向对象编程 Student zxy public String

面向对象编程

Java的核心就是OOP

初始面向对象

  1. 面向过程思想:步骤思维清晰,第一步做什么,第二步做什么…。适合解决一些简单的问题

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

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

  1. 面向过程编程(OOP)

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

抽象

三大特性:

封装:将一些属性和相关方法封装在一个对象中,对外隐藏内部具体实现细节。内部实现,外界不需要关心,外界只需要根据”内部提供的接口“去使用就可以。

继承:个类”拥有“另外一个类的”资源“的方式之一;”拥有“:并不是资源的复制,编程双份资源,而是,资源的”使用权“;”资源“:指"非私有的"属性和方法

多态:一个类,所延伸的多种形态

从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的。是对对象的抽象

从代码运行角度考虑是先有类后有对象。类是对象的模板

方法回顾和加深

  1. 方法的定义

修饰符

返回类型

//main方法
public static void main(String[] args) {

}
//定义方法
/*
修饰符 返回值类型 方法名(..){
    //方法体
    return 返回值;
    }
 */
public String sayhello(){
    return "hello,world!";
}
//void返回空值
public void hello(){
    return;
}
public  int max(int a,int b){
    return a>b?a:b;
}

break和return的区别:前者跳出switch结束循环,后者代表方法结束,返回一个结果。return返回值必须与返回值类型相同

方法名:注意规范,见名知意

参数列表:(参数类型,参数名)…

异常抛出

public void readFile(String file) throws IOException{
    
}
  1. 方法的调用:递归

静态方法与非静态方法

静态方法:static

在这里插入图片描述

非静态方法:

在这里插入图片描述

以下三种情况:

  • 第一种情况:都是非静态方法,可直接调用
public void a(){
    b();
    return;
}
public void b(){
    return;
}
  • 第二种情况:都是静态方法,可直接调用
public static void a(){
    b();
    return;
}
public static void b(){
    return;
}
  • 第三种情况:
public static void a(){
    b();
    return;
}
public  void b(){
    return;
}

此处a有static,是和类一起加载的,时间片很早;b和对象有关,是类实例化之后才存在。已经存在的东西调用一个不存在的东西,不可行

形参和实参

实际参数和形式参数类型要对应

public static void main(String[] args) {
    int add = demo2.add(2, 3);
    System.out.println(add);
}
public static int add(int a,int b){
    return a+b;
}

值传递和引用传递

  • 值传递
//值传递
public class demo3 {
    public static void main(String[] args) {
        int a=1;
        System.out.println(a);
        demo3.change(a);//还是等于1,因为1只是传给了函数change的形式参数,函数并没有返回值
        System.out.println(a);
    }
    public static void change(int a){
        a=10;
    }
}
输出:
1
1
  • 引用传递

引用传递,传递的是一个对象

public class demo4 {
    public static void main(String[] args) {
        Student student=new Student();
        System.out.println(student.name);  //输出null
        demo4.change(student);
        System.out.println(student.name);  //输出小张
    }
    public static void change(Student student){
        //student是一个对象,指向的是Student student=new Student();,这是一个具体的人,可以改变属性
        student.name="小张";
    }
}


//定义一个student类,有一个属性name,这个类要怎么用呢
class Student {
    String name;
}

this关键字

后续出

类与对象的创建分析

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

  1. 创建与初始化对象

使用new关键字创建对象的时候:

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

必须使用new关键字创建对象,构造器 Student xiaoming = new Student();
对象的属性 xiaoming.name
对象的方法 xiaoming.sleep()

类中的构造器也称构造方法,是在进行创建对象的时候必须要调用的。并且构造器要有以下两个特点:必须和类的名字相同;没有返回类型也不能写void

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

方法的定义与调用

一个项目应该只有一个main方法

创建类的时候:

类里面只能有属性(静态的属性)和方法(动态的行为)

举个例子:

package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        //把抽象的Student类实例化
        //类实例化后会返回一个自己的对象
        //student对象就是一个Student类的具体实例
        Student xiaoming = new Student();
        Student xiaohong = new Student();
        System.out.println(xiaohong.name);
        System.out.println(xiaoming.name);
		System.out.println(xiaoming.age);
        System.out.println(xiaohong.age);
    }
}
输出:
null
null
0
0
package com.zxy.oop;
//学生类
public class Student {
    //对象的属性
    String name;
    int age;

    //对象的方法
    public void study(){
        System.out.println(this.name+"在学习");
    }
}

属性默认的初始化:运行后输出null和0,说明String(引用数据类型)默认值为null,int默认值为0

扩展:基本数据类型:double默认值为0.0,char默认值为u000,boolean默认值为false,引用是null

在Application.java里加上

xiaoming.name="小明";
xiaohong.name="小红";
xiaoming.age=18;
xiaohong.age=19;
xiaohong.study();
xiaoming.study();

输出:

小红
小明
18
19
小红在学习
小明在学习

感慨:学程序是为了对世界更好的建模

  1. 构造器详解
  • 系统自带的构造器
package com.zxy.oop;

public class GouZao {
    public static void main(String[] args) {

    }
}

这个类没有写任何东西,系统也会创造一个方法,即构造方法(构造器)

比如此例子构造器为:(可以去out文件夹下查看)

public GouZao() {
}
  • 当然我们也可以显式的定义构造器:

先来个无参构造

package com.zxy.oop;

public class GouZao {
        String name;
        //实例化初始值
        public GouZao(){  //无参构造
            this.name="zxy";
        }

}
package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        //new实例化一个对象
        GouZao gouZao = new GouZao();
        System.out.println(gouZao.name);
    }
}
输出:
zxy

使用new的时候,本质是在调用构造器

构造器用来初始化


加上有参构造(alt+insert),此时如果想使用无参构造,则必须显示地定义无参构造*

package com.zxy.oop;

public class GouZao {
        String name;
        //实例化初始值
        public GouZao(){  //无参构造
        }
    public GouZao(String name){  //有参构造
        //前面的代表对象本身的name,后面的那么代表实参传递下来的name
        this.name=name;
    }


}
package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        //new实例化一个对象
        GouZao gouZao = new GouZao("zhangxuanyu");
        System.out.println(gouZao.name);
    }
}
输出:
zhangxuanyu 

此处用的有参构造不用无参构造是因为:

Application类的main方法中,使用了new GouZao("zhangxuanyu")来创建一个GouZao对象。这行代码明确地传递了一个字符串参数"zhangxuanyu"给构造函数。因此,Java会查找匹配这个调用的构造函数,即带有相同类型和数量参数的构造函数。

GouZao类中定义了两个构造函数:

  1. 无参构造函数 public GouZao(),它不接受任何参数。
  2. 带有一个String参数的构造函数 public GouZao(String name)

当你执行new GouZao("zhangxuanyu")时,Java会选择第二个构造函数,因为它与调用相匹配:它接受一个String类型的参数,并将这个参数值赋给了实例变量name。所以,gouZao.name会被设置为"zhangxuanyu",并且当你打印它时,你会看到输出"zhangxuanyu"

如果你想要使用无参构造函数,可以这样做:

GouZao gouZao = new GouZao(); // 使用无参构造

在这种情况下,name属性将不会被初始化(对于引用类型,默认值是null),除非你在无参构造函数内部给它赋值。

选择使用哪个构造函数取决于你是否需要在对象创建时就初始化对象的状态。有参构造允许你直接在创建对象时提供必要的信息,使得对象可以处于一个有效的初始状态。而无参构造则通常用于不需要立即初始化或者需要默认初始化值的情况下。

  1. 创建对象内存分析

举个例子:
在这里插入图片描述

运行完Student.Pet dog = new Student.Pet();,内存为:

在这里插入图片描述

运行完:

dog.name="xiaozhang";
dog.age=14;
dog.shout();

在这里插入图片描述

面向对象三大特性

  1. 封装

该装的装,该露的露

  • 程序设计追求”高内聚,低耦合“。前者指类的内部数据数据操作细节自己完成,不允许外部干涉;后者指仅暴露少量的方法给外部使用

数据的隐藏

  • 通常,应禁止直接访问一个对象中数据的直接表示,而应通过操作接口来访问,这称为信息隐藏

属性私有(private),get/set

举个例子:

package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        students s1 = new students();
        s1.setName("zxy");
        System.out.println(s1.getName());

    }
}
package com.zxy.oop;

public class students {
    //加private使得属性私有
    private String name;  //名字
    private int id;  //学号
    private char sex;  //性别

    //提供一些可以操作这个属性的方法
    //提供一些public的get,set方法
    //get获得这个数据,set给这个属性设置值
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name=name;
    }
}

方法可以用alt+insert生成

不合法的数据可以通过封装避免

 public void setAge(int age) {
        if(age>120||age<0){
            this.age=3;  //不合法的数据
        }else {
            this.age=age;
        }
}

作用:

提高程序安全性,保护数据

隐藏代码的实现细节

统一接口

系统可维护性

  1. 继承
  • 什么是继承

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

extends的意思是”扩展“。子类是父类的扩展

package com.zxy.oop;
//人(父类,基类)
public class Person {
    public void say(){
        System.out.println("说了一句话");
    }
    public int money=10_0000_0000;//注意!!,如果改成private私有,子类就没法用
}

可以创建:

package com.zxy.oop;
//学生 is 人(子类,派生类)
public class Student extends Person {

}
package com.zxy.oop;
//Teacher is  人
public class Teacher extends Person{
}

Java类中只有单继承,没有多继承.儿子只有一个爸爸,但是一爸爸可以有多个儿子

继承是类和类之间的关系。除此之外,类和类之间的关系还有依赖,组合,聚合等

继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,用关键字extends来表示

子类和父类之间,从意义上来说应该具有”is a“的关系

举个例子:

package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();
        System.out.println(student.money);
    }
}
输出:
说了一句话
1000000000

子类继承了父类,就会拥有父类的全部方法(public)

一般来说方法是公有的,属性是私有的

根据此再改进一下:

package com.zxy.oop;
//人
public class Person {//方法共有
    public void say(){
        System.out.println("说了一句话");
    }
    private int money=10_0000_0000;//属性私有

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
  • object类

快捷键ctrl+H

在这里插入图片描述

右边的树形结构,Object是什么?

把Person.java清空,发现

在这里插入图片描述

new 的person很多方法,没定义过但存在。因为:

Java中所有的类都默认直接或间接继承Object类

  • Super详解
  1. 发现可以在子类中用super调用的父类的属性

在这里插入图片描述

package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.test("xiaohong");

    }
}
输出:
xiaohong
xiaoming
zxy
package com.zxy.oop;
//学生 is 人:儿子
public class Student extends Person {
        private String name="xiaoming";
        public void test(String name){
            System.out.println(name);//这个指定义函数的形参String name:xiaohong
            System.out.println(this.name);//这个指上面的xiaoming
            //调用父类的name:zxy
            System.out.println(super.name);
        }
}
package com.zxy.oop;
//人:父亲
public class Person {
    protected String name="zxy";
}
  1. 也发现可以在子类中用super调用的父类的方法,比如:
package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.test1();

    }
}
输出:
Student
Student
Person
package com.zxy.oop;
//学生 is 人:儿子
public class Student extends Person {
        private String name="xiaoming";
        public void print(){
            System.out.println("Student");
        }
        public void test1(){
            print();
            this.print();
            super.print();
        }

}
package com.zxy.oop;
//人:父亲
public class Person {
    //如果此print()是私有的,那么无法被继承
    public void print(){
        System.out.println("Person");
    }
}
  1. 关于构造器

在这里插入图片描述

package com.zxy.oop;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();

    }
}
输出:
Person无参实现了
Student无参实现了
package com.zxy.oop;
//学生 is 人:儿子
public class Student extends Person {
        private String name="xiaoming";
        //隐藏代码:调用了父类的无参构造
        //super();
        public Student() {
            System.out.println("Student无参实现了");
        }

        public void print(){
                System.out.println("Student");
            }
        public void test1(){
            print();
            this.print();
            super.print();
        }


}
package com.zxy.oop;
//人:父亲
public class Person {
    public Person() {
        System.out.println("Person无参实现了");
    }
    //如果此print()是私有的,那么无法被继承
    public void print(){
        System.out.println("Person");
    }


}

根据结果可推出Student.java里有隐藏代码(super()

标签:java,name,void,第五章,面向对象编程,Student,zxy,public,String
From: https://blog.csdn.net/2301_80484013/article/details/145326166

相关文章

  • Java基础学习(九)
    Java基础学习(九):常用API目录Java基础学习(九):常用APIMathSystemRuntimeObjectObjectsBigIntegerBigDecimal正则表达式Pattern和Matcher时间相关类包装类本文为个人学习记录,内容学习自黑马程序员Math路径:java.lang.Math是一个用于帮助我们进行数学计算的工具类常用方......
  • java入门概念
    第一章:java概述基本概念:什么是程序?计算机如何执行程序?计算机可识别的有序指令集,将源文件编译为目标文件,将目标文件和库文件等资源链接形成可执行文件,计算机执行这个文件的指令java重要特点:1,面对对象的(oop)2,健壮的3,跨平台windows/Linux(编译后都可用通过jvm实现)4,解......
  • 使用 Java 和 Tesseract 实现验证码识别
    验证码是防止自动化操作的重要手段,而OCR(光学字符识别)技术使得识别验证码成为可能。在本文中,我们将使用Java和TesseractOCR引擎,开发一个简单的验证码识别工具。环境准备安装TesseractOCR在开始之前,你需要安装TesseractOCR,这是实现光学字符识别的核心工具。Windows:......
  • Java方法
    Java方法例如:System.out.println();---->分别为(类.对象.方法)Java方法是语句的集合。它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:一个方法只完成一个功能,这样有利于我们后期的......
  • 详细剖析Java动态线程池的扩容以及缩容操作
    前言在项目中,我们经常会使用到线程来处理加快我们的任务。但为了节约资源,大多数程序员都会把线程进行池化,使用线程池来更好的支持我们的业务。Java线程池ThreadPoolExecutor有几个比较核心的参数,如corePoolSize、maximumPoolSize等等。无论是在工作中还是在面试中,都会被问到,如何......
  • 探索JavaScript前端开发:开启交互之门的神奇钥匙(二)
     目录 引言四、事件处理4.1事件类型4.2事件监听器五、实战案例:打造简易待办事项列表5.1HTML结构搭建5.2JavaScript功能实现六、进阶拓展:异步编程与Ajax6.1异步编程概念6.2Ajax原理与使用七、前沿框架:Vue.js入门窥探7.1Vue.js简介7.2基础使用示......
  • Java 反射
    目录概述反射机制反射机制原理类加载概述类加载的时机:类加载各阶段完成的功能加载阶段连接阶段——验证连接阶段——准备连接阶段——解析初始化阶段Class类方法一:直接通过一个类class中的静态变量class获取:方法二:如果我们有一个类class的对象,可以通过该对象引用提供的get......
  • Java 泛型
    目录泛型概述使用泛型的好处泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口定义类时确定泛型的类型始终不确定泛型的类型,直到创建对象时,确定泛型的类型泛型通配符通配符基本使用通配符高级使用----受限泛型泛型概述在前面学习集合时,我们都知道集合中是可......
  • [新]Java8的新特性
    原文首发在我的博客:https://blog.liuzijian.com/post/86955c3b-9635-47a0-890c-f1219a27c269.html1.Lambda表达式lambda表达式是Java8的重要更新,lambda表达式可以用更简洁的代码来创建一个只有一个抽象方法的接口(函数式接口)的实例,从而更简单的创建匿名内部类的对象。语法和......
  • 基于Java的宠物医院管理系统 毕业设计源码14635
    目 录1绪论1.1选题背景1.2研究现状1.3论文结构与章节安排2 宠物医院管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 操作可行性分析2.1.3 法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析......