面向对象进阶
最佳答案 问答题库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
重写
构造器不能被重写,可以被重载!
- 子类重写的方法
必须
和父类被重写的方法具有相同的方法名称
、参数列表
。 - 子类重写的方法的返回值类型
不能大于
父类被重写的方法的返回值类型。(例如:Student < Person)。
注意:如果返回值类型是基本数据类型和void,那么必须是相同
- 子类重写的方法使用的访问权限
不能小于
父类被重写的方法的访问权限。(public > protected > 缺省 > private)
注意:① 父类私有方法不能重写 ② 跨包的父类缺省的方法也不能重写
- 子类方法抛出的异常不能大于父类被重写方法的异常
此外,子类与父类中同名同参数的方法必须同时声明为非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%的人还看了
相似问题
- Kotlin学习——kt里的集合,Map的各种方法之String篇
- Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览
- composer切换全局镜像源的方法
- Python通过selenium调用IE11浏览器报错解决方法
- 测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发
- Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- ChatGLM2 大模型微调过程中遇到的一些坑及解决方法(更新中)
- 类方法,静态方法和实例方法的区别及应用场景
- 【链表的说明、方法---顺序表与链表的区别】
猜你感兴趣
版权申明
本文"面向对象进阶":http://eshow365.cn/6-34575-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 在教育领域,AI垂直大模型应用场景总结!
- 下一篇: 用自己的数据集训练YOLO-NAS目标检测器