面向对象进阶

简介: 面向对象进阶

this

this表示当前对象

  • this可以调用的结构:成员变量(属性)、方法和构造器
class Person{   // 定义Person类
  private String name ; 
  private int age ;     
  public Person(String name,int age){ 
    this.name = name ;   
    this.age = age ;  
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
  public void getInfo(){  
    System.out.println("姓名:" + name) ;
    this.speak();
  }
  public void speak(){
    System.out.println(“年龄:” + this.age); 
  }
}
同一个类中构造器互相调用
  • this():调用本类的无参构造器
  • this(实参列表):调用本类的有参构造器

注意点

  • 不能出现递归调用。比如,调用自身构造器。
  • 推论:如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
  • this()和this(实参列表)只能声明在构造器首行。
  • 推论:在类的一个构造器中,最多只能声明一个"this(参数列表)"
public class Student {
    private String name;
    private int age;
    // 无参构造
    public Student() {
//        this("",18);//调用本类有参构造器
    }
    // 有参构造
    public Student(String name) {
        this();//调用本类无参构造器
        this.name = name;
    }
    // 有参构造
    public Student(String name,int age){
        this(name);//调用本类中有一个String参数的构造器
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getInfo(){
        return "姓名:" + name +",年龄:" + age;
    }
}

extends继承(面向对象特性之一)

继承性特点:单继承性、支持多层继承,但是只能单继承。一个父类可以有多个子类。

可以继承父类的属性和方法(包括构造器)

override/overwrite

重写

构造器不能被重写,可以被重载!

  1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称参数列表
  2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型。(例如:Student < Person)。

注意:如果返回值类型是基本数据类型和void,那么必须是相同

  1. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。(public > protected > 缺省 > private)

注意:① 父类私有方法不能重写   ② 跨包的父类缺省的方法也不能重写

  1. 子类方法抛出的异常不能大于父类被重写方法的异常

此外,子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

方法的重载与重写

方法的重载:方法名相同,形参列表不同。不看返回值类型。


方法的重载是指在同一个类中,有多个具有相同名称的方法,但它们的参数列表不同(包括参数的类型、数量或顺序)。在方法的重载中,返回值类型通常不被视为区分方法的标准。所以你的理解是正确的:不看返回值类型,只要方法名相同,形参列表不同,就可以认为这是方法的重载。


例如,下面的两个方法被认为是方法的重载:

public int add(int a, int b) {
    return a + b;
}
public double add(double a, double b) {
    return a + b;
}

这两个方法名相同,但参数类型不同,一个接收int,另一个接收double,因此它们被认为是方法的重载。不同的返回值类型不会影响方法的重载。在调用时,编译器会根据传递的参数类型来决定应该调用哪个版本的方法。


super

super直接调用父类的方法,属性,构造器的关键字

this()和super()只能存在一个,()里面都是形参,可以空白。

this是就近原则。

子类对象实例化


结果上,体现为继承性

过程上,子类调用构造器创建对象时,一定会直接或者间接调用父类的构造器,以及父类的父类的构造器,直到调用object类的构造器。

class Parent {
    int parentValue;
    Parent(int value) {
        this.parentValue = value;
    }
    void parentMethod() {
        System.out.println("This is a method in the parent class.");
    }
}
class Child extends Parent {
    int childValue;
    Child(int parentValue, int childValue) {
        super(parentValue); // 调用父类的构造方法来初始化父类的属性
        this.childValue = childValue;
    }
    void childMethod() {
        System.out.println("This is a method in the child class.");
    }
}
public class Main {
    public static void main(String[] args) {
        Child child = new Child(10, 20); // 实例化Child类的对象
        child.parentMethod(); // 调用从父类继承的方法
        child.childMethod(); // 调用子类自己的方法
    }
}

多态性(面向对象特性之一)

多态性,是面向对象中最重要的概念,在Java中的体现:对象的多态性:父类的引用指向子类的对象

多态性好处: 减少代码冗余,大量重载方法的定义 开闭原则

举例 public boolean equals(Object obj)

多态无处不在

//格式:(父类类型:指子类继承的父类类型,或者实现的接口类型)
//比如
Person person = new Man();
//强制转换
Man m1 = (Man)person;
//判断对象是否属于符合强转类
if(person instanceof Man){ //判断对象person是否符合类Man
    Man m1 = (Man)person;
    m1.earnMooney();
}

父类类型 变量名 = 子类对象;


编译时,认为方法是左边声明的父类的类型方法


运行时,实际执行的是右边子类重新父类的方法


简称,编译看左边,运行看右边


多态的使用前提:①要有继承关系 ②要有方法的重写


多态的适用性:适用于方法,不适应于属性


所以运行时方法变子类,属性还是父类

解决多态性弊端

无法直接调用子类特有属性与方法

可以利用强制转换

object

翻译为对象

类 java.lang.Object是类层次结构的根类,即所有其它类的父类。每个类都使用 Object 作为超类。

根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。这里我们主要关注其中的6个

equals是object类的一个方法,仅仅适用于引用类型的判断!
面试题:==和equals的区别

== 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

  • equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
  • 具体要看自定义类里有没有重写Object的equals方法来判断。
  • 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

toString

直接调用object的toString方法,返回当前对象所属的类和地址值

开发中,一般IDEA重新equals和toString 的方法使用

AIT和INSER快捷键

结语

我是南城余!欢迎关注我的博客!一同成长!

一名从事运维开发的worker,记录分享学习。

专注于AI,运维开发,windows Linux 系统领域的分享!

目录
相关文章
|
17天前
|
算法 Java 程序员
【C++专栏】C++入门 | 类和对象 | 面向过程与面向对象的初步认识
【C++专栏】C++入门 | 类和对象 | 面向过程与面向对象的初步认识
21 0
|
8月前
|
机器学习/深度学习 存储 算法
|
8月前
|
设计模式 算法 搜索推荐
C++的编程思想和进阶编程
● 一个模式描述了一个不断发生的问题以及这个问题的解决方案;模式是前人的设计经验上总结出来的对于一些普遍存在的问题提供的通用的解决方案;比如单例模式、观察者模式等 ● 软件中有很多模式 面向对象常见的23中设计模式; 反模式;企业应用架构模式等
35 0
|
10月前
|
存储 开发框架 Java
|
11月前
|
程序员 测试技术 C语言
c++面向对象程序设计入门
c++面向对象程序设计入门
139 0
|
11月前
|
Python
面向对象进阶
面向对象进阶
58 0
|
数据安全/隐私保护 C++
C++面向对象程序设计简介
C++面向对象程序设计简介
171 1
|
存储
笔记08-面向对象
笔记08-面向对象
笔记08-面向对象
|
存储 安全 数据库
面向对象基础进阶01
面向对象基础进阶01
97 0
面向对象基础进阶01
|
存储 安全 Java
面向对象基础进阶02
面向对象基础进阶02
76 0
面向对象基础进阶02