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