当前位置:首页 > 编程笔记 > 正文
已解决

面向对象进阶

来自网友在路上 173873提问 提问时间:2023-11-07 15:29:24阅读次数: 73

最佳答案 问答题库738位专家为你答疑解惑

 本章节对应知识库

面向对象基础 (yuque.com)



面向对象基础 (yuque.com)

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是否符合类ManMan 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 系统领域的分享!

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"面向对象进阶":http://eshow365.cn/6-34575-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!