在乐字节学习的第二天,乐趣不断

it2023-05-17  84

uper关键字

super

super是指向父类的引用。

super可以在子类构造器中调用父类某个构造器

如果构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用。如果父类由没有默认的无参构造方法,编译器就会报错,super()语句必须是构造方法的第一个子句。

super可以用来区分子父类中同名成员

如果不存在同名问题,可以直接在子类中调用父类内容,super默认省略

如果存在同名问题,在子类中调用同名成员,默认this.恒源 调用当前子类同名成员,先要调用父类同名成员,必须定义为super.成员

//父类 public class Animal { int eye = 2; public Animal(){ super(); System.out.println("动物"); } public void run(){ System.out.println("动物有不同走路方式"); } public static void main(String[] args) { Bird b = new Bird(); b.run(); } } //子类 class Bird extends Animal{ public Bird(){ super(); System.out.println("鸟类"); } public void run() { super.run(); // 通过super可以用父类方法和属性 System.out.println("鸟是飞飞飞飞飞飞"); System.out.println("鸟类有"+super.eye+"只眼睛"); } }

Bird–> Animal --> Object 图形分析如下

构造方法调用顺序:

根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

this和super之间的区别

相同点:

this和super都能用来调动其他共构造器,都要在首行出现this和super都可以用来区分同名问题,不区分同名时候可以省略this和super都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句

块。

不同点:

this(参数)构造器第一行调用本类中其他构造器,super(参数)构造器第一行调用父类中某个构造器this用来区分成员和局部同名问题,super用来区分子父类中同名问题

注意:

this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会过。

从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字

重写与final关键字

重写Override

父类的功能实现不满足子类的要求,可以在子类中按需改写,这就是方法的重写。

实现重写的三个条件:

不同的两个类继承关系|实现关系方法签名相同

@Override:注解,强制检查是否为重写方法

注意:

子类重写的方法会对父类的方法进行屏蔽。当子类对象调用时,会调用子类中重写的方法,子类没有找父类。 public class OverrideTest { public static void main(String[] args) { Sicong sicong=new Sicong(); sicong.getMoney(); //调用子类中重写方法 } } //父类 class Jianlin{ public void getMoney(){ System.out.println("先定一个小目标,赚他个一个亿"); } } //子类 class Sicong extends Jianlin{ @Override //强制检查是否为重写方法 public void getMoney(){ super.getMoney();//在父类的原赚钱方法上扩展新功能,老功能不变 System.out.println("我认识的人都没我有钱"); } }

重写的三个"=" : “==”:方法名、形参列表相同。

“≤”:抛出的异常类型与返回值类型,返回值类型如果为基本类型必须相同,引用数据类型子类小于等于父类。

“≥”:访问权限,子类大于等于父类。

以下修饰符、修饰的内容不能重写:

private修饰的方法不能被重写final修饰的方法不能被重写static修饰的方法不能被重写(子类如果出现和父类静态方法同名情况,那么子类中的方法也必须为静态的)

final关键字

final 表示最终的。

final可以用来修饰变量,方法,类。

修饰变量:变量一旦被初始化便不可改变,相当定义了一常量。

final int x=3; //x=4; 常量不能改变

修饰方法 : final方法是在子类中不能被覆盖的方法

final void eat() {}

修饰类,表示该类不能被继承

final class Person{}

Object类

Object 类是所有 Java 类的根基类

如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类

toString(): 当打印对象的引用时,默认调用toString()方法

默认返回:包名+类名+@+哈希码(根据对象的内存地址生成,唯一不重复)可以重写,实现义字符串的形式返回对对象(打印对象所有成员属性的值) User p1=new User("张三",20); System.out.println(p1); //相当于 System.out.println(p1.toString());

equals:比较相等是否相等**

默认地址比较(”第一个盒子的比较”)

重写可以是实现比较两对象的内容是否一致

object1.equals(object2): p1.equals(p2) • 比较所指对象的内容是否一样,具体看equals的方法重写 object1 == object2 如:p1==p2 • 比较p1和p2的值即内存地址是否相等,即是否是指向同一对象。

注意:自定义类须重写equals(),否则无法实现比较其内容

class User{ String name; int age; public User() { // TODO Auto-generated constructor stub } public User(String name, int age) { super(); this.name = name; this.age = age; } //重写toString @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } //重写equals @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
最新回复(0)