初识JAVA09:方法的重写、super关键字、final关键字、Object类_记忆面包的博客-程序员宅基地

技术标签: 学习  字符串  面向对象编程  说明  列表  javase  object  

面向对象

方法的重写

方法的重载 Overload

方法的重写 Override

​ 共同点:都是方法的特性

​ 不同:

​ 重载的三个条件:

​ 同一个方法内

​ 方法名相同

​ 参数列表|方法签名不同

​ 重写的三个条件:

​ 不同的方法内

​ 继承关系|实现关系

​ 方法签名相同

​ 调用:

​ 如果子类中存在方法的重写,当通过子类对象调用的时候,会调用子类中重写的方法,会对父类方法进行屏蔽

​ 作用:

当子类从父类中继承了某一个方法,方法满意,方法的实现|方法体不满意的时候,就可以在子类中重现实现方法,重现定义方法体,重写方法

​ 检查是否为重新方法:

​ 1.在方法的左侧行首存在o↑标识

​ 2.使用一个逐渐强制检查当前方法是否为一个重写方法@Override

​ 方法重写的具体要求:

​ 1.== 子类中重写方法,方法签名相等

​ 2.<= 方法的返回值类型为基本数据类型时

​ 要求被重写的方法和重写的方法返回值类型完全一致

​ 方法的返回值类型为引用数据类型时

​ 子类中重写方法的返回值类型小于等于父类中被重写方法的返回值类型

​ 3.>= 子类中重写方法的权限修饰符大于等于父类中被重写方法的权限修饰符

​ 注意:

​ 1.被private修饰的方法不能被重写

​ 2.被final修饰的方法不能被重写

​ 3.静态方法不能被重写

​ 当子类中出现和父类静态方法同名的方法,要求子类中的这个同名方法也要被static修饰

package com.xxx.demo;

public class OverrideDemo {
    
    private int a;
    private int b;
    private static int c;
    private static int d;

    public OverrideDemo(){
    

    }

    public int getA() {
    
        return a;
    }

    public void setA(int a) {
    
        this.a = a;
    }

    public int getB() {
    
        return b;
    }

    public void setB(int b) {
    
        this.b = b;
    }

    public static int getC() {
    
        return c;
    }

    public static void setC(int c) {
    
        OverrideDemo.c = c;
    }

    public static int getD() {
    
        return d;
    }

    public static void setD(int d) {
    
        OverrideDemo.d = d;
    }

    //方法签名相同,返回值为基本数据类型,返回值类型一致,权限修饰符为default
    int getMax(){
    
        if(a>b){
    
            return a;
        }else{
    
            return b;
        }
    }

    //方法被static修饰
    public static int getMin(){
    
        if(c>d){
    
            return d;
        }else{
    
            return c;
        }
    }
}
package com.xxx.demo;

public class OverrideTest extends OverrideDemo{
    
    public OverrideTest(){
    

    }

    //方法签名相同,返回值为基本数据类型,返回值类型一致,权限修饰符public大于父类中的default
    @Override   //使用注解强制检测该方法是否为重写方法
    public int getMax(){
    
        int max;
        max = getA()>getB()?getA():getB();
        return max;
    }

    //父类方法被static修饰,子类方法出现同名方法需要方法也被static修饰
    //@Override   //因为静态方法不能被重写,所以无法使用注解强制检查
    public static int getMin(){
    
        int max;
        max = getC()>getD()?getD():getC();
        return max;
    }
}

super关键字

​ 指代父类对象,可以通过super调用子类对象中的父类对象,但是不代表super存储了父类对象的地址,不能直接输出super

​ 1.在子类构造器的首行,调用父类中的构造器

​ super(参数列表);

​ 所以构造器中只能调用一个构造器,一个this(参数列表);或者一个super(参数列表);

​ 在子父类继承的关系下,创建子类对象的时候,先父类后子类,父类对象在子类对象内存空间中

​ 如果在子类构造器的首行没有显式调用父类构造器,默认调用父类空构造

​ 2.区分子父类中同名成员问题

​ 在子类中使用super指代子类内存空间中的父类对象

​ 默认就近原则

​ 通过super.父类成员;来调用父类成员

​ 在静态方法中不能使用this,super关键字

package com.xxx.demo;

public class SuperDemo {
    
    public static void main(String[] args) {
    
        new Police();
        System.out.println("-----------------------------------------");
        new Police(1);
    }
}

