0基础学it,月薪过万,来黑马程序员
黑马程序员,成就it黑马
java
java特点:Java特点和优点_语言 (sohu.com)
最大的优势是与平台无关Windows9x、WindowsNT、Solaris、Linux、MacOS同样的代码可以在其他平台上使用。一次写,到处运行的特点高可移植性在互联网上得到了广泛的应用。
java和C 对比
即java的新特性
1) 程序员不需要在程序中分配和释放内存,这些可怕的内存分配错误不会再打扰你;
2) 去除了C 其他方法可以弥补语言中令人费解和容易出错的指针;
3) 避免赋值语句(如a=3)与逻辑运算句(如a==3)的混淆;
4) 多重继承的复杂设施已被取消。
解释语言效率低,速度慢;编译语言效率高,速度快。
java是解释性语言,C 是编译语言,
go是编译语言,【go具有垃圾回收功能的静态强型、编译型、并发型编程语言。
和go对比,对go的了解
go是09年公开发布,其创始人之一创造了Unix还有系统和C语言UTF-8编码
Go的编码是Utf-8
、、、、、、、应用和实施这些领域或行业。
图标
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-BmzFEckv-1647592964110)(java.assets/image-20210830162458019.png)]
套接字
一套网络传输API,本质上,流可以用于网络
7层,也就是说,只要你在网上传输数据,你就必须通过这7层 层的
物理层
数据链路层:转换信号
网络层
传输层-udp、tcp
会话层、应用层、表示层
这些都是后三层的协议
http,ftp,pop3,SMTP,这两个是在邮件中使用的
重点是传输层(要学)
IP地址:在网络中标记主机,ipv4,
已经有ipv6地址了。
当万物互联时,ipv6也不够用了
所以推出了ipv9了,
平时上网,用ip地址是动态分配的,也就是说,这个网站是这个网站,下次可以改变。IP地址的利用率
一般来说,它使用动态ip,都是公用的
静态ip费用太贵
ip地址标记主机,端口号标记程序,
端口:计算机与外界互动的媒介,
端口号:0-65535
部分被计算机内部占用,
被浏览器占用的80端口号,
一般来说,0-1024被计算机内部占用,
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-vq8Z7qpD-1647592964111)(java.assetsimage-20210617182402040.png)]
记忆IP地址比较麻烦,所以域名出现了
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-Cy0owmOK-1647592964112)(java.assetsimage-20210617182431490.png)]
域名倒着看,一级:com
二级baidu
有时会加。cn(也是一级域名)
去掉cn,然后一级域名表示分类
com表示商业网站,
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-64ap7PWO-1647592964112)(java.assetsimage-20210617182710996.png)]
二级是公司的具体名称,三级是其分类,百度新闻
dns分析服务器:j将域名和ip地址对应,输入域名时,会先到dns首先将服务器分析相应的ip,然后顺着ip找到这个地址,每个网络都会有一个dns默认情况下,每台电脑都会有一个微型分析服务器dns,全球互联网上会有公告dns
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-ZZcadebD-1647592964112)(java.assetsimage-20210617183311028.png)]
当你输入域名,然后你的电脑dns会对其进行解析,然后如果没有找到,那么就会向上请求,到你电脑所链接的局域网中寻找,如果还是没有找到,继续向上请求寻找,一直没找到,。最后可能是该网址你写错了
,当你找到它时,你会告诉你的下属dns,然后没有地址dns会刷新保存dns,每一个dns都会存起来,刷新一下,下次找的时候就不用往上找了,因为这台机器存起来了
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-88AiKWDK-1647592964113)(java.assetsimage-20210617183730544.png)]
反射
在web中会用得到
udp
不建立基于流的连接,不可靠,
依靠网络传输,
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-cqXOTTpc-1647592964113)(java.assetsimage-20210617192258230.png)]
视频聊天
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-Su9ydBEc-1647592964113)(java.assetsimage-20210617193902208.png)]
idea添加异常,使用alt enter
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-h66tqrPf-1647592964113)(java.assetsimage-20210617193929782.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-y3oDFKXr-1647592964114)(java.assetsimage-20210617193951549.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-cuQXzBes-1647592964114)(java.assetsimage-20210617195936177.png)]
接收端
package com.itheima; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPReceiverDemo { public static void main(String[] args) throws IOException { //创建套接字对象,绑定端口号 DatagramSocket ds = new DatagramSocket(8090); //准备数据包, DatagramPacket dp =new DatagramPacket(new byte[1024],1024); //接收数据 ds.receive(dp); //关流,这是非常耗费流量的,所以用完一定要关闭 ds.close(); 我们不需要从数据包中分析数据,因此,需要获得长度 ///获取数据包的底层数组 byte[] bs = dp.getData(); //获取数据的实际大小 int len=dp.getLength(); System.out.println(new String(bs,0,len)); ///获取发送主机的地址 System.out.println(dp.getAddress()); ///获取发送主机的端口号 System.out.println(dp.getPort()); } }
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-ooDT24ua-1647592964114)(java.assetsimage-20210617200623005.png)]
发送端
package com.itheima; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class UDPSenderDmo { public static vid main(String[] args) throws IOException {
//创建一个udp套接字对象
DatagramSocket ds = new DatagramSocket();
//准备数据包,并将数据放入数据包中
DatagramPacket dp = new DatagramPacket("hello~~~".getBytes(),"hello~~~".getBytes().length,
new InetSocketAddress("localhost",8090));
//发送数据包
ds.send(dp);
//关流
ds.close();
}
}
先运行接收端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qswOtekj-1647592964115)(java.assetsimage-20210617200722845.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bu2Gb2AX-1647592964115)(java.assets/image-20210618131833609.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98GsFWOY-1647592964115)(java.assets/image-20210618132352898.png)]
udp分发送端和接收端
tcp分客户端和服务器端
tcp三次握手
客户端发起连接,
服务器端接收连接
客户端再次发起连接
tcp不进行封包,没有数据包的概念,所以只能用流来传输数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHq3Ca8U-1647592964116)(java.assets/image-20210618191008704.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Me4n6q7C-1647592964116)(java.assets/image-20210831152107683.png)]
IDE就是编译器
继承extend
黑马程序员全套Java教程_Java基础入门教程,零基础小白自学Java必备教程_哔哩哔哩_bilibili
1.1 继承概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RePAowQP-1647592964116)(java.assets/image-20210716133150883.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Em2fG9DX-1647592964116)(java.assets/image-20210716133321039.png)]
继承就是提取出多个类中共有的属性和方法,然后提取,作为父类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGfyHXBb-1647592964117)(java.assets/image-20210716133402701.png)]
面向对象三大特征:封装、继承、多态。
面向对象的三大基本特征,五大基本原则 - 风之之 - 博客园 (cnblogs.com)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjSUkAia-1647592964117)(java.assets/image-20210716133437512.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hj98dE5E-1647592964117)(java.assets/image-20210716133644804.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cr1krdB6-1647592964118)(java.assets/image-20210716133635231.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ghtThCgh-1647592964118)(java.assets/image-20210716133728936.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dE5uCvYD-1647592964118)(java.assets/image-20210804003259641.png)]
重写父类方法,需要加override
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPcyZmSV-1647592964118)(java.assets/image-20210804003412604.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzUbjCmI-1647592964119)(java.assets/image-20210804003423094.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvDIvjaG-1647592964119)(java.assets/image-20210716133743670.png)]
1.2 继承的好处和弊端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0BtQuqJm-1647592964119)(java.assets/image-20210716133945350.png)]
【继承的好处】:
-
使子类具有父类的属性和方法,还可以在子类中重新定义,追加方法和属性。
-
子类在访问成员方法和变量的时候,都是一样的顺序,先找子类,再找父类
-
子类重写父类方法的时候,需要加@Override
-
子类根本不可能重写父类的私有方法。
-
子类不可以多继承,但是可以多层继承。
-
比如儿子继承父亲,父亲继承爷爷,即儿子拥有爷爷属性
1.3 继承中【变量】的访问特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OoZgcKkK-1647592964119)(java.assets/image-20210716134318759.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-06EUKikH-1647592964120)(java.assets/image-20210716134418973.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0T3VuGaS-1647592964120)(java.assets/image-20210716134513863.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l239gMoA-1647592964120)(java.assets/image-20210716134555464.png)]
换个写法:
package demo;
class FU{
//年龄
public int age=40;
}
class ZI extends FU{
public int height = 175;
public int age=20;
public void show(){
int age=30;
System.out.println(age);
System.out.println(height);
}
}
public class DEMO {
public static void main(String[] args) {
ZI Z=new ZI();
Z.show();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9xbftE6-1647592964120)(java.assets/image-20210804103130421.png)]
1.4 super
this代表的本类的成员变量的访问
super可以访问父类中的成员变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEb1Rz8X-1647592964121)(java.assets/image-20210716135036570.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAc4KOzG-1647592964121)(java.assets/image-20210804103900423.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bg8tgcZK-1647592964121)(java.assets/image-20210804103910976.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aezjgjtH-1647592964121)(java.assets/image-20210716135302619.png)]
1.5 继承中构造方法的访问特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFRC1ay1-1647592964122)(java.assets/image-20210716140125577.png)]
父类:
package com.itheima_04;
public class Fu {
/*
public Fu() {
System.out.println("Fu中无参构造方法被调用");
}
*/
public Fu() {}
public Fu(int age) {
System.out.println("Fu中带参构造方法被调用");
}
}
子类:
package com.itheima_04;
public class Zi extends Fu {
public Zi() {
// super(); 这个是默认会有的
// super(20);
System.out.println("Zi中无参构造方法被调用");
}
public Zi(int age) {
// super();
// super(20);
System.out.println("Zi中带参构造方法被调用");
}
}
测试类
package com.itheima_04;
/*
测试类
*/
public class Demo {
public static void main(String[] args) {
//创建对象
Zi z = new Zi();
Zi z2 = new Zi(20);
}
}
1.6 继承中【成员方法】的访问特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21uFTJ0Q-1647592964122)(java.assets/image-20210716140536275.png)]
父类:
package com.itheima_05;
public class Fu {
public void show() {
System.out.println("Fu中show()方法被调用");
}
}
子类:
package com.itheima_05;
public class Zi extends Fu {
public void method() {
System.out.println("Zi中method()方法被调用");
}
public void show() {
super.show();
System.out.println("Zi中show()方法被调用");
}
}
测试类:
package com.itheima_05;
/*
测试类
*/
public class Demo {
public static void main(String[] args) {
//创建对象,调用方法
Zi z = new Zi();
z.method();
z.show();
//报错
// z.test();
}
}
1.7 super内存图
链接:内存过程讲解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTTXYO96-1647592964122)(java.assets/image-20210716140800699.png)]
1.8 方法重写(添加@Override)
package com.itheima_06;
/*
手机类
*/
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
}
}
重写父类方法的时候,很容易把方法写错,为了帮助大家检验这个东西,添加@Override,这个说明,下面的内容是重写的父类,这个注解,可以帮助我们了解方法声明的准确性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KM8Uayts-1647592964122)(java.assets/image-20210716141916000.png)]
package com.itheima_06;
/*
新手机
*/
public class NewPhone extends Phone {
/*
public void call(String name) {
System.out.println("开启视频功能");
// System.out.println("给" + name + "打电话");
super.call(name);
}
*/
@Override
public void call(String name) {
System.out.println("开启视频功能");
// System.out.println("给" + name + "打电话");
super.call(name);
}
}
package com.itheima_06;
/*
测试类
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象,调用方法
Phone p = new Phone();
p.call("林青霞");
System.out.println("--------");
NewPhone np = new NewPhone();
np.call("林青霞");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJZQEOzs-1647592964123)(java.assets/image-20210716142019150.png)]
1.9 方法重写的注意事项
子类根本不可能重写父类的私有方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2FCdQuD-1647592964123)(java.assets/image-20210716142649184.png)]
也就是说,如果父类是“默认”,那么子类就得用public
package com.itheima_07;
public class Fu {
private void show() {
System.out.println("Fu中show()方法被调用");
}
/*
public void method() {
System.out.println("Fu中method()方法被调用");
}
*/
void method() {
System.out.println("Fu中method()方法被调用");
}
}
package com.itheima_07;
public class Zi extends Fu {
/*
@Override
private void show() {
System.out.println("Zi中show()方法被调用");
}
*/
/*
@Override
public void method() {
System.out.println("Zi中method()方法被调用");
}
*/
@Override
public void method() {
System.out.println("Zi中method()方法被调用");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BO8rxAov-1647592964123)(java.assets/image-20210716142738544.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iIE3pGuA-1647592964124)(java.assets/image-20210716142812340.png)]
1.10 Java中【继承的注意事项】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8f8mjc7-1647592964124)(java.assets/image-20210716142925606.png)]
但是可以多层继承。
比如儿子继承父亲,父亲继承爷爷,即儿子拥有爷爷属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rv8m9JU5-1647592964124)(java.assets/image-20210716143059711.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KlT1ZGN-1647592964124)(java.assets/image-20210716143133359.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtGBCo4z-1647592964125)(java.assets/image-20210716143141981.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSgK7tNe-1647592964125)(java.assets/image-20210716143156744.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgLIgX2g-1647592964125)(java.assets/image-20210716143213776.png)]
extend继承,创建一个类的子类
implement是实现,可以实现多个接口
extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。这样的好处是:架构师定义好接口(这里的接口是指父类的成员函数和变量),让工程师实现就可以了。整个项目开发效率和开发成本大大降低。
JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了。实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。
class A extends B implements C,D,E
一个类通过关键字implements声明自己使用一个或者多个接口。
在类的声明中,通过关键字extends来创建一个类的子类。
class 子类名 extends 父类名 implenments 接口名
{…
}
若同时用到 extends 和 implements 的时候,extends 必须放在 implements 关键字之前。
说的很好:
Java 继承 | 菜鸟教程 (runoob.com)
java只能单继承,不能多继承
从已有的类派生出新的类,称为继承。
在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,。
因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。
继承是 Java 中实现软件重用的重要手段,避免重复,易于维护,。
super 表示使用它的类的父类。super 可用于:
- 调用父类的构造方法;
- 调用父类的方法(子类覆盖了父类的方法时);
- 访问父类的数据域(可以这样用但没有必要这样用)。
调用父类的构造方法语法:
super();
或
super(参数列表);
注意:super 语句必须是子类构造方法的第一条语句。不能在子类中使用父类构造方法名来调用父类构造方法。 父类的构造方法不被子类继承。调用父类的构造方法的唯一途径是使用 super 关键字,如果子类中没显式调用,则编译器自动将 super(); 作为子类构造方法的第一条语句。这会形成一个构造方法链。
静态方法中不能使用 super 关键字。
调用父类的方法语法:
super.方法名(参数列表);
如果是继承的方法,是没有必要使用 super 来调用,直接即可调用。但如果子类覆盖或重写了父类的方法,则只有使用 super 才能在子类中调用父类中的被重写的方法。
implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
this 和super的区别
this 代表本类对应的引用
Super 代表父亲存储空间的标识(可以理解为父亲引用)可以操作父亲 的成员
使用方法:
A:调用成员变量
·this.成员变量 调用本类的成员变量
·super.成员变量 调用父类的成员变量
B:调用构造方法
·this(…) 调用本类的成员变量
C:调用成员方法
·this.成员方法 调用本类的成员方法
继承:
public class zi extends fu{
//重写父类方法
}
多态
1.1 多态概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWkzDyWs-1647592964125)(java.assets/image-20210722130822704.png)]
package com.itheima_01;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package com.itheima_01;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_01;
/*
多态:
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,(猫既是猫,也是动物)这就是多态
多态的前提和体现
有继承/实现关系
有方法重写
有父类引用指向子类对象
*/
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
Animal a = new Cat(); //这就体现出多态了
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKra4Zrj-1647592964126)(java.assets/image-20210804111331187.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FJS8QQV-1647592964126)(java.assets/image-20210804111342875.png)]
1.2 多态中成员访问特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eIp7fr5Q-1647592964126)(java.assets/image-20210722131945402.png)]
package com.itheima_02;
public class Animal {
public int age = 40;
public void eat() {
System.out.println("动物吃东西");
}
}
package com.itheima_02;
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
}
package com.itheima_02;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
Animal a = new Cat();
System.out.println(a.age);
// System.out.println(a.weight);
a.eat();
// a.playGame(); 这个不能调用,会报错
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMkVlpVG-1647592964126)(java.assets/image-20210804112209386.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDnglFQz-1647592964127)(java.assets/image-20210804112241153.png)]
这就引出了,接下来的多态的好处和弊端了
1.3 多态的好处和弊端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNTB6dHV-1647592964127)(java.assets/image-20210722132828917.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCF1zH0A-1647592964127)(java.assets/image-20210722135404586.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gGAReyyT-1647592964127)(java.assets/image-20210722135515202.png)]
其实也是多继承
package com.itheima_03;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package com.itheima_03;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
//创建动物操作类的对象,调用方法
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
Pig p = new Pig();
ao.useAnimal(p);
}
}
package com.itheima_03;
/*
动物操作类
*/
public class AnimalOperator {
/*
public void useAnimal(Cat c) { //Cat c = new Cat();
c.eat();
}
public void useAnimal(Dog d) { //Dog d = new Dog();
d.eat();
}
*/
public void useAnimal(Animal a) {
//Animal a = new Cat();
//Animal a = new Dog();
a.eat();
// a.lookDoor();
}
}
package com.itheima_03;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_03;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void lookDoor() {
System.out.println("狗看门");
}
}
package com.itheima_03;
public class Pig extends Animal {
@Override
public void eat() {
System.out.println("猪吃白菜");
}
}
1.4 多态中的转型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tONNzJpo-1647592964128)(java.assets/image-20210722141145777.png)]
这个可以帮助我们实现使用子类的特有功能
多态中访问成员方法,编译看左边,访问看右边
package com.itheima_04;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package com.itheima_04;
/*
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
*/
public class AnimalDemo {
public static void main(String[] args) {
//多态
Animal a = new Cat(); //向上转型
a.eat();
// a.playGame();
/*
//创建Cat类的对象
Cat c = new Cat();
c.eat();
c.playGame();
*/
//向下转型
Cat c = (Cat)a;
c.eat();
c.playGame();
}
}
package com.itheima_04;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
}
1.5 多态转型内存图解
多态转型内存图解(对于这种堆和栈,建议看视频)
案例:多态版猫和狗
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clFLLpxX-1647592964128)(java.assets/image-20210722141946509.png)]
package com.itheima_06;
public 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 void eat() {
System.out.println("动物吃东西");
}
}
package com.itheima_06;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
//创建猫类对象进行测试
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
a = new Cat("加菲", 5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
}
}
package com.itheima_06;
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_06;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WqxaY1T-1647592964128)(java.assets/image-20210724110410955.png)]
抽象类
1.1 抽象类概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUv5EthB-1647592964129)(java.assets/image-20210727154032011.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzO28Hqr-1647592964129)(java.assets/image-20210727154707886.png)]
package com.itheima_01;
public abstract class Animal {
/*
public void eat() {
System.out.println("吃东西");
}
*/
public abstract void eat();
//没有方法体
}
package com.itheima_01;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
/*
Animal a = new Animal(); //抽象类不能创建对象
a.eat();
*/
}
}
1.2 抽象类的特点
抽象类参照多态的形式创建对象,既然是多态,那么就要有继承,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11BqCGXA-1647592964129)(java.assets/image-20210727155345431.png)]
package com.itheima_02;
/*
抽象类
*/
public abstract class Animal {
//抽象方法
public abstract void eat();
public void sleep() {
System.out.println("睡觉");
}
}
package com.itheima_02;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_02;
public abstract class Dog extends Animal {
}
package com.itheima_02;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
// Animal a = new Animal();
Animal a = new Cat();
a.eat();
a.sleep();
}
}
1.3 抽象类的成员特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0QsVyE8-1647592964130)(java.assets/image-20210727160853553.png)]
package com.itheima_03;
/*
抽象类
*/
public abstract class Animal {
private int age = 20;
private final String city = "北京";
public Animal() {}
public Animal(int age) {
this.age = age;
}
public void show() {
age = 40;
System.out.println(age);
// city = "上海";
System.out.println(city);
}
public abstract void eat();
}
package com.itheima_03;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_03;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.show();
}
}
案例:抽象类版猫和狗
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hs166prS-1647592964130)(java.assets/image-20210727161251567.png)]
package com.itheima_04;
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();
}
package com.itheima_04;
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
//创建对象,按照多态的方式
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
System.out.println("--------");
a = new Cat("加菲",5);
System.out.println(a.getName()+","+a.getAge());
a.eat();4
}
}
package com.itheima_04;
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_04;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
接口
1.1 接口概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAigApLf-1647592964130)(java.assets/image-20210720092156512.png)]
接口是一种公共的规范,只要符合该规范,都可以使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdDxsU7K-1647592964130)(java.assets/image-20210720092357218.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eONtRdOa-1647592964131)(java.assets/image-20210720092411056.png)]
类实现接口,而不是继承接口,所以用implement,而不是extend
接口的实例化,采用多态的形式
抽象类可以不重写
1.2 接口的特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kd4D53A-1647592964131)(java.assets/image-20210720094131488.png)]
接口是一个抽象的内容,主要是对行为进行抽象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVmBEzbN-1647592964131)(java.assets/image-20210720095431375.png)]
定义一个接口
package com.itheima_01;
/*
定义了一个接口
*/
public interface Jumpping {
//定义了一个抽象方法
public abstract void jump();
}
实现接口
package com.itheima_01;
//类实现接口
public class Cat implements Jumpping {
@Override
public void jump() {
System.out.println("猫可以跳高了");
}
}
这个是不想重写jupping中的方法,那么就要继续用abstract关键字,然后这个类就变成了抽象类,抽闲类在实现接口的时候,可以不重写方法,但是其子类在继承的时候,还是要重写接口中的方法
package com.itheima_01;
public abstract class Dog implements Jumpping {
//如果实现类不想重写jupping中的方法,那么就使用abstract关键字,那么这个类就变成了抽象类,抽象类在实现接口的时候,可以不重写方法,但是其子类在继承的时候,还是要重写接口中的方法
}
测试类,就是用多态的方式,进行实例化,然后
package com.itheima_01;
/*
测试类
*/
public class JumppingDemo {
public static void main(String[] args) {
// Jumpping j = new Jumpping(); //接口不能这样被实例化
Jumpping j = new Cat(); //采用多态的方式进行实例化,使用他的实现类对象,进行实例化
j.jump();
}
}
1.3 接口的成员特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MaUxGL7i-1647592964131)(java.assets/image-20210727164858726.png)]
接口里面没有成员变量,默认是常量,因为成员变量被final修饰,所以只有常量
接口中的变量是常量
//接口里面不能有构造方法,因为接口主要是对行为进行抽象
所有的类都直接或者间接继承Object类,如果说一个类没有父类,那么object类就是其父类
如果说一个类有父类,那么 这个类就间接的继承Object类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1K7C2hZP-1647592964132)(java.assets/image-20210727164430458.png)]
因为Object就只有这一个构造方法,所以说,所有的构造方法,默认访问父类的都是无参构造,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7QKvzHJ-1647592964132)(java.assets/image-20210727164659177.png)]
案例:接口版猫和狗
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tql1djM4-1647592964132)(java.assets/image-20210727165120664.png)]
1.4 类和接口的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAufEwyG-1647592964133)(java.assets/image-20210728001429795.png)]
1.5 抽象类和接口的区别
黑马程序员全套Java教程_Java基础入门教程,零基础小白自学Java必备教程_哔哩哔哩_bilibili
抽象类和接口的区别_dd_Mr的博客-CSDN博客
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXMPAEhF-1647592964133)(java.assets/image-20210728221955650.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azUpKBLL-1647592964133)(java.assets/image-20210728222058063.png)]
当添加报警器后,但不是所有门都有报警器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rc9NU9qK-1647592964133)(java.assets/image-20210728222151212.png)]
所以说,将接口和抽象类结合起来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SEasdif-1647592964134)(java.assets/image-20210728223539120.png)]
案例:运动员和教练
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJbc22BU-1647592964134)(java.assets/image-20210728231211680.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlyDYvwD-1647592964134)(java.assets/image-20210728231430878.png)]
这个案例用了9个文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBf7C1qu-1647592964134)(java.assets/image-20210729004138643.png)]
1 形参和返回值【参数传递】
1.1 类名作为形参和返回值
基本数据类型作为形参和返回值就不讨论了,
主要讨论的是引用类型作为形参和返回值,类,抽象类,接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3GQUhXj-1647592964135)(java.assets/image-20210729005910150.png)]
1、类名作为方法的形参
方法的形参是类名,其实需要的是该类的对象
实际传递的是该对象的【地址值】
2、类名作为方法的返回值
方法的返回值是类名,其实返回的是该类的对象
实际传递的,也是该对象的【地址值】
package itheima;
class Cat{
public void eat(){
System.out.println("猫吃鱼");
}
}
class CatOperator{
public void useCat(Cat c){ //Cat c = new Cat()?
c.eat();
}
public Cat getCat(){
Cat c=new Cat();
return c;
}
}
public class CatDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
CatOperator co=new CatOperator();
Cat c=new Cat();
co.useCat(c);
Cat c2= co.getCat(); //new Cat()
c2.eat();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWy4TWd9-1647592964135)(java.assets/image-20210729145729480.png)]
1.2 抽象类名作为形参和返回值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4xWg1qvO-1647592964135)(java.assets/image-20210729010022093.png)]
package itheima2;
//抽象动物类,并创建吃的方法
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class AnimalOperator{
public void useAnimal(Animal a){
//Animal a = new Cat()? 抽象类名作为参数时,需要的是子类作为实参数
a.eat();
}
public Animal getAnimal(){
Animal a=new Cat();
return a;
}
}
public class AnimalDemo {
public static void main(String[] args) {
AnimalOperator ao=new AnimalOperator();
Animal a=new Cat(); //编译看左边,执行看右边
ao.useAnimal(a);
Animal a2 = ao.getAnimal(); //new Cat(); 这个返回的是个猫对象,如果想要调用吃,那么就得调用猫
a2.eat();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s1J7xbZY-1647592964136)(java.assets/image-20210729151711939.png)]
1.3 接口名作为形参和返回值(理解)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQZoNndT-1647592964136)(java.assets/image-20210729162313148.png)]
package itheima3;
//接口中的成员方法,只能是抽样方法
//public interface Jumpping{
interface Jumpping{
// public abstract void jump(); //默认修饰符
void jump();
}
class JumppingOperator{
public void useJumpping(Jumpping j){
//形参是个接口,然后这个接口的j可以调用方法jump(),说明这个j是个对象,而接口是不能直接实例化的
//所以这是按照多态的形式创建的对象,要的是该接口的实现类对象 ,从而有了下面的cat类,用来实现这个接口
j.jump();
}
public Jumpping getJumpping(){
Jumpping j=new Cat(); //多态的形式创建对象
return j; //接口不能实例化,所以,返回的是实现类的 对象
}
}
class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("猫可以跳高");
}
}
//接口作为形参和返回值
public class JumppingDemo {
public static void main(String[] args) {
//创建操作类对象,并调用方法
JumppingOperator jo=new JumppingOperator();
Jumpping j=new Cat(); //多态的形式创建对象
jo.useJumpping(j);
Jumpping j2=jo.getJumpping(); //new Cat()
j2.jump();
}
}
2 内部类
2.1 内部类的基本使用(理解)
生活中案例:比如笔记本和cpu,笔记本看作是外部类,cpu看作是内部类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sniyx4Dp-1647592964136)(java.assets/image-20210730111627708.png)]
/*
内部类访问特点: 内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
*/
public class Outer {
private int num=10;
//内部类
public class Inner{
public void show(){
System.out.println(num); //内部类可以直接访问外部类的成员,包括私有
System.out.println("内部类的函数");
}
}
public void method(){
Inner i=new Inner();
i.show(); // 外部类要访问内部类的成员,必须创建对象
}
package itheima4;
/*
内部类访问特点: 内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
*/
public class Outer {
private int num=10;
//内部类
public class Inner{
public void show(){
System.out.println(num); //内部类可以直接访问外部类的成员,包括私有
System.out.println("内部类的函数");
}
}
public void method(){
Inner i=new Inner();
i.show(); // 外部类要访问内部类的成员,必须创建对象
}
public static void main(String[] args) {
Outer o =new Outer();
o.method(); //通过外部类调用内部类的函数
//可不可以直接通过内部类调用内部类的函数呢,可以
Outer myOuter = new Outer();
Outer.Inner myInner = myOuter.new Inner();
System.out.println("-------");
myInner.show();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqg6fFWm-1647592964136)(java.assets/image-20210730111513881.png)]
2.2 成员内部类(理解)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZFx72oW-1647592964137)(java.assets/image-20210730221003757.png)]
成员内部类:是类的成员
局部内部类:就是指在类的方法里面的类
class Outer{
private int num=10;
public class Inner{ //成员内部类
public void show(){
System.out.println(num);
}
}
}
public class InnerDemo {
public static void main(String[] args) {
Outer.Inner inner=new Outer().new Inner();
inner.show();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rbEbnQd-1647592964137)(java.assets/image-20210730220013800.png)]
上面的例子,一般来说,是不常见的,因为定义内部类的目的就是为了不让外面轻而易举的看到,所以一般用private修饰内部类,而不用public
一般采用,创建一个外部类方法,然后该方法会创建一个内部类对象,然后用这个方法来调用内部类对象
package itheima6;
class Outer{
int a=10;
private class Inner{
public void show(){
System.out.println(a);
}
}
public void method(){
Inner inner=new Inner();
inner.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
Outer outer=new Outer();
outer.method();
}
}
2.3 局部内部类(理解)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3saLiUCZ-1647592964137)(java.assets/image-20210730221259810.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRWOveUA-1647592964138)(java.assets/image-20210730222115391.png)]
package itheima6;
class Outer{
private int num = 20;
public void method(){
int num2=20;
class Inner{
public void show(){
System.out.println(num);
System.out.println(num2);
}
}
Inner i=new Inner();
i.show();
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer outer=new Outer();
outer.method();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrqkssJt-1647592964139)(java.assets/image-20210730222341956.png)]
2.4 匿名内部类(应用)
我们的类是class开头,但是匿名内部类是new开头的
这个匿名内部类可以是一个类或者是一个接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hi2m9ccm-1647592964139)(java.assets/image-20210731094434707.png)]
匿名内部类,本质是,这个类是抽象类居多
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKdG4gwL-1647592964139)(java.assets/image-20210731090324824.png)]
示例1
package itheima9;
interface Inter{
void show();
}
class Outer {
public void method(){
//这就是一个匿名内部类
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
}
}
public class OuterDemo{
public static void main(String[] args) {
Outer o=new Outer();
o.method();
}
}
不会调用show方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrDeomNU-1647592964139)(java.assets/image-20210731095734229.png)]
package itheima9;
interface Inter{
void show();
}
class Outer {
public void method(){
//这就是一个匿名内部类
//这样写仅仅是一个对象
// new Inter(){
// @Override
// public void show() {
// System.out.println("匿名内部类");
// }
// };
// 这样写就是对象调用了方法
/* new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
//调用两次,就再复制一份
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
*/
//多次调用的方式
Inter i= new Inter(){ //按照多态的形式,这个对象Inter一定是接口的实现类对象或者或者是类的子类对象
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show(); //编译看左边,执行看右边
i.show(); //多次调用
}
}
public class OuterDemo{
public static void main(String[] args) {
Outer o=new Outer();
o.method();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZEJ2a6X-1647592964140)(java.assets/image-20210731100137352.png)]
2.5 匿名内部类在开发中的使用(应用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qUWJKBgT-1647592964140)(java.assets/image-20210731101139957.png)]
如果一个方法的参数是接口名,那么他实际要的是接口的实现类对象,
可以省去一些不需要的对象
package itheima8;
/**
* 跳高接口
*/
interface Jumpping{
void jump();
}
/**
* 实现接口
*/
class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("猫可以跳高");
}
}
class Dog implements Jumpping{
@Override
public void jump() {
System.out.println("狗可以跳高");
}
}
/**
* 接口操作类,里面有一个方法,方法的参数是接口名
*/
class JumppingOperator{
public void method(Jumpping j){
j.jump();
}
}
public class JumppingDemo {
public static void main(String[] args) {
//需求:创建接口操作类对象,调用method方法
JumppingOperator jo=new JumppingOperator();
Jumpping j=new Cat();
jo.method(j);
Jumpping j2=new Dog();
jo.method(j2);
//。。。
//如果有很多动物,那么就很冗余,匿名内部类可以很好的解决
System.out.println("---------");
//匿名内部类,可以简化操作
jo.method( //这个方法要的是一个接口,其实是接口的实现类对象,
//而匿名内部类的格式他的本质就是实现类对象,并且是实现了该接口的对象,
new Jumpping() { //这个就和猫完全没有关系,把猫删了也可,
//所以,采用后面这两种形式,不需要多写两个类出来,
@Override
public void jump() {
System.out.println("猫可以跳高");
}
}
);
jo.method(new Jumpping() {
@Override
public void jump() {
System.out.println("狗可以跳高");
}
});
}
}
package InnerClassDemo;
/**
* 匿名内部类的本质,就是对接口或者类的实现或者继承
* 1,定义一个接口,【对于接口来说,如果要实现接口,那么就要实现接口中的所有方法,这样对吗?】
* 2,实现接口,创建小狗,小猫,实现接口中的方法
* 3,接口操作类,创建,里面的参数是接口名
*/
interface Jumpping{
public void jump();
}
class Dog implements Jumpping{
@Override
public void jump(){
System.out.println("小狗跳");
}
}
class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("小猫跳");
}
}
class JumppingOperator{
public void Operator(Jumpping j){
j.jump();
}
}
public class AnonymousInnerClass {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
//如果想要调用接口操作类的方法,就需要一个接口Jumpping的实现类,所以需要传递一个对象
//但是这个对象可以用匿名内部类来实现,这样就不用频繁创建,狗,猫等对象
Jumpping j=new Cat();
Jumpping j1=new Dog();
jo.Operator(j);
jo.Operator(j1);
/**
* 匿名内部类本质上是对接口或者类的实现或者继承
*/
jo.Operator(new Jumpping() {
@Override
public void jump() {
System.out.println("匿名内部类之实现狗蹦");
}
});
jo.Operator(new Jumpping() {
@Override
public void jump() {
System.out.println("匿名内部类之实现猫跳");
}
});
}
}
/**
* 匿名内部类的好处:不用频繁创建类和对象,对于一些需要传值的东西,直接写即可。
*/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1QnsFJbZ-1647592964140)(java.assets/image-20210917180205982.png)]
String
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8aSKNyM-1647592964141)(java.assets/image-20210626222755435.png)]
package com.itheima_02; /* String构造方法: public String():创建一个空白字符串对象,不含有任何内容 public String(char[] chs):根据字符数组的内容,来创建字符串对象 public String(byte[] bys):根据字节数组的内容,来创建字符串对象 String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc 推荐使用直接赋值的方式得到字符串对象 */ public class StringDemo01 { public static void main(String[] args) { //public String():创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //输出:null //public String(char[] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //输出abc //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 byte[] bys = {97, 98, 99}; String s3 = new String(bys); System.out.println("s3:" + s3); //输出:979899,猜错了,,, //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc String s4 = "abc"; System.out.println("s4:" + s4); //输出:abc } }