Java基础(二)继承剖析
继承剖析
1 若是要直接调用父类的构造方法,不调用子类的方法则需要使用的是super()关键字
Publicclass Child extends Parent
{
Public Child()
{
Super(1);//此方法是显示的调用父类的方法,不会再采用默认的方法机制
System.out.println(“child!”);
}
Public static void main(String[] args)
{
Child child = new Child();
}
}
ClassParent
{
Public Parent(int i)
{
System.out.println(“Parent!”);
}
}
2 当生成子类的时候,Java默认先调用父类的不带参数的构造方法,然后再执行子类的构造方法,生成子类对象
3super关键字:super表示对父类对象的引用
4 如果子类使用的是super()显式调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不会去寻找父类的不带参数的构造方法,与this一样,sueper
也必须作为构造方法的第一条执行语句,前面不能有其他可执行语句
例子程序;
Publicclass InhertanceTest
{
Public static void main(String[] args)
{
Apple apple = new Apple();
System.out.println(apple.name);
}
}
ClassFruit
{
String name=”fruit”;
}
ClassApple extends Fruit
{
String name=”apple”;
}
5 关于继承的三点:
(a) 父类有的,子类也有
(b) 父类没有的,子类也可以增加
(c) 父类有的,子类可以改变他
6 关于继承的注意事项
(a) 构造方法不能被继承
(b) 方法和属性可以被继承
(c) 子类的构造方法隐式调用父类的不带参数的构造方法
(d) 当父类没有不带参数的构造方法的时候,子类需要使用super()来显式的调用父类的构造方法 ,super指的是对父类的引用
(e) Super关键字必须是构造方法的第一行语句
继承举例:
public class InheritanceTest
{
Public static void main(String[] args)
{
Dog dog = new Dog();
Dog.run();
}
}
ClassAnimal
{
Public void run()
{
System.out.println(“animal is running!”);
}
}
ClassDog extends Animal
{
Public void run()
{
System.out.println(“dog is running!”);
}
/*我采用这种方式来写代码看看执行的结果是什么*/
Public void run(int I )
{
System.out.println(“dogis running!”)
}
}
6方法重写(Override):子类与父类的方法返回类型一样,方法名称一样,参数一样,这样我们说子类与父类构成了重写关系
7 方法的重写和方法重载的关系:重载发生在一个类内部的两个或者多个方法,重写发生在父类和子类之间。【重写一定伴随着继承发生的】
8super关键字:super表示对父类对象的引用
9如果子类使用super()显式调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不会再去寻找父类的不带参数的构造方法 与this一样 super也要作为构造方法里的第一句所执行的代码
继承肯定生成了多个对象,比如儿子继承父亲,那一定生成2个对象
10
当两个方法构成重写关系的时候,可以在子类方法中通过super.run()形式调用父类的run()方法,其中super.run()不必放在第一句语句,因此此时父类的对象已经构造完毕,先调用父类的run()方法还是先调用子类的run()方法是根据程序的逻辑顺序所决定的
11 在定义一个类的时候,若是没有显式的调用某个父类,那么该类就会继承于java.lang.Object类(JDK提供的一个类,Object类是Java中所有类的直接或间接的父类)
Publicclass InheritenceTest3
{
Public static void main(String[] args)
{
Son son=new Son();
}
}
ClassGrandpa
{
Public Grandpa()
{
System.out.println(“gandpa”);
}
}
ClassFather extends Grandpa
{
Public Father()
{
System.out.println(“father”);
}
}
ClassSon extends Father
{
Father()
{
System.out.println(“Son”);
}
}///继承了3次 所以应该会生成3个对象 依次从上往下进行构造
12 多态(Polymorphsim)
Publicclass PolyTest
{
Public static void main(String[] args)
{
// Rose rose = new Rose();
Flower rose =new Rose();//多态的应用 父类型的引用可以指向子类的对象---》多态
Rose.sing();
}
}
ClassFlower
{
Public Flower()
{
}
Public void sing()
{
System.out.println(“floweris singing !”);
}
}
ClassRose extends Flower
{
Public Rose()
{
}
}
JavaSE 多态
1 多态;
2 public class PolyTest
3 {
Public static void main(String[] args)
{
Parent parent = newParent();
Parent.sing();
Child child = new Child();
Child.sing();
Parent p = new Parent(); //父类引用指向子类对象
p.sing();//指向谁就会调用谁的方法
}
4 }
5 Class Parent
6 {
7 Public void sing()
{
System.out.println(“parent is singing!”);
}
8 }
ClassChild extends Parent
{
Public void sing()
{
System.out.println(“child issinging!”);
}
}
2 对象转型
Publicclass PolyTest2
{
Public static void main(String[] args)
{
Animal a = new Dog();
Dog dog = Dog(a);//父类型的引用强制转化成了子类型的引用,因为a实际指向的是dog类型的对象所以可以将a强制转化成Dog类型
dog.sing();
}
}
ClassAnimal
{
Public void sing()
{
System.out.println(“animalis singing!”);
}
}
ClassDog extends Animal
{
Public void sing()
{
System.out.println(“Dog is singing!”);
}
}
ClassCat extends Animal
{
}
多态是一种运行期的行为,而不是编译期的行为
一共有2种类型的强制转化:
1 向上类型的强制转化 (upcast) 比如:Cat类型转化成Animal类型【将子类型转化成父类型】Cat转化成Animal类型,不需要显式的指定
//向上类型转化
Catcat = new Cat();
Animalanimal = (Animal)cat;
Animal.sing();//子类就是父类 cat is singing
2 向下类型转换(downcast) 比如:将Animal类型转化成Cat类型,即将父类型转化成子类型,对于向下类型转化,必须要显式指定(必须要使用强制类型转换)
//向下类型转换
Animal a = new Cat();
Cat cat = (Cat)a;
Cat.sing();
向下类型转换使用的条件:当父类和子类所拥有的方法个数不同的时候,要使用子类所特有的方法,则用强制类型转换。
Publicclass PolyTest3
{
Public static void main(String[] args)
{
Fruit f = new Fruit();
f.run();
Pear p = new Pear();
p.run();
System.out.println(“----------------------------------”);
//下面的用法是错误的不使用强制类型转化的时候会出现找不到该方法
Fruit f = new Pear();
f.grow();
///下面使用强制类型转化的方法来写程序就是对的
Fruitf = new Fruit();
Pear p = (Pear)f;
p.grow();
}
}
ClassFruit
{
Public void run()
{
System.out.println(“fruit isrunning!”);
}
}
ClassPear extends Fruit
{
Public void run()
{
System.out.println(“pear isrunning!”);
}
Public void grow()
{
System.out.println(“fruitis running!”);
}
}
体会多态是运行期的行为例子程序:
Public class PolyTest4
{
Public staticvoid main(String[] args)
{
Publicstatic void main(String[] args)
{
Aa = null;
///通过命令行来传参数,接收用户的参数
If(args[0].equals(“1”))
{
a = new B();
}
Else if(args[0].equals(“2”))
{
a = new C();
}else if(args[0].equals(“3”))
{
A = new D();
}
a.method();
}
}
}
Class A
{
Public voidmethod()
{
System.out.println(“A”);
}
}
class B extends A
{
Public voidmethod()
{
System.out.println(“B”);
}
}
Class C extends B
{
Public voidmethod()
{
System.out.println(“C”);
}
}
Class D extends A
{
Publicvoid mthod()
{
System.out.println(“D”);
}
}
Publicclass PolyTest5
{
/*原先的写法:*/
/*Publicvoid run(BMW bmw)
{
Bmw.run();
}
Public voidrun(QQ qq)
{
qq.run();
}
*/
///一个方法可以搞定所有的方法多态特性
//声明一个父类型的对象作为参数然后根据实际情况new对象
Public void run(Car car)
{
Car.run();
}
Public static void main(String[] args)
{
//先前写法的调用方式
/* PolyTest5test = new PolyTest5();
BMW bmw = new BMW();
Test.run(bmw);
QQ qq = new QQ();
Test.run(qq);
*/
//改进过后的调用方式
PolyTest5 test = new PolyTest5();
Carcar = new Car();
Test.run(car);
QQqq = new QQ();
Test.run(qq);
}
}
ClassCar
{
Public void run()
{
System.out.println(“car isrunning!”);
}
}
}
ClassBMW
{
Public void run()
{
System.out.println(“BMWis running”);
}
}
ClassQQ extends Car
{
Public void run()
{
Public void run()
{
System.out.println(“QQ isrunning”);
}
}
}
Java基础(二)继承剖析的更多相关文章
- Java基础-hashMap原理剖析
Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...
- Java面试题总结之Java基础(二)
Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- Java入土--Java基础(二)
Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- java基础之继承(一)
虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展.下面是我的笔记,主要包含以下一些内容点: 构 ...
- java基础二(阅读Head First Java记录)
写在前面的话 本部分是在语法基础上的一些内容,比如内部java函数库,继承多态等 “与”和“或”运算符 1.短运算符(&&,||) &&与,必须表达式两边都为 ...
- [ 转载 ] Java基础二
前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...
- Java基础(二) 基本类型数据类型、包装类及自动拆装箱
我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...
随机推荐
- [ML] 详解 ChatGLM-webui 的启动使用与 ChatGLM-6B 常见问题
1. ChatGLM-webui 总共支持以下几个命令选项: 2. 以 windows 为例,在 PowerShell 里运行命令: # 安装依赖 pip install torch==1.13. ...
- [FAQ] FinalCutPro 视频背景加模糊效果
1. 时间轴右上方,找到 倒数第二个 "显示或隐藏效果浏览器",里面有一个 "模糊" 效果: 2. "模糊"效果中的 "高斯曲线& ...
- [FAQ] JS 时间戳格式化为 date
拷贝使用,不用引入第三方库 function formatDate (date = 0, fmt = 'yyyy-MM-dd hh:mm:ss') { date = new Date(+date) i ...
- kubenetes1.26中安装kubesphere3.4版本
一.安装前环境准备 # kubesphere官网:https://kubesphere.io/zh/docs/v3.4/introduction/what-is-kubesphere/ # 1.kub ...
- K8s集群中部署SpringCloud在线购物平台(三)
五.SpringCloud概述 springcloud架构图 5.1 SpringCloud是什么? 官网: https://spring.io/projects/spring-cloud Sprin ...
- 三:瑞芯微OK3399-C开发板
场景一 给广告机加上一双智慧的眼睛,时刻关注这经过自己面前的每一个人,把他(她)们的性别.年龄.胖瘦.着装风格.经过频次.观看广告的时间.每个广告观看的人数等等一一记录下来,为广告机运营商.广告创业设 ...
- 【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测
YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接.该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的 ...
- Centos7安装openJdk17
yum 安装 安装 EPEL 软件源:使用以下命令安装 EPEL 软件源,它包含了 OpenJDK 17 的安装包. sudo yum install epel-release sudo yum in ...
- spring boot 整合mybatis 配置多数据源 数据源切换和多数据源的事务
因为项目中用到了多数据源 不可避免的会有各种各样的问题列一下最主要的问题: 1 如何配置多数据源???2 spring项目中多数据源无法切换???3 操作了2个或者2个以上数据库的数据无法保证事务的一 ...
- redis 的下载与安装
下载地址:https://github.com/MicrosoftArchive/redis/releases 选择免安装包: 解压到路径 D:\Redis-x64-3.0.504 用管理员权限打开 ...