Java基础之继承、多态、抽象类

Java基础

1.猜数字小游戏

import java.util.Random;
import java.util.Scanner;public class MathTest {public static void main(String[] args) {// 猜数字小游戏//int randomValue = (int) (Math.random() * 100 + 1); 随机产生[1,101)之间的整数Random random = new Random(10);  // 给定一个固定的随机种子,那么其随机值就固定了 ...int randomValue = random.nextInt(100) + 1;// 对于该对象可以重复使用,所以不需要在While中每次循环重新创建Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入一个值:");int data = scanner.nextInt();if (data == randomValue) {System.out.println("恭喜您猜对了...");break;} else if (data > randomValue) {System.out.println("猜的数值过大,请重新输入...");} else {System.out.println("猜的数值过小,请重新输入...");}}}
}

2.代码块

import java.util.Random;public class CodeType {public static void main(String[] args) {/*在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。局部代码块在方法中出现;限定变量生命周期,及早释放,提高内存利用率构造代码块在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行静态代码块 在类中方法外出现,加了static修饰在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且值执行一次。*/useCodeRound();Student student = new Student("李白", 18);student.show();Student student1 = new Student("苏轼", 18);student1.show();Student student2 = new Student("杜甫", 18);student2.show();
//        Student student = new Student("孟浩然", 18);;}public static void useCodeRound() {int i = 10;// TODO 局部代码块: 在方法中使用 {} 定义 => 其作用是用于限制变量的生命周期{int var = 1;System.out.println(var);System.out.println(i);}
//        System.out.println(var);  // TODO 局部代码块中定义的变量其作用范围仅在当前{}中 {}执行完成,变量消失System.out.println(i);  //}
}class Student {private static String flag ;  // flag标记 当出现在Student中用于标记当前类是一个人类/*TODO 静态代码块:定义:在类中 方法外 使用 static修饰 {}作用:在类被加载时,用于创建对象之前,静态代码块会被执行应用:对静态变量进行做初始化 => 对类做初始化*/static {System.out.println("人类被上帝所赋予了...");flag = "人类";}private String name;private int age;private String skill;/*TODO 构造代码块:定义:在类中 方法外使用 {} 定义作用:在对象每次被构建时,都会被执行, 并且构造代码块会先于构造方法执行应用场景: 对于对象构建时,进行做初始化操作 => 对对象进行初始化*/{System.out.println("一个新生命产生了,上帝赋予了天赋");int nextInt = new Random().nextInt(3);// 0 1 2if (nextInt == 0){this.skill = "高智商";}else if (nextInt == 1){this.skill = "高情商";}else {this.skill = "高财商";}}public Student(String name, int age) {System.out.println("Student构造方法被调用了...");this.name = name;this.age = age;}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 String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}public void show() {System.out.println(flag+":姓名:" + name + "\t 年龄:" + age + "\t 天赋:" + skill );}

3.继承

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;public class Extend {public static void main(String[] args) {/*TODO 继承关系当在Java中编写代码时,有时两个类直接存在一些逻辑上的关系,同时有一些变量及对应的方法存在重复编写于是,在代码中可以使用 extend 来表示两个类之间的关系,该关系只能用于表示继承(父子关系)被继承的称为父类  继承的称为子类通过继承就可以获取父类中的相关代码继承关系的好处:1.提高了代码的复用性  父类代码可以直接被子类代码继承所使用2.提高了代码的维护性  如果功能的代码需要修改,修改一处即可3.让类与类之间产生了关系,是多态的前提 => 放到后面再介绍代码之间产生依赖关系后,那么可以用 耦合性 来表示耦合性太强的缺点:当上游代码发生改变时,会影响下游的 所以在开发过程中并不是所有的代码都要有很强的耦合性Java中继承的特点:1.一个类只能有一个父类,不可以有多个父类。为什么?钻石问题(若父类中有一个同名方法,那么该继承谁的?)2.Java支持多层继承(继承体系)Java中方法的重写:1.方法是通过继承或实现其他类或接口得到的2.对得到的方法逻辑进行重写3.对于方法的重写要求 参数列表 方法名 返回值都是一样的重写和重载的区别:1.重写是对继承后的方法进行重新定义,重载是对当前类中的方法进行拓展2.重写需要使用 @Override 而 重载 不需要TODO JAVA中继承的注意事项:1.子类只能继承父类所有非私有的成员(成员方法和成员变量)私有表示使用private修饰的2.子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。3.不要为了部分功能而去继承如果两个类在逻辑上能形成 is a 关系, 一个类是另外一个类的XXX 就可以使用*/Cat cat = new Cat("咪咪");cat.run();System.out.println(cat.name);
//        cat.run("招财");cat.procreate();
//        System.out.println(cat.clazz);cat.weight = "3斤";cat.show();}
}class Animal {int weight;public void run() {System.out.println("动物能够游泳或行走..");}
}class mammal extends Animal {private String clazz = "哺乳动物类";public void procreate() {System.out.println("哺乳动物都可以胎生...");}
}/*使用Cat子类来继承父类Animal*/
class Cat extends mammal {String weight;
//    String clazz = "猫类";String name;
//    public void run(){
//        System.out.println("动物能够行走..");
//    }public Cat(String name) {this.name = name;}@Overridepublic void run() {System.out.println(name + "可以行走,爬树");}public void show(){
//        double weight = 3.2;System.out.println("猫咪叫:"+name+" 现在"+weight+"了");}
}

4.继承中的构造方法

public class SuperOperator {public static void main(String[] args) {/*TODO 继承中的构造方法:1.对于子类对象在构建时,必须先创建其父类对象2.对于子类对象在调用构造方法时,默认需要先调用父类的无参构造3.在子类中使用super()调用父类的构造方法,必须要放在子类构造方法的第一行 ?由于必须要先构建父类对象,所以根据代码执行顺序,需要先将父类的构造方法执行完成TODO 使用 super 关键字super关键字用于表示父类,可以通过 super()调用父类的构造方法 或者使用 super.调用成员方法或变量*/Son son = new Son("李杨",17);son.show();System.out.println("===================");Zi z = new Zi();z.show();}
}
/*对于一个代码文件中,只能存在有一个 public 修饰的class类*/class GrandFather {String name;int age;public GrandFather() {System.out.println("爷爷出现了...");}public final void show() {System.out.println("我叫" + name + " 今年:" + age);}
}//final class Father extends GrandFather {
class Father extends GrandFather {public Father(String name, int age) {super.name = name;this.age = age;System.out.println("父亲出现了...");}
}class Son extends Father {public Son(String name, int age) {super(name,age);System.out.println("儿子出现了...");}//    @Override
//    public void show() {
//        System.out.println("这是儿子中重新定义的show方法");
//    }
}
class Fu{public int num = 10;public Fu(){System.out.println("fu");}
}
class Zi extends Fu{public int num = 20;public Zi(){System.out.println("zi");}public void show(){int num = 30;System.out.println(num);System.out.println(this.num);System.out.println(super.num);}
}

5. final关键字

import java.util.Arrays;public class Demo_Final {final static double PI = 3.145926;final static int[] INT_NUM = {3, 4, 6, 5};public static void main(String[] args) {/*TODO final① 使用该关键字修饰class,后续不能被其他的类所继承  表示为最终类② 使用该关键字修饰方法,后续不能被其他的子类所重写③ 使用该关键字修饰变量,表示一个常量 定义后不可改变其中的数据 必须要进行初始化常量的命名:所有单词字母大写,单词间使用 下划线 连接*/System.out.println(PI);
//        PI = 3.1459267;INT_NUM[0] = 4;
//        INT_NUM = new int[5];  // 对于引用类型赋值不能修改其内存地址,但是可以修改其地址上对象的数据System.out.println(Arrays.toString(INT_NUM));}
}

6.多态

public class MoreFormat {public static void main(String[] args) {/*TODO 多态前提条件,当多个类或者接口之间存在有继承或实现关系时,此时对于每个类都可以有其他的表示方式举例:张三 <= 张三人张三他爸爸的儿子 <= 张三人张三他爷爷的孙子 <= 张三人对于一个人 可以有多种表示形式什么需要有多态??① 对于继承关系来说,父类所有的变量及方法 其子类可以被继承② 当父类在方法中被调用时,那么其子类也应该满足其要求③ 为了增加方法的灵活性,可以将子类的对象传给父类变量进行使用多态定义: 父类引用指向子类对象注意:① 对于子类中独有的方法,当有多态时,不能通过父类引用调用子类对象的独有方法② 在强制类型转换时,需要存在有继承关系,才能相互转换③ 强制类型转换,不能违反多态的体系  父类引用指向子类对象*/Sn son1 = new Sn("李白", 18);Fa son2 = new Sn("李白", 18);   // 多态GrandFa son3 = new Sn("李白", 18); // 多态GrandFa grandFa = new GrandFa();useInfo(grandFa); //useInfo(son1);
//        son2.pl//playGame()为son类中的独有方法,若是多态则无法引用,所有要进行强制类型转换Sn changeType2Son = (Sn) son3;changeType2Son.playGame();//        String son31 = (String) son3;//        Sn sn1 = new GrandFa();  // 出错// 错误
//        Sn fa = (Sn) grandFa; // grandFa变量中实际上保存的是 GrandFa 对象地址  进行强制类型转换
//        fa.playGame();/*TODO 多态中成员访问特点成员方法/成员变量:编译看左边,运行看右边静态方法:编译看左边,运行看左边*/Sn sn1 = new Sn("彭飞", 18);System.out.println(sn1.name);GrandFa grandFa1 = new Sn("彭飞", 18);System.out.println(grandFa1.name);System.out.println(grandFa1.age);
//        System.out.println(grandFa1.skill);//默认调用子类中的show()方法grandFa1.show();//编译看左边,运行看左边grandFa1.run(); //  爷爷走路步履蹒跚...}public static void useInfo(GrandFa grandFa) {System.out.println("获取到了一个对象,其姓名为:" + grandFa.name + "年龄为:" + grandFa.age);}
//    public static void useInfo(Sn grandFa){
//        System.out.println("获取到了一个对象,其姓名为:"+grandFa.name+"年龄为:"+grandFa.age);
//    }}/*TODO 在相同的包下,类只能被定义一次,除了内部类形式*/
class GrandFa {String name;int age;public GrandFa() {this.name = "爷爷";this.age = 60;System.out.println("爷爷出现了...");}public void show() {System.out.println("爷爷:" + "我叫" + name + " 今年:" + age);}//static:静态方法public static void run() {System.out.println("爷爷走路步履蹒跚...");}}//final class Father extends GrandFather {
class Fa extends GrandFa {public Fa(String name, int age) {
//        super.name = name;this.name = name;this.age = age;System.out.println("父亲出现了...");}
}class Sn extends Fa {String name;String skill;public Sn(String name, int age) {super(name, age);this.name = name;this.age = age;System.out.println("儿子出现了...");}public void show() {System.out.println("孙子:我叫" + name + " 今年:" + age);}public void playGame() {System.out.println("孙子年轻,游戏玩的溜溜的...");}public static void run() {System.out.println("孙子走路蹦蹦跳跳");}
}

7.抽象类

public class AbstractClazz {public static void main(String[] args) {/*TODO 抽象类:在Java中表示抽象概念的类,可以定义为一个抽象类抽象类定义:abstract 用于修饰抽象类对于抽象类,不能进行实例化抽象类可以定义非抽象方法抽象方法:在定义方法时,没有给定具体的方法体,并且需要使用abstract修饰子类继承抽象类:① 如果子类不是抽象类并且当抽象类中存在有抽象方法,那么需要通过重写实现其抽象方法的逻辑② 子类可以继承到抽象类中的非抽象方法为什么需要有抽象方法:在定义一个抽象类时,需要定义一个抽象方法,用于标记当前抽象类是存在有该行为的主要的作用是为了规范代码 对于方法的参数以及返回值类型都已经固定了抽象类的使用场景:1.当开发代码时,对于具体的功能不知道如何进行运行或定义时,可以先给定一个抽象类,再调用其中的抽象方法 如果当其他开发人员 再开发相关的功能时,就可以重写其对应的代码,实现功能*///补:/*一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?可以,对于某一些类中存在有共有的方法,同时逻辑也相同,但是没有一个具体的类,可以将该方法去表示出来,所以需要有一个抽象的概念,来表示,所以需要使用抽象类*//*abstract不能和哪些关键字共存private	冲突  => 私有  => 如果私有那么子类无法继承,也无法对其抽象方法进行重写 无意义final	冲突	 => 最终  => final 的类不能被继承,对于抽象类无法构造本身的实例对象,无意义static	无意义 => 属于类的 => 可以写但没有意义*/Animal animal = new Animal(); // 对于Animal类来说,表示的应该是一个概念性animal.run();  // run方法,对于不同的子类,会对其方法进行重写//        new AbstractAnimal().run();  //抽象类不能实例化DogAb dogAb = new DogAb();dogAb.run();dogAb.eat();/*TODO 使用抽象类可以通过 子实现类(继承抽象类的类)来调用重写/继承的方法*/useAbstractAnimal(new DogAb());//        new AbstractA();C c = new C();}public static void useAbstractAnimal(AbstractAnimal animal) {animal.run();}
}abstract class AbstractAnimal {public abstract void run();  // 定义一个抽象方法public void eat() {System.out.println("动物需要觅食..");}
}class DogAb extends AbstractAnimal {@Overridepublic void run() {System.out.println("狗可以四肢行走...");}//    public abstract void sleep();  // 有抽象方法的类一定是抽象类
}/*TODO 抽象类的继承关系*/abstract class AbstractA{/*TODO 抽象类构造方法:1.对于抽象方法不能直接使用new 进行调用,但是可以通过创建子类对象的方式来进行调用*/public AbstractA(){System.out.println("这是抽象类中的构造方法");}public abstract void function();
}abstract class AbstractB extends AbstractA{/*对于抽象类继承抽象类,可以选择重写其方法,也可以不重写其方法*/@Overridepublic void function() {System.out.println("这是B抽象类中重写的方法");}
}class C extends AbstractA{@Overridepublic void function() {System.out.println("这是C具体类中重写的方法");}
}class D extends AbstractB{/*TODO 对于B中继承A的抽象方法已经被重写了,D再继承时,就可以不需要再重写*/
}

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

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

相关文章

【Java】实现一个简单的线程池

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、线程池的模式 线程池顾名思义就是管理线程的一个池子&#xff0c;我们把创建线程的过程交给线程池来处理&#xff0c;而这个线程池当中的线程都会从阻塞队列当中取获取任务执行。 我们不在直接把任务的创建过程写到…

民间故事传说(一)

秦始皇为了抵御外敌&#xff0c;修筑了一座伟大的工程&#xff0c;那就是长城。长城在现代看来是一项前无古人&#xff0c;后无来者的工程。和在古代却是劳民伤财&#xff0c;人声怨载的工程。为了修长城&#xff0c;老百姓的日子是苦不堪言&#xff0c;当兵的到处抓人&#xf…

mpu6050姿态解算与卡尔曼滤波(5)可应用于51单片机的卡尔曼滤波器

博客4中给出的滤波器状态维数为4维&#xff0c;测量量为3维&#xff0c;每次滤波需要做不少矩阵乘法和求逆运算。如果想在51单片机上实现&#xff0c;计算耗时会比较长。考虑应用场合可以对滤波器适当做一些简化&#xff0c;计算量会大大减小。 首先&#xff0c;陀螺和加速度计…

OracleDay01

ORACLE 简介 什么是 ORACLE ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORA…

NLP预训练模型-GPT-3

ChatGPT GPT-3是OpenAI开发的一个自然语言处理&#xff08;NLP&#xff09;预训练模型。GPT代表“生成式预训练变换器”&#xff08;Generative Pretrained Transformer&#xff09;。GPT-3是GPT系列的第三代模型&#xff0c;是一种采用了深度学习技术的强大语言模型&#xff…

mapreduce中的ReduceTask工作机制(Hadoop)

ReduceTask 是 Hadoop 中的一个重要组件&#xff0c;负责对 MapTask 的输出进行合并、排序和归并&#xff0c;最终生成最终的输出结果。 ReduceTask 的工作机制 1. 分组&#xff08;Shuffle&#xff09;阶段&#xff1a; 在分组阶段&#xff0c;ReduceTask 会从多个 Mapper …

(救命)Kali Linux或者其他linux系统的触控板右键按下没反应,失效的解决办法

我每次安装kali的时候都会选择gnome桌面&#xff0c;每次安装好右键都是禁用的&#xff0c;按下和左键效果一样&#xff0c;每次都得去调鼠标右键&#xff0c;原来就不好找到那个选项&#xff0c;这次踏马居然连那个选项都没了&#xff0c;如果你去网上找教程你会发现网上根本没…

CX5120-0125倍福CPU模块维修PLC控制器CX5120全系列主机电脑深圳捷达工控维修

工业计算机服务与维修 为任何品牌的工业计算机、显示器、人机界面 (HMI) 和面板计算设备提供服务、维修和改造。您可以信赖我们延长生命周期&#xff0c;包括不再投放市场的产品。 工业计算机维修与保养 您的工业计算机专家 工业计算机维修服务 深圳捷达工控维修深知做好工业…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法,其主要目的是将数据点划分为K个集群,以使得每个数据点与其所属集群的中心点(质心)的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。 二、K-means算法的基本原理 K-means算法…

【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】掌握Spring Boot&#xff1a;深入解析配置文件的使用与管理 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 Spring Boot 配置文件一. 配置文…

基于SpringBoot+Vue的幼儿园管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;19张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&#…

Vue实现多角色登录,Vue-Router路由守卫控制权限页面

实现页面侧边栏和头部不变&#xff0c;当点击某个功能时&#xff0c;只有主体部分发生变化&#xff0c;这要用到子路由技术 我的项目结构如上&#xff0c;其中包含侧边栏和头部的文件是Manage.vue&#xff0c;主页面是Home.vue&#xff0c;个人页面是Person.vue&#xff0c;用户…

每日三个JAVA经典面试题(四十四)

1.什么是反应式编程&#xff1f;它如何优化Web应用的性能&#xff1f; 反应式编程是一种编程范式&#xff0c;它通过异步数据流的方式处理事件和数据&#xff0c;以实现高效的数据处理和事件驱动的程序设计。在反应式编程中&#xff0c;数据流可以被观察&#xff08;Observabl…

固态硬盘数据都不能恢复吗?

固态硬盘的数据在某些特定情况下是可以被成功恢复的。 尽管固态硬盘的工作原理与机械硬盘不同&#xff0c;数据恢复方面相对困难&#xff0c;但并不意味着所有情况下都无法恢复数据。 例如&#xff0c;当固态硬盘发生逻辑损坏时&#xff0c;数据恢复的几率会相对较高。此外&am…

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-HKELM蜣螂算法优化混合核极限学习机多变量…

二分答案算法

基本概念 将最值问题转换为判定 与二分查找的区别 二分查找&#xff1a;在一个已知的有序数据集上进行二分地查找 二分答案&#xff1a;答案有一个区间&#xff0c;在这个区间中二分&#xff0c;直到找到最优答案 如何判断一个题是不是用二分答案做的 1、答案在一个区间内…

【GIS面试】GIS算法介绍

作者&#xff1a;后端小肥肠 1. 前言 在地理信息系统&#xff08;GIS&#xff09;的领域中&#xff0c;算法扮演着极其重要的角色&#xff0c;它们使得复杂的空间数据分析成为可能。无论是在环境科学、城市规划&#xff0c;还是在灾害管理等众多领域&#xff0c;高效和精确的算…

Zabbix监控Oracle归档日志空间

1、oracle查看归档日志空间的sql语句 select sum(PERCENT_SPACE_USED) from v$recovery_area_usage; 2、交互式查看oracle归档日志空间的命令&#xff0c;可以手动执行一下&#xff0c;注意要用oracle用户 sqlplus -S "/ as sysdba" << EOF select sum(PER…

解决“ImportError: DLL load failed while importing _rust: 找不到指定的程序的问题

运行 scrapy startproject wikiSpider 报错&#xff1a;ImportError: DLL load failed while importing _rust: 找不到指定的程序。 经过尝试 可以更换Python解释器版本来解决 1、点击crtlalts打开设置 点击项目>解释器 选择3.11解释器 &#xff08;我原来报错用的3.9的解…

企业车辆违章查询工具,批量查询企业名下车辆违章情况,专为网约车/出租车管理公司而生

功能介绍 功能分为&#xff1a;违章管理、车辆管理、任务管理 违章管理如图&#xff1a; 搜索条件为车牌号 筛选条件为&#xff1a;时间区间、企业选择、是否处理违章、是否缴纳罚款、所属车管员 车牌管理如图&#xff1a; 可以新增车牌 查询条件为&#xff1a;车牌信息、车…