【Java入门到精通】(三)Java基础语法(下)

一、面向对象(类和对象)

1.1 万事万物皆对象

        类:对对象向上抽取出像的部分、公共的部分以此形成类,类就相当于一个模板。

        对象:模板下具体的产物可以理解为具体对象,对象就是一个一个具体的实例,就相当于这个模板下具体的产品。

        Java中一般先定义类,再创建对象

1.2 类和对象的关系

(1)类的定义
  • 给类起一个见名知意的名字,首字符大写,驼峰命名原则,
  • 类的特性编写,特性即类的属性部分。
  • 类的行为编写,行为即类的方法部分。
(2)类和对象的创建以及使用

类的定义

public class Person {// 特性编写-属性-名词(只定义和业务逻辑相关的代码)String name; // 姓名int age; // 年龄double height; // 身高// 行为编写-方法-动词// 定义一个学习的方法public void study() {System.out.println("study>>>>>>");}
}

对象的创建和使用类

public class Test {// 程序的入口public static void main(String[] args) {// 对Person类的对象进行创建:创建了一个Person对象,名字叫p1Person p1 = new Person();// 对属性进行赋值操作p1.name = "张三";p1.age = 18;p1.height = 178.5;// 读取属性System.out.println(p1.name);System.out.println(p1.age);// 调用对象的方法p1.study();}
}

二、构造器

2.1 构造器的作用

        对于一个类来说,一般有三种常见的成员:属性方法构造器。这三种成员都可以定义零个或多个。

        构造方法也叫构造器,是一个创建对象时被自动调用的特殊方法,用于对象的初始化。Java通过new关键字来调用构造器,从而返回该类的实例。

2.2 构造器声明格式

        若无参数列表,称之为无参构造器(空构造器)

        若有参数列表,称之为有参构造器

2.3 构造器四要点

  • 构造器的方法名必须和类名一致
  • 构造器通过new关键字调用
  • 构造器不能定义返回值类型,不能在构造器里使用return关键字来返回某个值。
  • 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则把编译器不会自动添加

2.4 构造器的重载

        构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。

2.5 创建构造器的快捷键

8Alt + Insert

2.6 代码示例

Person类

// 特性编写-属性-名词(只定义和业务逻辑相关的代码)
String name; // 姓名
int age; // 年龄
double height; // 身高// 行为编写-方法-动词
// 定义一个学习的方法
public void study() {System.out.println("study>>>>>>");
}
// 定义一个构造器
public Person() {System.out.println("调用了一个空构造器");
}
// 重载一个构造器
// 构造器的参数名字:如果和属性名字重名,就会发生就近原则
// 如果重名以后,你想给属性赋值,那么就在想要表达属性的变量前加上 this. 修饰
public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;
}

Test02对象

public class Test02 {public static void main(String[] args) {// 创建一个Person类的对象/* new Person()解释Person():空的构造方法new关键字:对方法进行调用=》构造器作用:底层会帮我们创建对象,在创建对象之后进行初始化操作如果一个类没有显示编写构造器的话,那么系统会为这个类默认分配一个空构造器调用构造器以后,对对象进行初始化操作,将对象的地址返回给p尽量要保证空构造器的存在,因为某些框架底层需要空构造器,如果你没有添加就会报错*//*原始写法Person p = new Person();p.age = 18;p.name = "小张";p.height = 180.6;Person p2 = new Person();p2.age = 18;p2.name = "小李";p2.height = 160.6;*/// 简便写法Person p = new Person(18,"小张",180.6);System.out.println(p.age);Person p2 = new Person(30, "小李",160.6);System.out.println(p2.age);// 如果一个类中有构造器,那么系统就不会为你分配默认的构造器// Person p3 = new Person();  // 会报错}}

三、面向对象(封装)

3.1 封装的思想

        我们程序设计追求“高内聚,低耦合”。

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合:仅对外暴露少量的方法用于使用。

        隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性,提高程序的安全性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装的设计思想。 

3.2 代码

Gril类

public class Gril {// 属性private int age; // private表示私有属性,只能在内部访问// 封装思想的使用:// 给age提供一个赋值方法:public void setAge(int age) {if (age > 30) {this.age = 18;} else {this.age = age;}}// 给age提供一个读取的方法public int getAge(){return age;}
}

 Test对象调用Gril类

public class Test {public static void main(String[] args) {// 创建对象Gril g = new Gril();g.setAge(18);System.out.println(g.getAge());}
}

3.3 上述封装代码的解释

