Java基础入门day20

day20

思考

父类中含有一个无参的test方法,子类含有一个带参的test方法

问题:子类中的带参test方法与父类的无参test方法之间是什么关系?

package com.saas;
​
public class Father {
​public void test(){System.out.println("this is test method in Father class");}
}
package com.saas;
​
public class Son extends Father{
​/*** 当前的这个test方法与父类Father类中的无参test方法之间毫无关系*  最多是当前类中含有一个从父类Father继承过来的无参test方法与当前类自己定义的带参test方法之间构成方法的重载* @param n*/public void test(int n){System.out.println("this is test method with param in Son class");}
}

tips:

  • Son类中的带参test方法与父类Father中的无参test方法直接没有关系

  • Son类中的带参test方法与Son类中从父类Father继承过来的无参test方法之间构成方法重载的关系

继承

语法:

class 子类 extends 父类 {类体} // 定义子类时,显式地继承父类

使用关键字extends代表了一种继承关系,不能单纯从类名上进行判断是否是继承关系

应用:

产出继承关系后,子类可以使用父类中的非私有属性和方法,子类也可以定义自己所特有的属性和方法

好处:

既提高代码的复用性,有提高的可扩展性

特点:

Java的类只能是单继承,一个类最多只能继承一个父类,但是可以实现多级继承

package com.saas;
​
public class Person {
​String name;int age;
​public void talk(){System.out.println("i am " + name + ", i am " + age + " years old.");System.out.println("talking....");}
}
package com.saas;
​
public class Student extends Person{
​public void study(){System.out.println("study ...");}
}
package com.saas;
​
public class JavaStudent extends Student{
​@Overridepublic void study() {System.out.println("open idea...");super.study();}
​public void javaStudy(){System.out.println("i like java");System.out.println("i am studying...");}
}
package com.saas;
​
public class TestStudent {
​public static void main(String[] args) {Person p = new Person();
​p.name = "baoyu";p.age = 18;
​p.talk();System.out.println("---------------------");
//        p.study();
​System.out.println("====================");
​Student s = new Student();
​s.name = "daiyu";s.age = 16;
​s.talk();System.out.println("---------------------");s.study();System.out.println("---------------------");
//        s.javaStudy();
​System.out.println("====================");
​JavaStudent j = new JavaStudent();
​j.name = "xiren";j.age = 16;
​j.talk();System.out.println("--------------------");j.study();System.out.println("--------------------");j.javaStudy();}
}

JavaStudent类直接继承自Student类

Student类直接继承自Person类

所以JavaStudent类的直接父类是Student

Student的直接父类是Person

但是JavaStudent类在继承Student类的同时,不能再继承Person类,因为Java是属于单继承

但是JavaStudent类继承自Student类,而Student类继承自Person类,这是属于多级继承,这个是被允许的

注意C++语言是允许多继承的

其中study方法是Student类中创建的方法,只能有Student类以及JavaStudent子类可以访问,其父类Person中并不含有study方法,所以study方法只能是Student的对象或者是Student的子类对象JavaStudent的对象来进行访问

其中javaStudy是JavaStudent类中定义的特有的方法,该方法只在类JavaStudent中定义,所以只能有JavaStudent类型的对象来访问,其父类Student不能访问,其父类的父类Person也不能访问该方法

不可继承

构造方法

类的构造方法,只负责创建本类对象,不可继承

private修饰的属性和方法

访问修饰符用private类修饰的成员,无法实现继承

父子类不在同一个包package中时,default修饰的属性和方法

修饰符default所修饰的成员在不同包下不能被访问

package com.saas;
​
public class Teacher {
​public Teacher(){System.out.println("this is Teacher constructor.");}
}
package com.saas;
​
public class JavaTeacher extends Teacher{
​public JavaTeacher(){System.out.println("this is JavaTeacher constructor");}
}
package com.saas;
​
public class TestTeacher {
​public static void main(String[] args) {Teacher t = new Teacher();System.out.println("=================");JavaTeacher j = new JavaTeacher();}
}

运行结果如下

this is Teacher constructor.
=================
this is Teacher constructor.
this is JavaTeacher constructor

我们发现,创建子类对象时,执行了父类的构造器方法

但是我们不能说创建子类对象的同时创建一个父类对象

只不过我们需要通过父类构造器来初始化子类对象