class Person{
    
    private String name;
    private int age;

    public Person() {
    
        System.out.println("父类空构造被调用");
    }

    public Person(int a){
    
        System.out.println("父类带参构造被调用");
    }

    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 void run(){
    
        System.out.println(age+"岁的"+name+"正在奔跑");
    }
}

class Police extends Person{
    
    public Police() {
    
        super(1);
        //this();  报错,因为调用其他构造方法需要在构造函数的首行
        System.out.println("子类空构造被调用");
    }
	//默认调用父类空构造
    public Police(int a){
    
        System.out.println("子类带参构造被调用");
    }
}

/*
输出:
父类带参构造被调用
子类空构造被调用
-----------------------------------------
父类空构造被调用
子类带参构造被调用
*/

区分局部,子类成员,父类成员同名问题

package com.xxx.demo;

public class DifferentDemo {
    
    public static void main(String[] args) {
    
        new DifferentZi().print();
    }
}

class DifferentFu{
    
    DifferentFu(){
    

    }
    public int a=10;
}

class DifferentZi extends DifferentFu{
    
    DifferentZi(){
    

    }
    public int a=5;

    public void print(){
    
        int a =1;
        //使用this.和super.区分子父类同名变量,不加this和super关键字的话默认就近原则
        System.out.println(a+"-->"+this.a+"-->"+super.a);
    }
}

final关键字

​ 最终的,是成员修饰符,也可以修饰局部

​ 被final修饰的变量为常量,不能被修改

​ 被final修饰的方法不能被重写

​ 被final修饰的类不能被继承–>太监类

package com.xxx.demo;

public class FinalDemo {
    
    final int f=10;
    public static void main(String[] args) {
    
        //f = 20;   不能被修改
    }
}

class FinalFu{
    

    public FinalFu(){
    

    }

    public final void print(){
    
        System.out.println("我是父类");
    }
    //可以被重载
    public final void print(int a){
    
        System.out.println("我是父类");
    }
}

class FinalZi extends FinalFu{
    
    public FinalZi(){
    

    }

    /*
    被修饰的类不能被重写
    public final void print(){
        System.out.println("我是子类");
    }
     */

}

final class Finaltest1{
    

}
//class Finaltest2 extends Finaltest1{} 不能继承被final修饰的FinalTest1类

Object类

是java中所有类的父亲

在Java中的所有类都会直接或者间接的继承自Object类

toString()

toString() 把对象数据以字符串的形式表示

直接打印一个对象的引用的时候,默认打印的是调用toString()方法的返回值,此时会返回对象在堆内存中的地址

需求:

在打印一个javabean类型对象的引用的时候,其实是想要了解这个对象的基本信息->成员变量的值

解决:

在子类中重写toString方法,因为打印对象引用时候默认会调用toString(),toString功能需要,实现不满意,就重写

package com.xxx.learn.tostringdemo;

public class ToStringDemo {
    
    public static void main(String[] args) {
    
        StudentInfo si = new StudentInfo("张三",20,10000,"高一三班");
		//在子类中将toString()方法重写,直接打印引用时,调用的为子类中重写的toString()方法
        System.out.println(si);
    }
}
package com.xxx.learn.tostringdemo;
//所有的类都是Object的子类
public class UserInfo {
    
    private String name;
    private int age;
    private int id;

    public UserInfo(){
    
    }

    public UserInfo(String name,int age,int id){
    
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public void setName(String name) {
    
        this.name = name;
    }

    public void setAge(int age) {
    
        this.age = age;
    }

    public void setId(int id) {
    
        this.id = id;
    }
	//重写Object中的toString()
    @Override
    public String toString(){
    
        return "姓名:"+this.name+"\n年龄:"+this.age+"\n学号:"+this.id+"\n";
    }
}
package com.xxx.learn.tostringdemo;

public class StudentInfo extends UserInfo{
    
    private String classname;

    public StudentInfo(){
    
    }

