java入门12--面向对象(上)(代码片段)

acrifhy acrifhy     2022-12-04     271

关键词:

java入门12

面向过程与面向对象

  • 面向过程思想

    • 步骤清晰,线性思维
    • 适合处理简单问题
  • 面向对象思想

    • 分类思维,对不同类的任务单独思考

    • 适合复杂问题,多人合作

什么是面向对象

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

  • 面向对象编程本质:以类的方式组织代码,以对象的组织封装数据

  • 抽象

  • 三大特性

    • 封装
    • 继承
    • 多态
  • 从代码角度,先有类后有对象,类是对象的模板

类与对象的关系

  • 类是对某一类事物的定义,是抽象的数据类型,对象是抽象概念的具体实例

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new时,除了分配内存空间,还会为创建的对象进行默认初始化以及对类中构造器的调用
  • 类中的构造器也叫构造方法,是创建对象时必须调用的,构造器特点:
    • 必须和类名相同
    • 必须没有返回类型,也不能写void

比如创建一个学生类:

package oop;

//学生类
public class Student 
    //属性
    String name;
    int age;

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

实例化对象:

package oop;

public class Demo01 
    public static void main(String[] args) 
        //实例化
        //类实例化后会返回一个自己的对象
        //student对象就是一个Student类的具体实例

        Student srrdhy1 = new Student();
        Student srrdhy2 = new Student();

        srrdhy1.name = "艾伦耶格尔";
        srrdhy1.age = 19;

        System.out.println(srrdhy1.name);
        System.out.println(srrdhy1.age);
        srrdhy1.study();
        //艾伦耶格尔
        //19
        //艾伦耶格尔在学习
    

有参构造与无参构造

类:

package oop;

public class Hero 

    //一个类即使什么也不写,也有一个方法
    //显示的定义构造器

    String name;

    //实例化初始值
    //使用new关键字,本质在调用构造器
    //用来初始化值
    public Hero()
        this.name = "奥克斯";
    
    //有参构造:一旦定义了有参构造,无参必须显示定义
    public Hero(String name)
        this.name = name;
    

主函数执行:

package oop;

public class Demo01 
    public static void main(String[] args) 

        //实例化一个对象
        Hero hero1 = new Hero();
        Hero hero2 = new Hero("黑魔");

        System.out.println(hero1.name);
        System.out.println(hero2.name);
        //奥克斯
        //黑魔
    

//alt + insert用于生成构造器
public Hero(String name) 
        this.name = name;
    

    public Hero() 
    

选择Constructor,直接OK生成有参构造,选择Select None生成无参构造。

封装

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

  • 封装(数据的隐藏)

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

创建一个类:

package oop.demo02;

//学生类  private:私有  不能直接在main方法调用了
//这时我们使用public的get和set方法来操作
public class Student 
    //名字
    private String name;
    //学号
    private int id;
    //性别
    private char sex;
    //get获得这个数据
    public String getName()
        return this.name;
    
    //set给这个数据设置值
    public void setName(String name)
        this.name = name;
    

主函数:

public class Main 
    public static void main(String[] args) 
        Student s1 = new Student();
        s1.setName("srrdhy");
        String name1 = s1.getName();
        System.out.println(name1);//srrdhy
    

快捷操作:

    //alt + insert选择Getter and Setter
    //自动生成
    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public char getSex() 
        return sex;
    

    public void setSex(char sex) 
        this.sex = sex;
    

现在添加一个年龄:

public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

设置一个999岁,但999年龄是不合理的:

s1.setAge(999);
System.out.println(s1.getAge());//非法年龄

规避操作:

    public void setAge(int age) 
        if (age<120 && age>0)
            this.age = age;
        else 
            System.out.println("输入非法");
        
    

封装好处:

  • 提高程序安全性,保护数据
  • 隐藏代码实现细节
  • 统一接口get、set
  • 系统可维护性提高

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
  • extends意为扩展,子类是父类的扩展
  • java类只有单继承(一个子类不能有多个父类)
  • 除了继承,类与类间的关系还有依赖、组合、聚合
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
  • 子类与父类间从意义上具有"is a"的关系
  • object类
  • super
  • 方法重写

我们建立一个父类并赋予一个方法:

//人类 父类
public class Person 
    public void speak()
        System.out.println("说了些什么");
    