package com.saas;
​
public class JavaTeacher extends Teacher{
​public JavaTeacher(){super();            //  一个类中的构造器,如果不调用任何其他构造器时,将会默认调用父类的无参构造器System.out.println("this is JavaTeacher constructor");}
​public void giveLesson(){System.out.println("打开idea");}
}

一个类中的构造器定义内部,如果不显式的调用任何构造器,则默认会调用其父类的无参构造器

修饰符本类同包非同包子类其他
private×××
default××
protected×
public

从上到下,作用范围越来越宽泛

但是要注意一个问题是,访问修饰符要把握注意一个原则,够用原则

思考

子类中是否可以定义父类相同的方法?

可以定义与父类方法名相同,参数列表也相同的方法,最终会出现方法的重写

不可以定义与父类拥有相同的方法名和参数列表,只是返回值不一样的方法,这里会出现“二义性”,编译报错

package com.saas.oo2;
​
public class Father {
​int money = 100000;
​public void printMoney(){System.out.println(money);}
​public void test(){System.out.println("this is test in Father");}
}
package com.saas.oo2;
​
public class Son extends Father{
​int money = 200000;
​@Overridepublic void printMoney() {System.out.println(super.money);                //  100000System.out.println(this.money);                 //  200000System.out.println(money);                      //  200000System.out.println(super.money + this.money);}
​
//    public int test(){        //  不能在子类中定义与父类相同方法名和参数列表的方法,仅仅只是返回值不同,编译会报错,会出现二义性
//        System.out.println("this is test in Son");
//        return 0;
//    }
}
package com.saas.oo2;
​
public class Test {
​public static void main(String[] args) {Father fa = new Father();
​fa.printMoney();
​System.out.println("=====================");
​Son s = new Son();
​s.printMoney();}
}

方法的重写

override: 也可以叫做方法的覆盖

子类修改从父类继承过来的方法,当父类提供的方法无法满足子类需求的时候,可在子类中定义和父类相同的方法进行重写

原则:

方法名称,参数列表,返回值类型都必须与父类完全相同

访问修饰符可以与父类的访问修饰符相同或者是更宽泛,不可以小于父类的访问修饰符

子类重写父类的方法后,调用时应该调用子类重写后的方法,最终应该表现为子类重写之后的表现形式

package com.saas.oo2;
​
public class Father {
​int money = 100000;
​public void printMoney(){System.out.println(money);}
​public void test(){System.out.println("this is test in Father");}
}
package com.saas.oo2;
​
public class Son extends Father{
​int money = 200000;
​@Overridepublic void printMoney() {System.out.println(super.money);System.out.println(this.money);System.out.println(super.money + this.money);}
​public void test(int n){        //  不能在子类中定义与父类相同方法名和参数列表的方法,仅仅只是返回值不同,编译会报错,会出现二义性System.out.println("this is test in Son");
//        return 0;}
}

Son类中含有一个带int参数的test方法,但是Son类还有一个看不见的从父类Father继承过来的无参的test方法

所以Son类中带参test方法与看不见的无参的test方法之间构成了方法的重载关系

Son类中的带参test方法与父类的无参的test方法之间毫无关系

Super关键字

在子类中,可以直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽,方法重写)时,需要加以区分,才可以专项访问

super关键字可以在子类中访问父类的成员属性和成员方法

使用super.的形式可以访问父类的实例属性和实例方法

父子类的同名属性不存在重写关系,两块空间同时存在,子类会遮蔽父类的属性,需使用不同的前缀进行访问,当前对象访问可以使用this,其中this可以省略,默认就是this,如果想要访问父类的属性,必须通过super.来访问父类的成员属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python项目练习——2.天气预报应用程序

项目功能讲解: 这个项目可以让用户输入城市名称,然后返回该城市当前的天气情况,比如温度、湿度、风速等。这个项目涉及到从网络获取数据,解析 JSON 格式的响应以及处理用户输入等技术。 下面是代码示例: import requ…

网工内推 | 松下电器,解决方案工程师,最高25K,IE认证优先

01 松下电器 招聘岗位:基盘解决方案架构师 职责描述: 1、网络的规划设计,架构实施和故障排渣以及调优 2、负责网络设备的选型、搭建、系统监控、故障解决、性能优化 3、负责对集团内相关业务,进行提案或项目管理相关工作 4、对…

Linux制作yum离线源,解决安装RPM包时循环依赖。

在生产环境中,有时服务器是不能访问互联网的,当遇到某些软件安装,会碰到缺少各种依赖包的问题,因此使用制作yum源的方式来安装软件非常方便。 主要原理是,通过 yum 下载所有RPM包,上传RPM包到服务器后安装…

Vue3新手教程

Vue3新手教程 一. Vue3简介1. 性能的提升2.源码的升级3. 拥抱TypeScript4. 新的特性 二. 创建Vue3工程1. 基于 vue-cli 创建2. 基于 vite 创建(推荐)3. 一个简单的效果 三. Vue3核心语法1. OptionsAPI 与 CompositionAPI2. 拉开序幕的 setup2.1 setup 概述2.2 setup 的返回值2.…

typeScript6(其他类型)

1、void void表示没有任何类型,和其他类型是平等关系,不能直接赋值。我们只能为它赋值null或undefined(在strictNullChecks未指定为true时)。一般只有在函数没有返回值时去声明。 2、never never类型表示的是那些永不存在的值的…

自动化脚本-Excel批量生成二维码

演示: Excel二维码批量生成 exe资源文件: 下载exe 代码实现: pip install openpyxl openpyxl 是一个用于读写 Excel 文件的 Python 库 pip install qrcode qrcode 是一个 Python 库,可以用来生成二维码(Quick Resp…

小目标检测篇 | YOLOv8改进之GSConv + Slim Neck提升小目标检测效果

前言:Hello大家好,我是小哥谈。在文章中,作者提出了一种新方法GSConv来减轻模型的复杂度并保持准确性。GSConv可以更好地平衡模型的准确性和速度。并且,提供了一种设计范式Slim Neck,以实现检测器更高的计算成本效益。实验过程中,与原始网络相比,改进方法获得了最优秀的…

【MySQL】锁

一、并发事务访问相同记录的三种情况 读-读情况   并发事务相继读取相同的记录,不会产生什么问题。 写-写情况   这种情况下会发生脏写的问题。 读-写或写-读情况   会发生脏读、不可重复读、幻读的情况 并发问题的解决方案 读操作利用多版本并发控制&am…

论文翻译 - Defending Against Alignment-Breaking Attacks via Robustly Aligned LLM

论文链接:https://arxiv.org/pdf/2309.14348.pdf Defending Against Alignment-Breaking Attacks via Robustly Aligned LLM Abstract1 Introduction2 Related Works3 Our Proposed Method3.1 Threat Model3.2 Our Proposed Method3.3 Practical Designs3.4 Theoret…

docker centos7在线安装mysql8.x

目录 1. 安装mysql8.x2.配置开机启动3.修改root密码和配置远程访问 1. 安装mysql8.x # 安装MySQL cd /usr/local/mysql # 下载rpm安装包 wget https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm yum -y localinstall mysql80-community-release-el7-3.noarc…

java的ArrayList类

ArrayList<E>E是自定义数据类型 ArrayList类&#xff1a; 构造函数&#xff1a; 成员方法&#xff1a; public boolean add(E e)&#xff1a; 将指定元素加到集合末尾 Appends the specified element to the end of this list. public class Array {public static…

动听的洗牌游戏(Java篇ArrayList实操)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

LeetCode - 存在重复元素

219. 存在重复元素 II 这道题可以用两个方法解决。 哈希表 从左到右遍历数组&#xff0c;并将数组的下标存到hash中&#xff0c;在遍历数字的过程中&#xff0c;如果hash中不存在nums[i]&#xff0c;将nums[i]加入到hash当中&#xff0c;若存在&#xff0c;则判断下标之间的关…

深入理解Elasticsearch高效原理

在当今数据驱动的世界中&#xff0c;能够快速有效地存储、搜索和分析庞大数据集变得至关重要。Elasticsearch是一个强大的开源搜索和分析引擎&#xff0c;专为云计算中心而设计&#xff0c;能够提供快速的搜索功能&#xff0c;并且能够扩展到包含数百个服务器的集群&#xff0c…

Java面试题:请解释Java中的继承和多态?

一、请解释Java中的继承和多态&#xff1f; Java中的继承&#xff08;Inheritance&#xff09;和多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;的两大基本特性&#xff0c;它们允许开发者创建灵活、可扩展的代码。 继承 继承是一种允许…

C#事件实例详解

一、什么是事件&#xff1f; 在C#中,事件(event)是一种特殊的类成员,它允许类或对象通知其他类或对象发生了某些事情。 从语法上看,事件的声明类似于字段,但它们在功能和行为上有一些重要的区别。 从技术角度来说,事件实际上是一个封装了事件订阅和取消订阅功能的委托字段。…

Python中的数据类型有四类八种如何理解?

在Python中&#xff0c;数据类型大致可以分为四大类&#xff0c;包含了八种基本的数据类型&#xff0c;这些分类有助于理解和使用Python进行编程。这四大类分别是&#xff1a; 数字类型 (Numeric Types): 整型 (int): 表示没有小数部分的整数&#xff0c;可以是正数、负数或零。…

ORACLE 知识整理

目录 一. 插入指定数量的数据二. 索引2.1 创建索引2.2 删除索引 三. 查询计划四. Oracle SQLPlus常用设置五. 增加删除字段 一. 插入指定数量的数据 ⏹当需要向表中插入若干测试数据的时候&#xff0c;可通过下面这种方式造数据 先从DUAL虚拟表中检索后造出10000条数据后&…

海外媒体发稿:9种高效的媒体套餐内容发稿策略分析-华媒舍

海外媒体发稿&#xff1a;9种高效的媒体套餐内容发稿策略分析高效的媒体发布和营销推广策略对公司、本人的成就尤为重要。下面我们就对于媒体套餐内容发稿营销推广策略开展全面解析&#xff0c;帮助读者掌握并应用这9种合理的思路&#xff0c;进而获得更好的媒体营销效果。 1.媒…

Retelling|Facebook2

录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…