自学Java第11Day

学习目标:面向对象进阶


学习内容:包、final、权限修饰符、代码块、抽象类、接口


学习时间:

     下午 3 点-下午 6 点


学习产出:

什么的包?

        包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。

        包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。

什么是全类包?

        包名+类名

使用其他类的规则

        使用同一个包中的类时,不需要导包。

        使用java.lang包中的类时,不需要导包。

         其他情况都需要导包。

         如果同时使用两个包中的同名类,需要用全类名。


final

        final修饰方法:表明该方法是最终方法,不能被重写。
        final修饰类:表明该类是最终类,不能被继承。
        final修饰变量:叫做常量,只能被赋值一次。

        此时就可发现父类中的show()方法被final修饰,子类无法重写父类中的方法。 

        此代码中就可发现被final修饰的变量,不能被修改。 

常量:

        实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。

        常量的命名规范:

                单个单词:全部大写。

                多个单词:全部大写,单词之间用下划线隔开。

细节:

        final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

        final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。 

public class Test {public static void main(String[] args) {//创建对象final Student S = new Student("旭哥", 23);//记录的地址值不能发生改变,内部的属性值还是可以改变的// S = new Student();S.setName("蛋姐");S.setAge(21);System.out.println(S.getName() + ", " + S.getAge());//数组final int[] ARR = {1, 2, 3, 4, 5};ARR[0] = 10;ARR[1] = 20;//遍历数组for (int i = 0; i < ARR.length; i++) {System.out.println(ARR[i]);}}
}

运行结果:

蛋姐, 21
10
20
3
4
5

final应用场景

        在之前我们写过一个学生管理系统,在代码中有一段代码实现的是目录,为了让代码阅读性更强,可将switch循环中的case选项final私有化定义,可将数字命名为可读性更强的英文。


权限修饰符

        权限修饰符:是用来控制一个成员能够被访问的范围的。

        可以修饰成员变量,方法,构造方法,内部类。

权限修饰符的分类

        有四种作用范围由小到大(private<空着不写<protected<public)

修饰符同一个类中同一个包中
其他类
不同包下的
子类
不同包下的
无关类
private\sqrt{}
空着不写\sqrt{}\sqrt{}
protected\sqrt{}\sqrt{}\sqrt{}
public\sqrt{}\sqrt{}\sqrt{}\sqrt{}

代码块

       局部代码块: 局部代码块是在方法内部定义的,它的作用域仅限于该方法内。局部代码块通常用于定义方法内的控制流,例如条件语句(if-else)、循环(for、while)等。

public class Test {
public static void main(String[] args) {{int a = 10;System.out.println(a);}}
}

        构造代码块:构造代码块是在类中定义的,它在类的构造函数之前执行。如果有多个构造函数,构造代码块会在每个构造函数执行之前运行。它用于初始化类的实例变量。

public class Student {private String name;private int age;{System.out.println("开始创建对象了");}public Student() {System.out.println("空参构造");}public Student(String name, int age) {System.out.println("有参构造");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 class Test {public static void main(String[] args) {//创建对象Student s=new Student();Student s2=new Student("旭哥",23);}
}

运行结果:

开始创建对象了
空参构造
开始创建对象了
有参构造

        静态代码块:静态代码块是在类中定义的,它在类被加载到JVM时执行一次,且仅执行一次。它主要用于初始化类的静态变量。

public class Student {private String name;private int age;static {System.out.println("开始创建对象了");}public Student() {System.out.println("空参构造");}public Student(String name, int age) {System.out.println("有参构造");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 class Test {public static void main(String[] args) {//创建对象Student s=new Student();Student s2=new Student("旭哥",23);}
}

运行结果:

开始创建对象了
空参构造
有参构造

抽象类

        抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

        抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

抽象类和抽象方法的定义格式

        抽象方法的定义格式:
                public abstract      返回值类型 方法名(参数列表);
        抽象类的定义格式:
                public abstract class     类名

public abstract class Person {public abstract void work();
}

抽象类和抽象方法的注意事项

        抽象类不能实例化。
        抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
        可以有构造方法。
        抽象类的子类:
                要么重写抽象类中的所有抽象方法。
                要么是抽象类。

练习:编写带有抽象类的标准Javabean类

青蛙frog                属性:名字,年龄                        行为:吃虫子,喝水

狗Dog                   属性:名字,年龄                        行为:吃骨头,喝水

山羊Sheep            属性:名字,年龄                        行为:吃草,喝水

public abstract class Animal {private String name;private int age;public Animal() {}public  Animal(String name, int age) {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 abstract void eat();public void drink(){System.out.println("动物在喝水");}
}
public class Dog extends Animal{public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗在啃骨头");}
}
public class Frog extends Animal{public Frog() {}public Frog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("青蛙在吃虫子");}
}
public class Sheep extends Animal{public Sheep() {}public Sheep(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("山羊在吃草");}
}
public class Test {public static void main(String[] args) {Sheep s=new Sheep("喜羊羊",2);s.eat();s.drink();}
}

运行结果:

山羊在吃草
动物在喝水

接口