建立一个子类继承父类,什么方法也没有写:

//学生 子类
public class Student extends Person

这时在主程序中new一个Student对象,使用speak():

public class Main 
    public static void main(String[] args) 
        Student student1 = new Student();
        student1.speak();
    

可以输出,这表示子类可以调用父类的方法

再比如我们在父类中增加

public int money = 10_0000_0000;

调用:

System.out.println(student1.money);

也可以输出,子类会继承父类的一切

但如果我们把父类的money改为私有的:

private int money = 10_0000_0000;

子类就调用不了了

对于调用权限,由高到低为:

public
protected
default
private

使用快捷键ctrl+H会生成树结构(要把鼠标点在需要的类里)

可以发现,父类上还有一个类,因为在java中,所有的类默认继承Object类

现在我们在父类建立一个名字,采用protected。

public class Person 

    protected String name = "srrdhy";

子类中用private建立一个不同的名字,再写一个输出名字的方法,分别输出三种名字:

public class Student extends Person

    private String name = "琪亚娜";
    public void printname(String name)
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    

主程序运行:

public class Main 
    public static void main(String[] args) 
        Student student1 = new Student();
        student1.printname("雷电芽衣");
    
    //雷电芽衣
    //琪亚娜
    //srrdhy

如果我们在父类中写一个print方法:

public void print()
        System.out.println("Person");
    

又在子类中写一个同名方法:

public void print()
        System.out.println("Student");
    

那么主程序调用print方法时,会调用子类的print

注意,private无法继承,super也不行

现在我们在子类父类各写一个无参构造:

public Student() 
        System.out.println("Student无参执行");
    
public Person() 
        System.out.println("Person无参执行");
    

主程序中单纯new一个student,什么也不做,会输出:

Person无参执行
Student无参执行

先输出了Person无参执行,说明public Student()里隐藏调用了父类的无参构造,隐藏了一个super()

调用父类的构造器,必须要在子类的第一行

父类没有无参时,子类也不能写无参,只能调用有参。一般我们会把无参写上再接着写有参。

方法重写

  1. 重写都是方法的重写,与属性无关

  2. 子类重写父类的同名方法,参数列表相同

  3. 修饰符:范围可以扩大不能缩小:public>protected>default>private,当然private不能重写

  4. 抛出异常:范围可以缩小不能扩大:ClassNotFoundException–>Exception(大)

子类方法与父类一致,方法体不同

为什么要重写:

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

我们建一个子类A,父类B,并写同名方法:

public class A extends B
    public static void text()
        System.out.println("A");
    

public class B 
    public static void text()
        System.out.println("B");
    

调用方法:

public class Main 
    public static void main(String[] args) 
        //方法的调用只和左边,定义的数据类型有关
        A a = new A();
        a.text();//A
        //父类的引用指向了子类
        B b = new A();
        b.text();//B
    

删去A、B的static,发现左边都多了一个东西:

其实就代表重载

删掉A中方法,alt+insert选择方法重载,直接回车生成方法:

@Override//注解,有功能的注释
    public void text() 
        super.text();
    

继续执行主程序,输出BB,把super.text();改回System.out.println(“A”);,继续执行主程序,输出却变成了AA

所以我们可以补全刚刚的结论:

  • 静态方法(有static):方法的调用只和左边,定义的数据类型有关
  • 非静态方法:重写(比如B b = new A();b.text();)

注意重写的方法只能是public,换成private就不行了

java入门五(代码片段)

Java基础——E6.面向对象面向对象程序设计(OOP)是当今主流的程序设计范型,它取代了20世纪70年代的“结构化”或面向过程编程。而Java正是一种强类型的面向对象编程语言,所以需要掌握好OOP才能很好地使用Java。而面向对象... 查看详情

java全栈javase:12.面向对象上(代码片段)

1.什么是面向对象(1)面向对象与面向过程面向对象:简单的可以理解为将复杂的事情分解为许多简单的事情。再将这些简单的事情的解决办法封装到类对象中。就像我们造汽车一样,并不会一步一步的去造,... 查看详情

educoder(头歌)平台java实训作业答案(代码片段)