    public StudentInfo(String name,int age,int id,String classname){
    
        super(name,age,id);
        this.classname = classname;
    }
	//重写UserInfo中的toString()
    @Override
    public String toString(){
    
        return super.toString()+"班级:"+this.classname;
    }
}

equals()

== 可以比较所有数据类型的数据

​ 基本数据类型->比较数值,引用数据类型->比较对象地址

equals() 只能比较引用数据类型的数据

​ 比较两个数据是否相等 对象1.equals(对象2)

​ Object类中equals方法的实现->默认比较对象的地址,可以通过重写equals方法实现比较对象的内容

​ 在使用String引用数据类型调用equals方法时,jdk已经将equals方法重写,实现了比较字符串中内容是否相等.

需求:

​ 比较两个引用数据类型对象的时候,想要比较两个对象的所有成员变量的值是否都相等,而非比较对象地址

解决:子类中重写equals方法,将对象中属性的值赋值给局部String类型变量,通过字符串类中的equals方法比较每个String变量是否相等,来比较对象中的内容,非地址

package com.xxx.learn.tostringdemo;

public class UserInfo {
    
    private String name;
    private int age;
    private int id;

    public UserInfo(){
    
    }

    public UserInfo(String name,int age,int id){
    
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public void setName(String name) {
    
        this.name = name;
    }

    public void setAge(int age) {
    
        this.age = age;
    }

    public void setId(int id) {
    
        this.id = id;
    }

    public String getName() {
    
        return name;
    }

    public int getAge() {
    
        return age;
    }

    public int getId() {
    
        return id;
    }

    public String toString(){
    
        return "姓名:"+this.name+"\n年龄:"+this.age+"\n学号:"+this.id+"\n";
    }
}
package com.xxx.learn.tostringdemo;

public class StudentInfo extends UserInfo{
    
    private String className;

    public StudentInfo(){
    
    }

    public StudentInfo(String name,int age,int id,String className){
    
        super(name,age,id);
        this.className = className;
    }

    public String getClassname() {
    
        return className;
    }

    public String toString(){
    
        return super.toString()+"班级:"+this.className;
    }
	//子类中重写equals方法,用来StudentInfo对象和其他对象比较
    @Override
    public boolean equals(Object obj){
    
        if(this == obj){
    
            return true;
        }
        //判断一个对象是否为一个类的实例
        if(obj instanceof StudentInfo){
    
            //如果是,就把它强制转换为StudentInfo类型,保证可以调用StudentInfo类中的方法
            String name = ((StudentInfo) obj).getName();
            String className = ((StudentInfo)obj).getClassname();

            return (this.getName().equals(name) && this.getClassname().equals(className) && this.getAge() == ((StudentInfo)obj).getAge() && this.getId() == ((StudentInfo)obj).getId());
        }
        return false;
    }
}
package com.xxx.learn.tostringdemo;

public class ToStringDemo {
    