        上述代码以属性为案例进行封装:

(1)将属性私有化,被private修饰--》加入权限修饰符(一旦加入了权限修饰符,其他人就不能随意的获取这个属性)

(2)提供public修饰的方法让别人来访问/使用

(3)即使外界可以通过方法来访问属性了,但是也不能随意访问,因为程序员可以在方法中加入限制条件。

四、面向对象(继承)

4.1 类是对对象的抽象

4.2 继承是对类的抽象

 4.3 继承的格式和好处

(1)继承的格式

子类 extends 父类

public class student extends Person {}

(2)继承的好处

  • 提高了代码的复用性;
  • 便于代码的扩展;
  • 为了多态的使用,是多态使用的前提

4.4 代码示例

Person继承类

public class Person {// 父类的公共属性:private int age;private String name;private double height;//父类的公共方法:public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}// 吃饭public void eat() {System.out.println("人类可以吃饭!!");}//睡觉public void sleep() {System.out.println("人类可以睡觉!!");}//喊叫public void shout() {System.out.println("人类可以喊叫!!");}
}

Student类

public class Student extends Person {// 定义子类额外的、扩展的属性private int sno;// 定义子类额外的、扩展的方法public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}// 学习:public void study() {System.out.println("学生可以学习");}
}

Test对象 

public class Test {public static void main(String[] args) {// 定义一个子类具体的对象:Student s = new Student();s.setSno(10000);s.setAge(18);s.setName("张三");s.setHeight(180.3);s.study();s.eat();s.shout();s.sleep();}
}

4.5 方法的重写

        方法的重写是基于继承来的

方法重写的定义:

        发生在子类和父类中,当子类对父类提供的方法不满意的时候,要对父类的方法进行重写。

        一旦子类对父类的方法进行了重写,对象访问的时候,就只能访问到子类的方法(就近原则)。

方法的重写有严格的格式要求:

         子类的方法名和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致。

代码

Person继承类

public class Person {public void eat(){System.out.println("人可以吃饭");}
}

Student类

public class Student extends Person {// 方法的重写public void eat(){System.out.println("我喜欢吃烧烤");}
}

Test对象

public class Test {public static void main(String[] args) {// 创建一个Student具体的对象Student s = new Student();s.eat();}
}

面试常问:

重载和重写有什么区别?

重载:在同一个类中,当方法名相同,形参列表不同的时候,多个方法构成了重载。

重写:在不同的类中,子类对父类提供的方法不满意,对父类的方法进行重写。

五、面向对象(多态)

5.1 多态的概念

        多态:通俗来所,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。同一种行为,不同的子类呈现出来的状态是不同的

        ps:多态跟属性无关,多态指的是方法的多态,而不是属性的多态。

5.2 多态的三要素和好处

        多态三要素:继承、重写、父类引用指向子类对象

        多态的好处:提高代码扩展性

// 这里没太理解,而且比较乱,可以看一下项目中的java10下面的示例

六、异常处理

6.1 什么是异常

        异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。

  • 所需要的文件找不到
  • 网络连接不同或中断
  • 算术运算错(被零除...)
  • 数组下标越界
  • 装载一个不存在的类或者对null对象操作
  • 类型转换异常
  • ........

        Java提供异常处理机制。它将异常处理代码和业务代码分离,使程序更优雅,更好的容错性,高健壮性。

        Java的异常处理是通过5个关键字来实现的:trycatchfinallythrowthrows 

6.2 程序中异常演示

6.3 try-catch-finally

public static void main(String[] args) {try {// 求两个数的商int num1 = 12;int num2 = 2;System.out.println("两个数的商为:"+ num1/num2);} catch (Exception ex){System.out.println("你的程序出现了错误"+ ex);} finally {System.out.println("程序无论是否出现异常,这里的逻辑都必须执行");}System.out.println("上面是两个数相除的逻辑案例1");
}

try-catch执行情况

情况1:try块中代码没有出现异常

        不执行catch块代码,执行catch块后边的代码

情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)

        Java会生成相应的异常对象,Java系统寻找匹配的catch块,执行catch块后面的代码。try块中尚未执行的语句不会执行。

情况3:try块代码出现异常,catch中异常类型不匹配

        不执行catch块代码,不执行catch块后面的代码,程序会中断运行

catch块中如何处理异常

        其中一种方式:自定义内容输出

6.4 throw/throws

throw/throws的使用

public class Test02 {public static void main(String[] args) {try {devide();} catch (Exception e) {System.out.println("在调用时处理异常");}}// 提取一个方法:两个数相除操作public static void devide() throws Exception {int num1 = 12;int num2 = 0;if(num2 == 0){// 人为制造一个异常/** 第一种抛异常的方式:try {throw new Exception();} catch (Exception e) {throw new RuntimeException(e);}*/throw new Exception();}System.out.println("两个数的商是" + num1/num2);}
}

