首页 > 其他分享 >面向对象

面向对象

时间:2023-02-05 15:44:28浏览次数:36  
标签:name 子类 面向对象 Student new 父类 public

面向对象

面向对象适合处理复杂的问题,适合处理多人协作的问题

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

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

三大特性:

  • 封装
  • 继承
  • 多态

类与对象的创建

public class Student {
    String name;//默认null
    int age;//默认0

    public void study(){
        System.out.println(this.name+"在学习");
    }
}
public class Application {
    public static void main(String[] args) {
        Student xiaoming = new Student();

        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);

        xiaoming.name="xiaoming";
        xiaoming.age=18;

        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);
    }
}

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

类中构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩特点:

  • 必须和类的名字相同
  • 必须没有返回值,也不能写void

一个类就算不写构造方法,它也会存在一个空的构造方法。

public class Person {
    String name;

    //使用new方法本质就是在调用构造器
    public Person(){

    }

    //一旦定义了有参构造,无参就必须显式定义
    public Person(String name){
        this.name=name;
    }
}

alt+insert可以快捷生成

封装

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

类属性私有,外部通过get和set方法访问

public class Person {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

封装的好处:

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

继承

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

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

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

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

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

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

Ctrl+H可以查看继承树

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

super

注意点:

  • 子类使用super关键词可以访问父类非私有且与子类同名的变量和方法。
  • 私有的东西无法被继承。
  • 在new一个子类对象时,会先执行父类的无参构造器,再执行子类的构造器,且父类的构造器是在子类构造器的第一行。如果父类没有无参构造器。
  • super只能出现在子类的方法或者构造方法中,例如Son类继承了Father类,Son类使用super不能访问到Object。
  • 补充:this()访问本类的构造,super()访问父类的构造。

方法重写

  • 子类以相同的方法名和参数列表重写代码,覆盖父类的方法。

  • 修饰符范围可以扩大但不能缩小,

  • 抛出的异常范围可以缩小不能扩大。

public class Father {
    public void Test(){
        System.out.println("father");
    }
}
public class Son extends Father{
    @Override
    public void Test() {
        System.out.println("Son");
    }
}
public class ExtendsTest {
    public static void main(String[] args) {
        Son son = new Son();
        //父类的引用指向了子类
        Father father=new Son();

        son.Test();//输出Son
        father.Test();//输出Son
    }
}
  • 静态方法和非静态方法区别很大,静态方法的调用之和左边,定义的类型有关。

如果将Son类和Father类的test方法都加上static关键词,输出会变成son输出Son,father输出Father

多态

  • 同一方法可以根据发送对象的不同而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多。

Student继承Person

public static void main(String[] args) {
    //一个对象的实际类型是确定的
    //new Student

    //可以指向的引用类型就不确定了:父类的引用指向子类

    //Student能调用的方法都是自己的或是继承父类的
    Student s1=new Student();
    //Penson父类型,可以指向子类,但是不能调用子类独有的方法
    Person s2= new Student();
    Object s3=new Student();

    s1.run();//Student Run
    s2.run();//Student Run
}
  • 多态是方法的多态,属性没有多态
  • 父类引用指向子类且使用子类独有的方法时,需要类型转换,可能会产生ClassCastException
  • 多态存在条件:继承关系,方法需要重写,父类引用指向子类对象。 Father f1 = new Son();

不能被重写更不能产生多态:

  1. static 方法,属于类,不属于实例
  2. final 常量
  3. private 方法

instanceof (类型转换)引用类型,可以判断是否存在父子关系以及对象的类型。

抽象

abstract 关键词

特点:

  1. 不能new这个抽象类,只能靠子类去实现它。
  2. 抽象类中可以写普通的方法。
  3. 抽象方法必须在抽象类中
  4. 子类需要实现它继承的抽象类中的抽象方法,除非子类也是抽象类

接口

  • 普通类:只有具体实现
  • 抽象类:具体实现和规范(抽象方法)都有
  • 接口:只有规范,自己无法写方法~专业的约束!约束和实现分离:面向接口编程

使用interface定义。

通过implements实现,想要实现接口,必须实现接口中的所有方法。

接口侧面实现了多继承。

标签:name,子类,面向对象,Student,new,父类,public
From: https://www.cnblogs.com/xingbingle/p/17093459.html

相关文章

  • 50面向对象-继承(super和this)
    packagechapter04;publicclassJava12_Object_Extends_01{publicstaticvoidmain(String[]args){//TODO面向对象-Extends-继承//如果......
  • 49面向对象-继承extends
    packagechapter04;publicclassJava12_Object_Extends{publicstaticvoidmain(String[]args){//TODO面向对象-Extends-继承//面向对象......
  • 48面向对象-构建对象
    packagechapter04;importjava.util.ArrayList;publicclassJava11_Object_Instance{publicstaticvoidmain(String[]args){//TODO面向对象-构建......
  • 47面向对象-Import
    packagechapter04;importjava.util.*;importjava.sql.Date;publicclassJava10_Object_Import{publicstaticvoidmain(String[]args){//TODO面向......
  • 46面向对象-包package
    packagechapter04;publicclassJava09_Object_Package{publicstaticvoidmain(String[]args){//TODO面向对象-Package-包//package中......
  • 45面向对象-静态代码块
    packagechapter04;publicclassJava08_Object_Static_01{publicstaticvoidmain(String[]args){//TODO面向对象-静态//TODO现有类,再有......
  • 43面向对象-方法参数-传值方式
    https://www.bilibili.com/video/BV1o841187iP?p=43&spm_id_from=pageDriver&vd_source=1a3d02563ce9248e8d473233ccdf3612 //TODO面向对象-方法参数-传值方式//......
  • 42面向对象-方法参数
    packagechapter04;publicclassJava07_Object_Method_Param{publicstaticvoidmain(String[]args){//TODO面向对象-方法参数//使用外部......
  • Java基础-面向对象
    目录00x1基本语法1.类的语法2.对象的语法3.方法的声明4.小例子00x2类和对象的关系1.堆、栈和元空间2.基本数据类型和引用数据类型的区别3.空对象(null)00x3方法00x4静态......
  • 41面向对象-方法
    packagechapter04;publicclassJava06_Object_Method{publicstaticvoidmain(String[]args){//TODO面向对象-方法//声明的语法:void方......