        在Java中,接口(Interface)是一种引用类型,它定义了一组方法规范,这些方法规范可以由实现该接口的类来具体实现。接口是Java面向对象编程的核心概念之一,它提供了一种机制来实现抽象和多态。

接口的定义和使用

        接口用关键字interface来定义
                public interface 接口名{}
        接口不能实例化

        接口和类之间是实现关系,通过implements关键字表示
                public class 类名 implements 接口名{}
        接口的子类(实现类)
                要么重写接口中的所有抽象方法
                要么是抽象类

注意1:接口和类的实现关系,可以单实现,也可以多实现。
        public class 类名 implements 接口名1,接口名2{}

注意2:实现类还可以在继承一个类的同时实现多个接口。
        public class 类名 extends 父类 implements 接口名1,接口名2}

练习:编写带有接口和抽象类的标准Javabean类

青蛙           属性:名字,年龄        行为:吃虫子,蛙泳

狗               属性:名字,年龄        行为:吃骨头,狗刨

兔子            属性:名字,年龄        行为:吃胡萝卜

public abstract class Animal {private String name;private int age;public Animal() {}public  Animal(String name, int age) {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 abstract void eat();}
public interface Swim {public abstract void swim();
}

public class Dog extends Animal implements Swim{public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗在啃骨头");}@Overridepublic void swim() {System.out.println("狗在狗刨");}
}

public class Frog extends Animal implements Swim{public Frog() {}public Frog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("青蛙在吃虫子");}@Overridepublic void swim() {System.out.println("青蛙在蛙泳");}
}
public class Frog extends Animal implements Swim{public Frog() {}public Frog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("青蛙在吃虫子");}@Overridepublic void swim() {System.out.println("青蛙在蛙泳");}
}
public class Test {public static void main(String[] args) {Rabbit s=new Rabbit("喜羊羊",2);System.out.println(s.getName()+","+s.getAge());s.eat();Dog d=new Dog("维鲁斯",3);System.out.println(d.getName()+","+d.getAge());d.eat();d.swim();}
}

运行结果:

喜羊羊,2
兔子在吃胡萝卜
维鲁斯,3
狗在啃骨头
狗在狗刨

接口中成员的特点

         成员变量
                只能是常量
                默认修饰符:public static final
        构造方法
                没有

        成员方法
                只能是抽象方法
                默认修饰符:public abstract

        JDK7以前:接口中只能定义抽象方法。

        JDK8的新特性:接口中可以定义有方法体的方法。

        JDK9的新特性:接口中可以定义私有方法。

接口和类之间的关系

        类和类的关系
                继承关系,只能单继承,不能多继承但是可以多层继承
         类和接口的关系
                实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
         接口和接口的关系
                继承关系,可以单继承,也可以多继承

练习:编写带有接口和抽象类的标准Javabean类

        我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。

        为了出国交流,跟乒乓球相关的人员都需要学习英语。

        请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?

                乒乓球运动员:姓名,年龄,学打乒乓球,说英语

                篮球运动员:姓名,年龄,学打篮球

                乒乓球教练:姓名,年龄,教打乒乓球,说英语

                篮球教练:姓名,年龄,教打篮球

public abstract class Person {private String name;private int age;public Person() {}public Person(String name, int age) {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 interface English {public abstract void speakElish();
}
public class baskerballSporter extends Sporter{public baskerballSporter() {}public baskerballSporter(String name, int age) {super(name, age);}@Overridepublic void study() {System.out.println("篮球运动员在学习打篮球");}
}
public class basketballCoach extends Coach{public basketballCoach() {}public basketballCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("篮球教练在教打篮球");}
}
public abstract class Coach extends Person{public Coach() {}public Coach(String name, int age) {super(name, age);}public abstract void teach();
}
public class pingpongCoach extends Coach implements English{@Overridepublic void speakElish() {System.out.println("乒乓球教练在学习英语");}@Overridepublic void teach() {System.out.println("乒乓球教练在教打乒乓球");}
}
public class pingpongSporter extends Sporter implements English{public pingpongSporter() {}public pingpongSporter(String name, int age) {super(name, age);}@Overridepublic void speakElish() {System.out.println("乒乓球运动员在说英语");}@Overridepublic void study() {System.out.println("乒乓球运动员在学习打乒乓球");}
}
import a10demo2.Animal;public abstract class Sporter extends Person{public Sporter() {}public Sporter(String name, int age) {super(name, age);}public abstract void study();
}
public class Test {public static void main(String[] args) {pingpongSporter pps=new pingpongSporter("王楚钦",23);System.out.println(pps.getName()+", "+pps.getAge());pps.study();pps.speakElish();System.out.println("----------------------------");basketballCoach bbc=new basketballCoach("科比",41);System.out.println(bbc.getName()+", "+bbc.getAge());bbc.teach();}
}

运行结果:

王楚钦, 23
乒乓球运动员在学习打乒乓球
乒乓球运动员在说英语
----------------------------
科比, 41
篮球教练在教打篮球

JDK8以后接口中新增的方法