 throw和throws的区别

(1)位置不同

        throw:方法内部

        throws:方法的签名处,方法的声明处

(2)内容不同:

        throw+异常对象

        throws+异常的类型

(3)作用不同:

        throw:异常出现的源头,制造异常。

        throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理:要么自己处理,要你再继续向外抛出异常。

七、集合

7.1 对比数组的缺点引入集合

(1)数组一旦指定了长度,那么长度就被确定了,不可以更改。

(2)删除、增加元素效率低(如果改变数组中其中一项,后面的项都要跟着变)

(3) 数组中实际元素的数量是没法获取到的,没有提供对应的方法或者属性来获取。

(4)数组存储:有序,可重复,对于无序的,不可重复的场合数组不能满足要求。

7.2 集合体系预览

7.3 ArrayList集合的使用

public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<String>();// 增加元素:list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");System.out.println(list); // [aaa, bbb, ccc, ddd]// 删除元素:list.remove("ccc");System.out.println(list); // [aaa, bbb, ddd]// 修改元素:list.set(0, "eee");System.out.println(list); // [eee, bbb, ddd]// 查看元素:System.out.println(list.get(0)); // eee// 遍历当前集合// 使用普通的for循环for (int i = 0; i < list.size()-1; i++) {System.out.println(list.get(i));}
}
ArrayList使用方法
增加元素

list.add("aaa");

删除元素

list.remove("ccc");

修改元素

list.set(0, "eee");

查找元素

System.out.println(list.get(0));

遍历元素

for (int i = 0; i < list.size()-1; i++) {
System.out.println(list.get(i));
}

八、项目总结实战 

8.1 需求设计

        项目名称:小张书城