    public static void main(String[] args) {
    
        StudentInfo si1 = new StudentInfo("张三",20,10000,"高一三班");
        StudentInfo si2 = new StudentInfo("张",20,10000,"高一三班");
        StudentInfo si3 = new StudentInfo("张三",20,10000,"高一三班");
        System.out.println(si1);
        System.out.println(si2);

        System.out.println(si1.equals(si2));
        System.out.println(si1.equals(si3));

    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43980278/article/details/117885677

智能推荐

solr5.0mysql_solr windows搭建全记录 – ILSM_景海UI的博客-程序员宅基地

安装1.下载apache-tomcat-7.0.42-windows-x64,solr-4.4.0,jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_20082.安装jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_20083.解压apache-tomcat-7.0.42-windows-x64,solr-4.4.0到e:\a...

魅族鸿蒙os测试,EMUI11系统完成推送 鸿蒙OS将在年底进行测试_月落的蜂蜜的博客-程序员宅基地

众所周知,华为的旗舰机有P系列和Mate系列,其中Mate系列比较商务,适合白领、办公人群使用,而P系列主打拍照,适合年轻人使用。作为旗舰机,系统更新肯定不能落下,两者都是每个月更新一次小版本,一年更新一次大版本,系统更新也是为了优化拍照水平、丰富功能、修复BUG以及添加安卓补丁。一般来说,旗舰机有三个大安卓版本的更新,之后就会被放弃,都是小修小补。今年的大版本为EMUI11系统,根据不同机型不同...

推荐书单1.0:测试工程师成长之路_weixin_34162695的博客-程序员宅基地

晚上到家后看完了《文明之光》最后一个章节的内容,然后对着书架发呆,想了半天,突然冒出一个念头:何不整理一个推荐书单?想到就做!这里就将自己看过的一些觉得不错的书整理个目录,方便自己及其他人查阅,做个参考。。。。17年最后的几天,我整理好了自己18年的阅读计划和购书书单,也希望看到这篇博客的各位有自己的学习计划。。。 关于软件测试的思维和方法论《Google软件测试之道》《敏...

取消CheckBox的点击阴影效果_夏夜班星的博客-程序员宅基地_checkbox去掉点击效果

android:background="@android:color/transparent"CheckBox属性添加android:background为透明后,可取消点击的阴影效果。

python含义是什么_python _=是什么意思_weixin_39773158的博客-程序员宅基地

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!在while loops里我们常常会碰到的 += 意思很简单,大致上大家都说了再加以解释吧! &gt;&gt;&gt; num = 1 当 num 小过5 或等于 5 它会一直不断的输出,直到 num 大过才会停止输出im mtcy 在这个时候我们注意到在下方有一行代码. num +...

社交化分享SDK for Unity_weixin_33769207的博客-程序员宅基地

前言社交化分享,即分享到社交网络。本文主要记录的是在Unity集成社交化分享SDK,现主流的分享SDK有如下:1、友盟社交化分享 for unity2、ShareSDK分享 for unity分享SDK for Unity下面看一下使用SDK进行分享的效果友盟 SDK分享Share SDK分享如何分享大图片QQ分享-大图片比如,...

随便推点

Ajax和Ajax Jquery_潮有信的博客-程序员宅基地

Ajax定义:异步的javascript和XML,是一种综合技术,运用XMLHttpRequest(xhr)和服务器交换数据,通过javascript局部渲染页面,从而实现页面异步的局部更新同步与异步: 简单来说同步代码按顺序执行,会阻塞代码执行(alert)。异步不会阻塞代码。一、XMLHttpRequest(XHR)1、创建xml 对象var xhr = new XMLHTTPRequest()2、 打开HTTP连接xhr.open(method,url,布尔值)////打开的方法

react引入html2canvas和jspdf生成PDF打印及下载_拷贝程序猿的博客-程序员宅基地_react 打印pdf

项目场景:项目场景:系统新增打印发货单功能开工开工两种方式引入依赖包npm install html2canvas jspdf --saveyarn add html2canvas jspdf --save直接上代码:提示:项目引入组件较多,自行理解代码即可。注意opacity: 0 处为点睛之笔。防止拷贝的dom覆盖当前样式故隐藏,display:none是不行的,pdf会白纸的哦!import React, { createRef, LegacyRef } from 'reac

参数化查询 但未提供该参数(将null插入数据库)_Young丶的博客-程序员宅基地_参数化查询需要参数但未提供该参数

当你是使用参数化查询时为参数赋值时,比如command.Parameters.Add("@a",SqlDbType.Text,30).Value=a;当a=null是将报错:错参数化查询 '(@a varchar(100)....' 需要参数 '@a',但未提供该参数只是因为你给a的值为null,而数据库中的null(空)是System.DBNull 类型的不是同一类。所以在插

charles 请求出现乱码_Charles中windows版本解决response乱码问题_今忱的博客-程序员宅基地

在charles.ini中,手动增加一个vmarg.6=-Dfile.encoding=UTF-8即可working.directory=.classpath.1=lib/charles.jarmain.class=com.xk72.charles.gui.MainWithClassLoadervm.version.min=1.8vm.location=jre\bin\server\jvm.dll...

爬虫能用到,将爬到的字典转为dataframe格式_了因和尚的博客-程序员宅基地

import pandas as pd #导入pandas包data = pd.read_csv("2.csv") #读取csv文件#print (data.head(5))#print(data.columns)#print(data.shape)order = ['time', 'match', 'home', ...

售价1.7万!华为5G折叠手机发布,到底值不值得买?_weixin_33851429的博客-程序员宅基地

曾经爱理不理,现在高攀不起!2月24日,华为推出首款5G折叠手机!网友们沸腾了!大胆的折叠机身设计,搭载5G技术的高端配置,以及让人感叹的昂贵售价!我们一起来看看吧!机身配置配置上看,华为Mate X搭载了8英寸的柔性可折叠OLED显示屏,麒麟980处理器,内置两块电池,容量为4500mAh,支持快充,30分钟可充电85%。卖点之一:折叠这可难坏了买手机壳的哟~折叠是Mate X...

推荐文章

热门文章

相关标签