标签:攻城狮 顺序 重写与重载 功能 参数 com and 签名 继承
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
都是作用在方法上
重载时作用在同一个类中,多个方法名相同,参数列表不同(方法签名不同)而采用的方式
重写是作用在不同类,该类继承于需要修改方法的父类.
区别:
重载是在同一个类中,方法名相同,参数列表不同
重写是作用在两个有继承关系的子类中,方法签名相同
在一些业务实现过程中,子类存在从父类中继承的功能,但子类要实现的功能与父类不同所以我们需要重写该功能,以满足我们的业务需求
重写的方法:与普通方法相同,但是方法名和参数列表要与父类中相同
子类对象在调用这个功能的使用,如果有重写方法,就调用重写方法如果没有则调用父类的方法
public class OverrideDemo {
public static void main(String[] args) {
//创建一个子类的实例(对象)
Son son=new Son();
//使用子类的重载方法
son.word();
}
}
//父类
class Dad{
private int money=1250;
//父类的方法 如果加上static则无法被子类继承
public void words(){
System.out.println("我是父类的方法");
}
}
//子类 父类继承子类
class Son extends Dad{
//在父类被static修饰后,该方法不是重写父类的方法,而是创建了一个新方法
public void word(){
System.out.println("我是子类的方法");
}
}
注意:父类中,方法被static被修饰,则子类无法继承.如果子类中有相同的方法签名,则该方法是子类新建方法,并非对父类方法的重写.
this:代指当前创建的对象
调用本类中其他构造器
必须放在构造器首行
this([参数列表])//参数是列表匹配本类中的其他构造器
区分同名变量(局部变量与成员变量)的问题
this.变量名 代指当前创建对象的变量即成员变量
super:指代父类对象
调用父类构造器
默认调用父类的空构造器//所以在写javaBean的时候要求必须有一个空构造器
调用父类的其他构造器需要显式调用super([参数列表]),参数列表匹配父类构造器的参数列表
与this相同,必须放在构造器的首行
this与super在同个构造器中,不能同时来调用其他构造器
区分同名变量问题(子类和父类)
局部 子类成员 父类成员同名的时候调用局部变量直接写该变量名|方法名(),调用子类变量的时候写this.变量名|this.方法名(),调用父类成员的时候super.变量名|super.方法名()
注意:调用构造方法与调用普通的方法不一样,采用super.变量名|super(参数列表)
如何设置父类中属性值的两种方式:
用设置器和获取器来设置和访问父类中的属性
采用通过构造器给父类的属性赋值,其具体经过如下:子类在创建对象时,调用子类构造器,子类构造器,我们可以子类构造器首行调用父类构造器传入参数,将参数传入到父类构造器中,进而实现对父类属性的赋值
public class Supper01 {
public static void main(String[] args) {
//先执行子类的无参构造,在执行父类的无参构造
Son son1=new Son();
//先执行子类的有参构造,在把值传给父类的有参构造
Son son2=new Son("小吴");
}
}
//父类
class Dad{
//父类成员变量
String name;
//父类成员方法
public void study(){
System.out.println("父亲在学习");
}
//父类构造器
public Dad() {
System.out.println("父类空构造");
}
public Dad(String name) {
this.name = name;
System.out.println("父类带参构造"+this.name);//这里的name是指代当前父类的成员
}
?
}
//子类 继承父类
class Son extends Dad{
//子类成员变量
String name;
//子类成员方法
记住以下三点:
被final修饰的变量为常量
变量的数据类型如果是基本数据类型:存储的数据值不能改变
变量的数据类型如果是引用数据类型:存储的地址值不会改变,但是对象内存中的属性可以改变
被final修饰的方法不能被重写
public class Final01 {
public static void main(String[] args) {
DadOne dad=new DadOne();
SonOne son=new SonOne();
son.eat();
}
}
class DadOne{
int a=5;
public static void eat(){
System.out.println("父类的吃");
}
}
class SonOne extends DadOne{
public static void eat(){//方法签名与父类一致,但是不是重写,因为该方法中在父类中final修饰过,此为新方法
System.out.println("子类的吃");
}
}
以上的代码不会报错,
被final修饰的类不能被继承(俗称太监类)
public class Final01 {
public static void main(String[] args) {
DadOne dad=new DadOne();
SonOne son=new SonOne();
}
}
final class DadOne{
int a=5;
}
class SonOne extends DadOne{//此行会报错
}
所以类的父亲,java中的所有类都会直接或间接继承来自Object类
如果没有显式继承其他类,默认继承自Object类
toString()把对象的内容以字符串的形式展示
源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
在打印一个对象的引用的时候,打印对象的地址,默认打印的是这个对象调用了toString 方法的返回值,根据需要可对toString方法进行重写.
equal方法:
如使用是Object类中的equal()方法中比较是对象的地址
如有对equal()方法重写,则比较就是方法重写的内容.如String.euqals("");
/*
判断两个用户是否是同一个用户,判断条件为 用户名和密码 相同,并输出用户的信息
思路:重写equals方法,判断其中 用户名和密码,重写toString输出用户的信息
?
*/public class UserNamePassword {
public static void main(String[] args) {
UserPassword u1=new UserPassword("小翁","123456");
UserPassword u2=new UserPassword("xaiaong","56152");
UserPassword u3=new UserPassword("小翁","123456");
String a="525";
System.out.println(u1);
System.out.println(u2);
System.out.println(u3);
System.out.println(u1.equals(u2));
System.out.println(u1.equals(u3));
System.out.println(u1.equals(525));
System.out.println(u1.user.equals("小翁"));
}
}
class UserPassword{
public String user;
public String password;
public UserPassword() {
super();
}
public UserPassword(String user, String password) {
super();
this.user = user;
this.password = password;
}
//重写toString方法