       1、 允许在接口中定义默认方法,需要使用关键字 default修饰

                作用:解决接口升级的问题

        接口中默认方法的定义格式:
                格式:public default 返回值类型 方法名(参数列表){}
                范例:public default void show(){ }

        接口中默认方法的注意事项
        默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。

         public可以省略,default不能省略。
        如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。

        2、允许在接口中定义定义静态方法,需要用static修饰

        接口中静态方法的定义格式:
                格式:public static 返回值类型 方法名(参数列表){}
                范例:public static void show(){ }

        接口中静态方法的注意事项:
                静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
                public可以省略,static不能省略

JDK9新增的方法

        接口中私有方法的定义格式:

                格式1:private 返回值类型 方法名(参数列表){}
                范例1:private void show(){ }

                格式2:private static 返回值类型 方法名(参数列表){}
                范例2:private static void method(){ }

适配器设计模式

        设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
        使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

        简单理解:设计模式就是各种套路。

        适配器设计模式:解决接口与接口实现类之间的矛盾问题。

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

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

相关文章

pycharm关闭项目时,页面卡住了,怎么办?

问题 在关闭pycharm时&#xff0c;有时会遇到卡在退出进度条的界面&#xff0c;很讨厌&#xff0c;那我们要怎么办才能退出呢&#xff1f; 说明&#xff1a;本篇文章不是从根源上解决这个问题&#xff0c;无法避免这种情况。 解决方法 方法一&#xff1a; 在卡住时&#xf…

python实现图像特征提取算法1

python实现Marr-Hildreth算法、Canny边缘检测器算法 1.Marr-Hildreth算法详解算法步骤公式Python 实现详细解释优缺点 2.Canny边缘检测器算法详解算法步骤公式Python 实现详细解释优缺点 1.Marr-Hildreth算法详解 Marr-Hildreth算法是一个用于图像边缘检测的经典算法&#xff…

思维+01背包,LeetCode LCP 47. 入场安检

一、题目 1、题目描述 「力扣挑战赛」 的入场仪式马上就要开始了&#xff0c;由于安保工作的需要&#xff0c;设置了可容纳人数总和为 M 的 N 个安检室&#xff0c;capacities[i] 记录第 i 个安检室可容纳人数。安检室拥有两种类型&#xff1a; 先进先出&#xff1a;在安检室中…

Git笔记:(上传Git、Git获取文件版本、删除、统计)

目录 一、上传文件到github 1.1 配置用户名和邮箱 1.2 初始化本地仓库 1.3 添加项目目录下所有文件至本地仓库 1.4 使用如下命令加入注释提交 1.5 将本地仓库与远程仓库相连接 1.6 将本地仓库中的文件推送至指定的远程仓库中 二、git获取不同版本 2.1 git下载特定历史…

【SpringBoot3】全局异常处理

【SpringBoot3】全局异常处理 一、全局异常处理器step1&#xff1a;创建收入数字的页面step2:创建控制器&#xff0c;计算两个整数相除step3:创建自定义异常处理器step5&#xff1a;创建给用提示的页面step6&#xff1a;测试输入&#xff08;10/0&#xff09; 二、BeanValidato…

【Python正则表达式】:文本解析与模式匹配

文章目录 1.正则表达式2. re模块3.修饰符3.元字符3-1 字符匹配元字符3-2 重复次数限定元字符3-3 字符集合匹配元字符3-4 分组元字符3-5 边界匹配元字符3-6 字符类别匹配元字符 4.技巧4-1 贪婪与非贪婪 5.案例 1.正则表达式 正则表达式面向什么样的问题&#xff1f; 1、判断一个…

【Linux】线程——线程互斥的概念、锁的概念、互斥锁的使用、死锁、可重入和线程安全、线程同步、条件变量的概念和使用

文章目录 Linux线程4. 线程互斥4.1 线程互斥的概念4.2 锁的概念4.2.1 互斥锁的概念4.2.2 互斥锁的使用4.2.3 死锁4.2.4 可重入和线程安全 5. 线程同步5.1 条件变量的概念5.2 条件变量的使用 Linux线程 4. 线程互斥 我们之前使用了线程函数实现了多线程的简单计算模拟器。 可以…

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…

php通用防伪溯源查询系统可自定义字段

性能描述&#xff1a; 1. 适合中小规模查询&#xff0c;建议100万条以内(具体视服务器配置)。 2. 自定义前台是否使用验证码&#xff0c;即可以自行开启/关闭验证码。 3. 灵活支持N列内容&#xff0c;只要前几列按照规则;其余列均自定义内容。 4. 可单个新加&#xff0c;也…

【测开能力提升-fastapi框架】fastapi能力提升 - ORM增删改查操作

1 ORM操作 注释&#xff1a; fastapi缺少合适的ORM&#xff0c;官方推荐&#xff1a;sqlalchemy&#xff0c;但我们就不听官方的话&#xff0c;我们选择使用Tortoise ORM&#xff0c;因为他是支持异步的 1.1 tortoise ORM支持的数据库 PostgreSQL&#xff08;使用asyncpg&am…

上市公司产品市场竞争程度指数(1990-2023年)

数据来源&#xff1a;基础数据来源于上市公司年报以及证监会及统计局时间跨度&#xff1a; 1990-2023年数据范围&#xff1a;企业及行业层面数据指标&#xff1a;本数据包含赫芬达尔指数/行业集中度/勒纳指数三个数据: 行业代码 行业名称 统计截止日期 市场类型 是否…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

#三元运算符(python/java/c)

引入&#xff1a;什么是三元运算符呢&#xff1f;无疑其操作元有三个&#xff0c;一个是条件表达式&#xff0c;剩余两个为值&#xff0c;条件表达式为真时运算取第一个值&#xff0c;为假时取第二个值。 一 Python true_expression if condition else false_expressi…

matlab永磁同步电机反馈试验装置的设计和永磁同步电机仿真

1、内容简介 略 85-可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;得益于电力电子器件及控制技术的高速发展&#xff0c;使得电机的应用越来越方便及精确&#xff0c;适应了实际应用对电机性能及质量提出的更高要求和标准。同时电机测试技术也因为电力电子技术的发…

AI多模态实战教程:面壁智能MiniCPM-V多模态大模型问答交互、llama.cpp模型量化和推理

一、项目简介 MiniCPM-V 系列是专为视觉-语⾔理解设计的多模态⼤型语⾔模型&#xff08;MLLMs&#xff09;&#xff0c;提供⾼质量的⽂本输出&#xff0c;已发布4个版本。 1.1 主要模型及特性 &#xff08;1&#xff09;MiniCPM-Llama3-V 2.5&#xff1a; 参数规模: 8B性能…

将Excel或CSV文件导入MySQL

数据库信息 版本:mysql-5.7.22 字符集如下 一、将 Excel 文件导入 MySQL,此时 MySQL 中不存在该表。 在数据库中,右键-导入向导

刚刚 威尼斯影评人周公布 2024 年电影阵容 包括敏感纪录片《本土》

《本土》 威尼斯影评人周是威尼斯电影节专门为首次拍摄电影的人设立的侧边活动&#xff0c;该活动公布了第 39 届威尼斯电影节的七部竞赛片和两部非竞赛片的入选名单&#xff0c;第 39 届威尼斯电影节将于 8 月 28 日至 9 月 7 日举行。 较为及时的作品之一是美国导演迈克尔普…

【IntelliJ IDEA】一篇文章集合所有IDEA的所有设置

IntelliJ IDEA 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;其设置涵盖了多个方面&#xff0c;以满足不同开发者的需求和偏好。由于 IDEA 的设置相当复杂和详尽&#xff0c;这里无法在一篇简短的文章中详细介绍所有设置。然而&#xff0c;我可以提供一…

持续集成07--Jenkins配置Allure测试报告

前言 在持续集成&#xff08;CI&#xff09;流程中&#xff0c;自动化测试报告是评估软件质量和追踪问题的重要工具。Allure Framework作为一个轻量级且功能丰富的测试报告工具&#xff0c;能够生成详细的测试报告&#xff0c;帮助团队更好地理解测试结果。本章节“持续集成07-…

Java二十三种设计模式-装饰器模式(7/23)

装饰器模式&#xff1a;动态扩展功能的灵活之选 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改对象自身的基础上&#xff0c;通过添加额外的职责来扩展对象的功能。 基础知识&#xff0c;java设计模式总体来说设计…