关键词:
java学习笔记3(datawhale教程):类与方法,继承与多态,抽象类与接口
文章目录
一.类与方法
1.类与对象
-
JAVA源程序由若干个类组成,类是用来创建对象的模板
-
类的实现包括:类声明
class 类名
和类体(大括号里的内容)class 类名 //类的成员变量 //类的成员方法 //类体的内容等
2.成员变量
-
Java中对象属性也称为成员变量
-
定义语法与普通变量一样
package com.apache.test; public class Bird String wing; String claw; //爪子 String beal; //喙 String feather; //羽毛
成员变量可以赋值初始化,也可以不设置,不设置的话会有默认值
-
3.成员方法
语法格式
[权限修饰符] [返回值类型]方法名([参数类型 参数名])[throws 异常类型]
//方法体
return 返回值;
- 选线修饰符:private、public、protected
- 返回值类型
- 无返回值 void
- 有返回值:返回值类型用于指定方法返回数据的类型
- 参数
- 有参数
- 可以是对象
- 也可以是基本数据类型的变量
- 无参数
- 有参数
来看例子
注意方法的定义必须在类中,如果没有指定权限修饰符,方法默认访问权限为缺省(即只能在本类及同一个包中的类中进行访问)
来个商店类
package com.apache.test;
public class Store
public void showGoods()
System.out.println("库存商品信息:");
public int showGoods2()
System.out.println("库存商品信息:");
return 1;
成员方法的参数
-
传给方法的是实参,方法内部接收实参变量的是形参
形参声明语法与变量声明语法一样
值参数
-
按值传递,方法中对形参的改变不影响实参
-
例:计算箱子里书的数量
-
书架上有30本书,箱子里有40本书,把书架上的书全部放进箱子后,使用带参数的成员方法计算箱子里
书的总数package com.apache.test; public class Book public static void main(String[] args) Book book1 = new Book(); //创建书类对象 int shelf = 30; //实参:书架上书的本数 int box = 40; //实参:箱子里书的本数 System.out.println("把书架上的书全部放进箱子后,箱子里一共有" + book1.add(shelf, box) + "本书。\\n明细如下:书架上" + shelf + "本书,箱子里原有" + box + "本书。"); private int add(int shelf,int box) //把书架和箱子里的书相加求和 box = box + shelf; return box; //返回箱子里的书
可以看出实参box没有被改变
-
引用参数
-
如果在给方法传递参数时,参数的类型是数组或者其他引用类型,那么,在方法中对参数的修改会
反映到原有的数组或者其他引用类型上,这种类型的方法参数被称之为引用参数。 -
例:汇率转换
package com.apache.test; public class ExchangeRate public static void main(String[] args) ExchangeRate rate = new ExchangeRate(); double[] denomination = 1,10,100; //面额 //输出数组中元素 System.out.print("美元:"); for(int i = 0; i<denomination.length;i++) System.out.print(denomination[i]+"美元 "); rate.change(denomination); System.out.print("\\n人民币:"); for(int i = 0; i<denomination.length;i++) System.out.print(denomination[i]+"元 "); //形参为一维数组 public void change(double[] arr) for(int j = 0; j < arr.length; j++) //for循环遍历数组 arr[j] = arr[j] * 6.903; //数组中元素汇率转换
不定长参数
4.构造方法
-
构造方法是一种特殊类型方法 与类同名
-
对象的创建就是通过构造方法完成的
-
类实例化一个对象时,类都会自动调用构造方法
-
构造方法的特点
- 无返回类型,但不能定义为void
- 主要作用是完成对象初始化工作,把能定义对象的参数传给对象成员
-
无参构造:
public class Book public Book() //无参构造
-
有参构造
package com.apache.test; public class Store public Store(int args) //有参构造 public void showGoods() System.out.println("库存商品信息:"); public int showGoods2() System.out.println("库存商品信息:"); return 1;
-
如果类中没有明确定义构造方法,则编译器会自动创建一个不带参数的默认构造方法
-
如果在类中都是有参构造方法,则编译器不会为类自动生成一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。
所以只有在类中没有定义任何
构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。 -
例子:借一本经典Java教程:《Java编程思想》
package com.apache.test; public class BorrowABook public BorrowABook() //无参构造 public void borrow(String name) //参数为借的书名 System.out.println("您已借阅"+name); public static void main(String[] args) BorrowABook book2 = new BorrowABook(); book2.borrow("《Java编程思想》");
5.this关键字
-
如果类的成员变量与成员方法中的参数重名时,会发生啥问题捏?
看看这个例子,输出的是abc还是123
package com.apache.test; public class Book String name = "abc"; public void showName(String name) System.out.println(name); public static void main(String[] args) Book book = new Book(); book.showName("123");
输出的是123,说明方法中如果出现了与局部变量同名的参数,会使得方法无法直接使用成员变量
-
因此需要有区分的途径
Java规定使用this关键字代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法
-
例:调用书名属性
package com.apache.test; public class BorrowABook String name; public BorrowABook(String name) this.name = name; // 将参数name的值付给属性name public void borrow() //参数为借的书名 //下面这个地方name或this.name都能输出 // System.out.println("您已借阅"+name+"。 "); System.out.println("您已借阅"+this.name+"。 "); public static void main(String[] args) BorrowABook book2 = new BorrowABook("《Java编程思想》"); book2.borrow();
-
this关键字引用的是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就需要添加this关键字明确引用的是类成员还是局部变量或方法参数
-
this关键字除了可以调用成员变量或成员方法之外,还可以作为方法的返回值
package com.apache.test; public class Book public Book getBook() return this;
在 getBook()方法中,方法的返回值为Book类,所以方法体中使用return this 这种形式将Book类的对象进行返回
6.static关键字
静态关键字可以与类、变量、方法和块一起使用。静态成员属于类而不是特定实例,这意味着如果将成员设为静态,则无需对象即可访问它
-
类的静态成员
- static修饰的变量:静态变量
- static修饰的常量:静态常量
- static修饰的方法:静态方法
-
举个小栗子
package com.apache.test; import java.util.Arrays; //导入java.util.Arrays类 public class HelloWorld /** * @paramargs */ static void myMethod() System.out.println("myMethod"); public static void main(String[] args) myMethod();
-
实例
package com.apache.test; public class Pool public static int water = 0;//初始化静态变量水池中的水量为0 public static void outlet() //放水,一次放出两个单位 if (water >= 2) //如果水池中的水量大于等于2个单位 water = water - 2; else water = 0; public static void inlet() water += 3; public static void main(String[] args) // Pool Pool1 = new Pool(); // Pool Pool2 = new Pool(); System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量 System.out.println("水池注水两次。"); Pool.inlet(); // 调用静态的注水方法 Pool.inlet(); // 调用静态的注水方法 System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量 System.out.println("水池放水一次。"); Pool.outlet(); // 调用静态的放水方法 System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量
静态代码块
-
在类的成员方法之外,用static修饰代码区域可以称之为静态代码块
定义一块静态代码块,可以完成类的初始化操作,在类声明时就会运行,语法如下:
public class StaticTest static // 此处编辑执行语句
-
实例:代码块执行顺序
创建静态代码块、非静态代码块、构造方法、成员方法,看看这几处代码的调用顺序,代码如下
package com.apache.test; public class StaticTest static String name; //静态代码块 static System.out.println(name + "静态代码块"); //非静态代码块 System.out.println(name + "非静态代码块"); public StaticTest(String a) name = a; System.out.println(name + "构造方法"); public void method() System.out.println(name + "成员方法"); public static void main(String[] args) StaticTest s1; //声明的时候就开始运行静态代码块了 StaticTest s2 = new StaticTest("s2"); //new的时候才会运行构造方法 StaticTest s3 = new StaticTest("s3"); s3.method(); //只有调用才运行
关于各代码块之间的执行顺序,可以看这位大佬的博客👉here
类的主方法
-
之前一直在用,但还没有研究过那个到底是啥意思
-
主方法的语法:
public static void main(String[] args) //方法体
-
主方法特性
- 主方法是静态的,如果要直接在主方法中调用其他方法,那么被调用的方法也要是静态的
- 主方法无返回值
- 主方法的形参为数组,其中args[0]~args[n]分别代表程序的第一个参数到第n+1个参数,可以用 args.length 获取参数的个数
二.继承与多态
继承
1.继承的基本语法
-
学过C++,了解概念,来看看Java里面的格式要求
class 父类 class 子类 extends 父类
-
看个例子
公共父类动物类
package com.apache.test; public class Animal private String name; private int id; public Animal(String myName) name = myName; public void eat() System.out.println(name + "正在吃"); public void sleep() System.out.println(name + "正在睡"); public void introduction() System.out.println("我是" + name + ".");
子类兔子类
package com.apache.test; public class rabbit extends Animal public rabbit(String myName) super(myName);
子类老虎类
package com.apache.test; public class tiger extends Animal public tiger(String myName) super(myName);
tips:InteliJ IDEA 如何创建子类?
2.继承类型
-
Java支持下面几种
-
单继承
public class A ... public class B extends A ...
-
多重继承
-
子类还有子类
public class A ... public class B extends A ... public class C extends B ...
-
-
不同类继承同一个类
- 多个子类继承一个父类
-
-
Java不支持多继承
- 即一个类继承多个类
3.继承关键字
extends
前面所示
implements
Java不支持多继承,但用implements可以实现多个接口,相当于使得Java有多继承的特性
public interface if1
public void method1();
public interface if2
public void method2();
public class if3 implements if1,if2
@Override
public void method1()
@Override
public void method2()
参考:在IDEA中创建接口
-
创建接口
-
选中,然后按
alt+enter
可以快捷继承
super与this
- super : 引用当前对象的父类成员
- this :指向当前类的引用
public class Father
void method()
System.out.println("父类");
class Son extends Father
void method()
System.out.println("子类");
void diff_method()
this.method()查看详情
吃瓜教程——datawhale10月组队学习(代码片段)
task03:概览西瓜书+南瓜书第4章4.1决策树算法其中有三条返回的准则:(1)当前结点包含的样本全属于同一类别,无需划分;(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;(3)当前结点包含的样... 查看详情
吃瓜教程——datawhale10月组队学习(代码片段)
task03:概览西瓜书+南瓜书第4章4.1决策树算法其中有三条返回的准则:(1)当前结点包含的样本全属于同一类别,无需划分;(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;(3)当前结点包含的样... 查看详情
datawhale吃瓜教程组队学习task01(代码片段)
Datawhale吃瓜教程组队学习task01还没写完,会持续更新~~上个月看了周志华老师的机器学习视频课的前三章,但是后面中断了没看…(主要是懒🤐)于是打算这个月继续来学习西瓜书和南瓜书🤯Task01:概览西瓜书... 查看详情
尚硅谷_java零基础教程(异常处理)--学习笔记(代码片段)
Java异常处理一、异常概述与异常体系结构1.定义2.分类3.异常体系结构4.常见异常实例二、异常处理机制try-catch-finally1.理解和格式2.举例throws+异常类型1.理解2.格式3.重写方法声明抛出异常的原则开发中如何选择这两种处理机制... 查看详情
吃瓜教程——datawhale10月组队学习
task02:概览西瓜书+南瓜书第3章3.1线性回归的基本形式给定d个属性描述,可以通过属性线性组合来进行预测的函数3.2线性回归3.2.1一元线性线性回归模型:线性模型准则:均方误差最小算法:最小二乘假设x和y满... 查看详情
吃瓜教程——datawhale10月组队学习
task02:概览西瓜书+南瓜书第1、2章3.1线性回归的基本形式给定d个属性描述,可以通过属性线性组合来进行预测的函数3.2线性回归3.2.1一元线性线性回归模型:线性模型准则:均方误差最小算法:最小二乘假设x和y... 查看详情
尚硅谷_java零基础教程(多线程)--学习笔记(代码片段)
Java多线程一、基本概念1、程序、进程、线程2、单核CPU和多核CPU、并行与并发3、使用多线程的优点二、线程的创建和使用1、API中创建线程的两种方式1.1、方式一:继承Thread类1.2、方式二:实现Runnable接口1.3、Thread类的调... 查看详情
狂神说java---记录spring学习笔记(代码片段)
☞传送门==>B站遇见狂神说—Spring5教程感谢狂神,学习视频真的是通俗易懂♥♥♥笔记和练习只是跟着视频整理的;有的知识点并没有整理进来ml1.Spring概述2.控制反转IOC3.试试Spring3.1IOC创建对象的方式3.2Spring配置说明3.3DI(依... 查看详情
机器学习基础教程笔记---机器学习概述(代码片段)
目录机器学习概述1.1人工智能概述1.1.1机器学习与人工智能、深度学习1.1.2机器学习、深度学习能做些什么1.1.3人工智能阶段课程安排1.2什么是机器学习1.2.1定义1.2.2解释1.2.3数据集构成1.3机器学习算法分类学习目标分析1.2中的例子... 查看详情
pytorch笔记:ddpg(datawhale代码解读)(代码片段)
理论部分可见:强化学习笔记:双延时确定策略梯度(TD3)_UQI-LIUWJ的博客-CSDN博客源代码路径:easy-rl/codes/DDPGatmaster·datawhalechina/easy-rl(github.com)1task0.py1.1库导入importsys,osimportdatetimeimportgymimporttorchfro 查看详情
尚硅谷_java零基础教程(集合collection:list,set;map)--学习笔记(代码片段)
Java集合一、Java集合框架概述1.理解2.集合框架涉及到的API二、Collection接口中的方法三、Iterator迭代器接口1.理解2.主要方法3.foreach四、Collection子接口一:List接口1.概述2.List接口的常用实现类3.接口方法五、Collection子接口二ÿ... 查看详情
datawhale9月组队学习task03复杂查询(代码片段)
datawhale9月组队学习task03复杂查询preparation文章目录datawhale9月组队学习task03复杂查询一.视图1.何为视图2.视图VS表3.Whyneed视图4.Howtocreate视图基于单表的视图基于多表的视图5.Howtoalter视图结构6.Howtoupdate视图内容7.Howtodelete视图二.子查... 查看详情
尚硅谷_java零基础教程(常用类——string)--学习笔记(代码片段)
JavaString一、String1、String的特性2、String对象的创建3、字符串对象是如何存储的?4、字符串拼接细节5、String使用陷阱6、String的常用方法7、String与基本包装类的转换8、StringBuffer和StringBuilder的介绍一、String1、String的特性String... 查看详情
吃瓜教程——datawhale10月组队学习
datawhale的十月组队学习——吃瓜教程task01:概览西瓜书+南瓜书第1、2章第一章绪论1、机器学习的一些符号定义(结合林轩田的机器学习)X:样本空间Y:输出空间A:算法合集D:数据集f:理想目标函数g:近似目标函数2、根据训练数据是否... 查看详情
吃瓜教程——datawhale10月组队学习
datawhale的十月组队学习——吃瓜教程task01:概览西瓜书+南瓜书第1、2章第一章绪论1、机器学习的一些符号定义(结合林轩田的机器学习)X:样本空间Y:输出空间A:算法合集D:数据集f:理想目标函数g:近似目标函数2、根据训练数据是否... 查看详情
datawhales深入浅出pytorch-第三章/第四章(代码片段)
【DataWhales】深入浅出Pytorch-第三章/第四章第三章:Pytorch的主要组成模块3.1神经网络学习机制和深度学习在实现上的特殊性3.1.1神经网络学习机制3.1.2深度学习在实现上的特殊性3.2PyTorch深度学习模块第四章基础实战——FashionMN... 查看详情
黑马程序员java教程学习笔记(代码片段)
学习视频:https://www.bilibili.com/video/BV1Cv411372m如侵权,请私信联系本人删除文章目录黑马程序员Java学习笔记(二)数组概述数组定义方式一、访问、注意事项数组定义方式二,元素默认值规则数组遍历、元素求... 查看详情