        项目需求设计:

项目任务涉及技能点

1、展示书籍

2、上新书籍

3、下架书籍

4、推出应用

用户交互-键盘录入

分支结构、循环结构

面向对象思维封装对象(如何合理定义类)

集合的使用

8.2 项目代码实现

Books集合

public class Books {// 书籍相关// 书籍类的 属性// private修饰符:只允许内部访问,外部无法访问该属性// 书籍编号private int bNo;// 书籍名称private String bName;// 书籍作者private String bAuthor;//快捷键:alt + insert 快速创建get和set方法public int getbNo() {return bNo;}public void setbNo(int bNo) {this.bNo = bNo;}public String getbAuthor() {return bAuthor;}public void setbAuthor(String bAuthor) {this.bAuthor = bAuthor;}public String getbName() {return bName;}public void setbName(String bName) {this.bName = bName;}// 构造器public Books(int bNo, String bName, String bAuthor) {this.bNo = bNo;this.bName = bName;this.bAuthor = bAuthor;}// 空构造器public Books() {}
}

Test对象

package com.study.java13;
import java.awt.print.Book;
import java.util.ArrayList;
import java.util.Scanner; // 告诉程序这个类在什么位置/*
【小张书城】项目功能规划:
1.展示书籍
2.上新书籍书籍信息:书籍编号    书籍名称       书籍作者01   小张的Java之路    小张快跑   ----》 封装成一个具体的书籍对象 ---》类:书籍
3.下架书籍
4.退出应用*/
public class Test {public static void main(String[] args) {// 创建一个集合:用于存放相同的个体(列表用来存放书籍)--》书籍对象    --》注意作用范围:将list放在循环外面ArrayList list = new ArrayList(); // 空集合while (true){// 打印菜单:System.out.println("-------欢迎来到【小张书城】-------");System.out.println("1.展示书籍");System.out.println("2.上新书籍");System.out.println("3.下架书籍");System.out.println("4.退出应用");// 借助Scanner类:Scanner sc = new Scanner(System.in); // 扫描键盘录入事件类// 给一个友好的提示System.out.println("请录入你想要执行的功能的序号:");// 利用键盘,录入序号:int choice = sc.nextInt(); // 接收键盘录入的事件// 根据choice录入的功能序号,进行后续的判断if(choice == 1){System.out.println("<展示书籍>");// 展示书籍(对集合进行遍历查看)for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i)); // Java 语言中的类型转换System.out.println(b.getbNo() + "------" + b.getbName() + "------" + b.getbAuthor() + "------");}}if(choice == 2){System.out.println("<上新书籍>");// 从键盘录入书籍信息System.out.println("请录入书籍编号:");int bNo = sc.nextInt(); // 获取家键盘int类型数据System.out.println("请录入书籍名称:");String bName = sc.next(); //获取家键盘String类型数据System.out.println("请录入书籍作者:");String bAuthor = sc.next(); //获取家键盘String类型数据// 每上新一本书,就要创建一个书籍对象Books b = new Books();b.setbNo(bNo);b.setbName(bName);b.setbAuthor(bAuthor);list.add(b); // 添加个体到集合中去}if(choice == 3){System.out.println("<下架书籍>");// 录入要下架的书籍的编号System.out.println("请录入你要下架的书籍的编号:");int deNo = sc.nextInt();// 下架编号对应的书籍for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i));if(b.getbNo() == deNo){ // 如果遍历的书籍编号和录入的要删除的书籍编号一致,那么从集合中移除该书籍即可list.remove(b);System.out.println("书籍下架成功");break; // 如果下架成功,就停止遍历,不需要后续的遍历}}}if(choice == 4){System.out.println("<退出应用>");break; // 停止正在执行的循环}}}
}

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

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

相关文章

Java文件传输要点

Java文件传输要点 一、前端 <form action"/upload" method"post" enctype"multipart/form-data"> <!--<form action"/upload" method"post">-->姓名: <input type"text" name"username…

Spring Boot 中使用 Lombok 进行依赖注入的示例

Spring Boot 中使用 Lombok 进行依赖注入的示例 下面我将展示 Spring Boot 中使用 Lombok 进行依赖注入的不同方式&#xff0c;包括构造器注入、属性注入和 setter 方法注入&#xff0c;以及相应的测试用例。 1. 构造器注入&#xff08;推荐方式&#xff09; import lombok.Req…

vue3+vit+vue-router路由,侧边栏菜单,面包屑导航设置层级结构

文章目录注意效果图目录结构代码vite.config.ts需要配置路径别名符号main.tsApp.vueBreadcrumb.vue面包屑组件menus.ts// src/router/index.ts其他文件注意 目录结构仅供参考DefaultLayout.vue 没有用到&#xff0c;我直接写在APP文件中vux-store我也没有用到&#xff0c;单独…

使用Selenium自动化获取抖音创作者平台视频数据

前言 在当今短视频盛行的时代&#xff0c;抖音作为国内领先的短视频平台&#xff0c;吸引了大量内容创作者。对于创作者而言&#xff0c;了解自己发布的视频表现&#xff08;如播放量、发布时间等&#xff09;至关重要。本文将介绍如何使用Python的Selenium库来自动化获取抖音…

SpringCloud之Eureka

SpringCloud之Eureka 推荐参考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_service_discovery_eureka_clients 1. 什么是Eureka Eureka 用于简化分布式系统的服务治理&#xff0c;基于REST的服务&#xff0c;用于服务的注册与发现。通过注册发现、客户…

squash压缩合并

要将test分支的多次提交合并到dev分支并压缩为一个commit&#xff0c;核心是使用 git merge --squash 命令&#xff08;压缩合并&#xff09;&#xff0c;具体步骤如下&#xff1a; 详细步骤&#xff1a; 1. 切换到dev分支并拉取最新代码先确保本地dev分支是最新的&#xff0c;…

飞书CEO谢欣:挑战巨头,打造AI新时代的Office

引言&#xff1a;飞书要做AI时代办公协作的逐梦者与破局者。文 | 大力财经在AI浪潮席卷的当下&#xff0c;企业对AI既满怀期待又充满焦虑。“AI到底能不能用&#xff1f;AI到底怎么用&#xff1f;”成为萦绕在众多企业心头的难题。7月9日召开的飞书未来无限大会&#xff0c;飞书…

React 组件中怎么做事件代理?它的原理是什么?

在 React 组件中&#xff0c;**事件代理&#xff08;Event Delegation&#xff09;**其实是 React 内部实现的一部分&#xff0c;开发者通常无需手动实现事件代理&#xff0c;但理解它的原理和使用方式对于优化性能和掌握底层机制非常重要。一、React 中事件代理的原理React 使…

Vue 2现代模式打包:双包架构下的性能突围战

文章目录一、场景痛点&#xff1a;兼容性与性能的撕裂二、技术解析&#xff1a;Modern Mode的双引擎驱动1. 基础认知&#xff1a;什么是Modern Mode&#xff1f;2. 原理深入&#xff1a;HTML智能分发与Safari 10修复3. 性能收益对比表三、Vue 2项目实战&#xff1a;启用Modern模…

UniHttp中HttpApiProcessor生命周期钩子介绍以及公共参数填充-以百度天气接口为例

目录 引言 一、UniHttp与HttpApiProcessor简介 1、生命周期钩子的重要性 2、公共参数填充的需求 3、生命周期钩子相关介绍 二、HttpApiProcessor的实际应用 1、在Yml中定义相关参数 2、自定义HttpAPI注解 3、对接接口的定义 4、HttpApiProcessor的具体实现 5、实际调…

pytorch深度学习—RNN-循环神经网络

结合生活实例&#xff0c;先简单认识一下什么是循环神经网络先想个问题&#xff1a;为什么需要 “循环”&#xff1f;你平时看句子、听语音、看视频&#xff0c;都是 “按顺序” 来的吧&#xff1f;比如 “我吃苹果” 和 “苹果吃我”&#xff0c;字一样但顺序不同&#xff0c;…

深度学习常见名词解释、评价指标

目录 一、鲁棒性(robustness) 二、泛化能力&#xff08;Generalization Ability&#xff09; 核心含义&#xff1a; 如何衡量泛化能力&#xff1f; 三、先验信息&#xff08;Prior Information&#xff09; 四、mIoU &#xff08;Mean Intersection over Union&#xff0…

docker-compose安装常用中间件

分为3大部分&#xff1a;数据库&#xff1a;mysql&#xff0c;redis&#xff0c;mongodb&#xff0c;elasticsearch&#xff0c;neo4j&#xff0c;minio&#xff0c;influxdb&#xff0c;canal-server应用中间件&#xff1a;nacos&#xff0c;apollo&#xff0c;zookeeper&…

基于无人机 RTK 和 yolov8 的目标定位算法

目录 背景 算法思路 代码实现 验证 背景 在城市交通巡检中如何进行车辆违停判断很重要&#xff0c;一个方法是通过精确坐标判断车辆中心是否位于违停框中&#xff0c;我们假设无人机坐标已知&#xff0c;并且无人机云台镜头垂直地面朝下&#xff0c;可根据图像分辨率、无人机参…

go入门 - day1 - 环境搭建

0. 介绍 go语言可以做什么&#xff1f; a. 区块链 b. 分布式/微服务/云原生 c. 服务器/游戏软件go的优势 a. 代码量比C和Java少 b. 编译速度比Java或者C快上5到6倍&#xff0c;比Scale块10被 c. 性能比C慢20%&#xff0c;但是比Java、python等快上5到10倍 d. 内存管理和C媲美&a…

【华为OD】MVP争夺战(C++、Java、Python)

文章目录题目描述输入描述输出描述示例解题思路算法思路核心步骤代码实现C实现Java实现Python实现算法要点复杂度分析解题总结题目描述 在星球争霸篮球赛对抗赛中&#xff0c;最大的宇宙战队希望每个人都能拿到MVP&#xff0c;MVP的条件是单场最高分得分获得者。可以并列所以宇…

Datawhale 2025 AI夏令营 MCP Server Task2

魔搭MCP &Agent赛事&#xff08;MCP Server开发&#xff09;/夏令营&#xff1a;动手开发MCP Server学习链接&#xff1a;魔搭MCP &Agent赛事&#xff08;MCP Server开发&#xff09; - Datawhale Task1回顾 1.task1应用功能 luner_info每日黄历 这是一个可以获取某天…

敏捷开发方法全景解析

核心理念:敏捷开发是以快速响应变化为核心的项目管理方法论,通过迭代式交付、自组织团队和持续反馈,实现高质量软件的高效交付。其本质是拥抱变化优于遵循计划,强调"可工作的软件高于详尽的文档"。 一、敏捷核心思想体系 #mermaid-svg-y7iyWsQGVWn3IpEi {font-fa…

Socket到底是什么(简单来说)

简单来说&#xff1a; Socket 抽象了网络通信的复杂底层细节&#xff0c;让应用程序开发者可以专注于发送和接收数据&#xff0c;而不用去操心数据在网络上是如何传输的。 它就像一个“黑盒子”&#xff0c;你只需要把数据扔进去&#xff0c;或者从里面取数据&#xff0c;至于数…

linux系统mysql性能优化

1、系统最大打开文件描述符数查看限制 ulimit -n更改配置 # 第一步 sudo vim /etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576# 第二步 sudo vim /etc/sysctl.conffs.file-max 1048576# 第三步&#xff08;重启系统&#xff09; sudo reboot验证生效 u…