头歌educoder实训java1-1Java入门-Java入门基础1-2Java入门-变量与数据类型1-3Java入门-运算符和表达式1-4Java入门-分支结构1-5Java入门-循环结构基础1-6Java入门-循环结构进阶1-7Java入门-分支与循环练习1.8Java入门-数组基础1.9Java入门-数组进... 查看详情

python入门-6面向对象编程:12组合(代码片段)

组合:  “is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a”关系指的是类似这样的关系:狗是动物,dogisanimal。狗类就应该继承动物类。  “has-a”关系,我们可... 查看详情

java入门教程八(面向对象)(代码片段)

对象概念一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相... 查看详情

java入门13--面向对象(下)(代码片段)

java入门13多态动态编译:类型:可扩展性即同一方法可以根据发送对象的不同而采取多种不同的行为方式一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多多态存在的条件有继承关系子类重写父类方... 查看详情

c++入门篇之类和对象上(代码片段)

文章目录前言面向过程与面向对象类与对象的引入何为类类的定义访问限定符说明封装类的实例化类模型1.如何计算类对象大小2.类对象的存储方式this指针面试题1.`this`指针存在哪里?2.this指针可以为空吗?前言在讲解了C+&... 查看详情

python入门-6面向对象编程:12设计模式之工厂模式-单例模式(代码片段)

一:工厂模式实现  设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(GoupOfFour)23种设计模式。  工厂模式实现了创建者和调用者的分离,使用专门的... 查看详情

java入门零基础小白教程day06-类和对象(代码片段)

4day06-JAVAOOP课程目标1.【理解】什么是面向对象2.【理解】类和对象的关系3.【掌握】类的定义和使用4.【掌握】三大特征之封装5.【掌握】this关键字的使用一.面向对象概述1.1什么是面向对象Java语言是一种面向对象的程序设计语言... 查看详情

java入门零基础小白教程day06-类和对象(代码片段)

4day06-JAVAOOP课程目标1.【理解】什么是面向对象2.【理解】类和对象的关系3.【掌握】类的定义和使用4.【掌握】三大特征之封装5.【掌握】this关键字的使用一.面向对象概述1.1什么是面向对象Java语言是一种面向对象的程序设计语言... 查看详情

java零基础入门2:java面向对象(代码片段)

🍅简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌、Java架构师奋斗者💪🍅粉丝福利,限时抢购 《Java基础教程系列》限时九折🍅粉丝福利,限时抢购 《SpringBoot基础教程》限时九折🍅扫... 查看详情

java面向对象知识(上:基础篇)(代码片段)

Java面向对象(基础篇)一、面向对象的思想1、什么是面向对象1.1面向过程1.2面向对象二、类和对象2.1类2.1.1类的组成2.2对象三、类和对象在代码中的运用3.1类的应用3.1.1类定义的格式3.2对象的应用3.2.1创建对象的格式以及... 查看详情

面向对象入门(代码片段)

  面向对象是软件开发方法。面向对象的概念和应用已经超越了程序设计和软件开发,电影《无间道》的拍摄就用了面向对象的思想。面向对象是一种对现实世界理解和抽象的方法。  那python中的面向对象是什么样的呢?什... 查看详情

java入门基础(代码片段)

程序是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语... 查看详情

面向对象快速入门(代码片段)

...------变量:静态的,也就是对象下面的变量  对象快速入门案例://构造函数functionCreatPerson(name,sex)this.name=name;this.sex=sex;//对象原型方法:prototype式关键字,相当于所有创建的对象都包含该方法CreatPe 查看详情

java入门13--面向对象(下)(代码片段)

java入门13多态动态编译:类型:可扩展性即同一方法可以根据发送对象的不同而采取多种不同的行为方式一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多多态存在的条件有继承关系子类重写父类方... 查看详情

java基础编程篇(4.面向对象上)(代码片段)

...言尚硅谷-Java课程-笔记(用于自己复习)终于把面向对象看完了🤣,总结一下,基础篇就结束啦~一、类与对象1.面向对象学习的三条主线Java类及类的成员:属性、方法、构造器;代码块、内部类面向... 查看详情

面向对象编程(上)(代码片段)

第四章面向对象编程(上)4.1面向对象(OOP)和面向过程(POP)4.2Java语言的基本元素:类和对象4.3对象的创建和使用4.1面向对象(OOP)和面向过程(POP)面向对象和面向过程二者都是一种思想,面向对象是相对于面向过程而... 查看详情