java | (六)面向对象(2)匿名对象、方法的重载、封装和隐藏、构造器、权限、packet和import

匿名对象

理解:创建对象时,没有显式地赋予一个变量名,即匿名对象
特征:匿名对象只能调用一次

package com.atguigu.exer;

public class Text {
	public static void main(String[] args) {
		Phone p = new Phone();
		System.out.println(p);
		
		new Phone().sendEmail();
		new Phone().price = 109;
		new Phone().showPrice();
	}
}

class Phone{
	double price;//价格
	
	public void sendEmail() {
		System.out.println("发邮件");
	}
	
	public void showPrice() {
		System.out.println("价格为:" + this.price);
	}
}

结果
在这里插入图片描述
也可以这样用:

class phoneMall{
	public void show(Phone phone) {
		phone.sendEmail();
	}
}


phoneMall phoneM= new phoneMall();
phoneM.show(new Phone());

方法的重载

在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可
如:
sort(int a)
sort(int a,int b)
sort(String a)

package com.atuguigu.java1;
public class OverLoad {
	//反转数组
	public void reverse(int[] arr) {
		for(int i = 0;i < arr.length/2;i++) {
			int temp = arr[i];
			arr[i] = arr[arr.length-i-1];
			arr[arr.length-i-1]  = temp;
			
		}
		
	}
	
	public void reverse(double[] arr) {
		for(int i = 0;i < arr.length/2;i++) {
			double temp = arr[i];
			arr[i] = arr[arr.length-i-1];
			arr[arr.length-i-1]  = temp;
		}
		
	}
}

在调用时:

package com.atuguigu.java1;

public class OverLoadText {
	public static void main(String[] args) {
		OverLoad o = new OverLoad();
		int[] a = new int[] {1,2,4,56,7,8,9};
		double[] b = new double[] {0.4,0.8,434.23,45.32,34.90};
		o.reverse(a);
		o.reverse(b);
		for(int i = 0;i < a.length;i++) {
			System.out.println(a[i]);
		}
		System.out.println();
		for(int i = 0;i < b.length;i++) {
			System.out.println(b[i]);
		}
	}
}

a和b是两种不同的数组类型,但通过重载便可调用相同方法

可变个数形参的方法
可变个数形参的格式:数据类型…变量名
当调用可变个数形参的方法是,传入的参数个数可以是 ,0个,1个,2个。。。(使用方法跟数组一样)
可变形参的方法与本类中的方法名相同,形参不同的方法之间构成重载
可变个数形参在方法中必须声明在末尾
可变个数形参在方法的形参中,最多只能声明一个

package com.atuguigu.java1;
public class OverLoad {
	public void show(int a) {
		System.out.println(23);
	}
	
	public void show(String s) {
		System.out.println("String s");
	}
	
	public void show(String ... strs) {//必须写在public void show(String s) 后面(最末尾)
		System.out.println("String...strs");
	}
}

package com.atuguigu.java1;

public class OverLoadText {
	public static void main(String[] args) {
		OverLoad tLoad = new OverLoad();
		tLoad.show(122);//23
		tLoad.show("43");//String s
		tLoad.show("343","ew");//String...strs
	}
}

值传递机制

参数是基本数据类型,实参赋给形参的是实参真实存储的数据值
参数是引用数据类型:实参赋给形参的是实参存储数据的地址值

例子:画以下内存图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题:

(1)
在这里插入图片描述

package com.atuguigu.java1;
public class Circle {
	double radius;
	
	public double findArea() {
		return Math.PI * this.radius * this.radius;
	}
}

package com.atuguigu.java1;

public class PassObject {
	public void printAreas(Circle c,int time) {
		System.out.println("Radius" + "\t" + "Area");
		for(int i = 1;i <= time;i++) {
			c.radius = i;
			System.out.println(i+"\t" + c.findArea());
		}
		
	}
}

package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		Circle c = new Circle();
		PassObject p = new PassObject();
		p.printAreas(c,4);
	}
}

结果:
在这里插入图片描述
(2)递归:求100的和:

package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		MainFunction f = new MainFunction();
		int sum =  f.DiGui(100);
		System.out.println(sum);
	}
	
	public int DiGui(int i) {
		if(i == 1) {
			return i;
		}else {
			return i + DiGui(i-1);
		}
	}
}

(3)
在这里插入图片描述

package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		MainFunction f = new MainFunction();
		int result =  f.DiGui(10);
		System.out.println(result);//10497
	}
	
	public int DiGui(int i) {
		if(i == 0) {
			return 1;
		}else if(i == 1){
			return 4;
		}else {
			return 2*DiGui(i-1) + DiGui(i-2);
		}
	}
}

(4)
在这里插入图片描述

package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		MainFunction f = new MainFunction();
		int n = 10;
		int result =  f.DiGui(n);
		for(int i = 1;i <= n;i++) {
			System.out.println(f.DiGui(i));
		}
	}
	
	public int DiGui(int i) {
		if(i == 1 || i ==2) {
			return 1;
		}else {
			return DiGui(i-1) + DiGui(i-2);
		}
		
	}
}

封装和隐藏

程序设计追求“高内聚,低耦合”
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅对外暴露少量的方法用于使用

封装性的体现:我们将列的属性私有化(private),同时提供公共的(public)方法获取(getXXX)和设置(setXXX)
不对外暴露的私有方法
单例模式…

package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		Amimal a = new Amimal();
		a.name = "大象";
		a.age = 2;
		//a.legNum = 4; //报错:The field Animal.legNum is not visible
		a.setLegNum(90);
		a.show();
	}
}

class Amimal{
	String name;
	int age;
	private int legNum;//腿的个数
	
	public void setLegNum(int l) {
		//需要在赋值加入限制条件,只能在方法中进行
		if(l >= 0 && l % 2 ==0) {
			this.legNum = l;
		}else {
			legNum = 0;
		}
	}
	
	public int getLegNum() {
		return legNum;
	}
	
	public void show() {
		System.out.println("age:" + age + ",name:" + name + ",legNum:" + legNum);
	}
}

权限修饰符

封装性的体现,需要权限修饰符来配合
四种,大到小:public,protect,缺省,private
在这里插入图片描述

构造器
作用:创建对象、初始化对象的属性

package com.atuguigu.java1;

public class Person {
	private int age;
	String name;
	
	//构造器
	public Person() {
		System.out.println("Person().....");
	}
	
	public Person(String n) {
		this.name = n;
	}
	
	public Person(String n,int age) {
		this.name = n;
		this.age = age;
	}
	
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int a) {
		if(age < 0 || age > 130) {
			System.out.println("can't");
			return;
		}else {
			this.age = a;
		}
	}
}


package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		Person person = new Person();
		System.out.println(person.getAge());
		
		person.setAge(23);
		System.out.println(person.getAge());
		
		Person p2 = new Person("张三");//初始化对象的属性:名字为张三
		System.out.println(p2.name);
		
		Person p3 = new Person("李四",4);
		System.out.println(p3.getAge());
	}
	
}

结果:
在这里插入图片描述

任何的类都有构造器
说明:
如果没有显式的定义的构造器的话,则系统默认提供一个空参的构造器
定义构造器的格式:全新啊修饰符 类名(形参列表){}
一个类中定义的多个构造器,彼此构成重载
一旦我们显式的定义了类的构造器后,系统就不再提供默认的空参构造器
一个类中至少有一个构造器

练习
在这里插入图片描述

package com.atuguigu.java1;
//三角形的类
public class TriAngle {
	private double base;//底边长
	private double height;//高
	
	public double getBase() {
		return base;
	}
	public void setBase(double b) {
		this.base = b;
	}
	
	public double getHeight() {
		return this.height;
	}
	public void setHeight(double h) {
		this.height = h;
	}
	
	public TriAngle(double base,double height) {
		this.base = base;
		this.height = height;
	}
	
	public double getArea() {
		return this.base*this.height/2;
	}
	
}
package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		TriAngle triAngle = new TriAngle(4.5, 5);//11.25
		System.out.println(triAngle.getArea());
	}
	
}

属性赋值的先后顺序
1、默认初始化
2、显式初始化
3、构造器中初始化
4、通过“对象.方法”或“对象.属性”的方式赋值

javaBean

是一种java语言写成的可重用组件
符合以下表尊:类是公共的,有一个无参的公共构造器,有属性且对应get、set方法

用户可以使用JavaBean将功能、处理、值、数据库访问和其它任何可以用java代码创造的对象进行打包,并且其他的开发者可以用通过内部JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。

UML类图

在这里插入图片描述

关键字:this

可以用来修饰属性、方法、构造器;
this理解为当前对象;
在类的方法中,可以用“this.属性”或“this.方法”调用,通常可以省略,但方法形参和类的属性同名,必须用“this.变量”(在构造器中,传入的形参同理);

this调用构造器:
在类的构造器当中,可以显式的使用“this(形参列表)”方式,调用本类中指定的其他构造器,构造器不能通过this(形参列表)来调用自己;
如果一个类中有n个构造器,则最多有n-1构造器使用this(形参列表);
规定:“this(形参列表)”必须声明在当前构造器首行;
构造器内部,最多只能声明一个this(形参列表)

package com.atuguigu.java1;
//三角形的类
public class People {
	private int id;
	private String name;
	
	public void eat() {
		System.out.println("eating");
	}
	
	public People() {
		this.eat();
	}
	
	public People(int id) {
		this();//相当于调用了构造器People(){}
		this.id = id;
	}
	
	public People(int id,String name) {
		this(id);//相当于调用了构造器People(id){}
		this.name = name;
		
	}
	
}
package com.atuguigu.java1;

public class MainFunction {
	public static void main(String[] args) {
		People p1 = new People(23,"chen");//output:eating
	}
	
}

*例子:
*在这里插入图片描述

package com.study.java1;

import com.sun.org.apache.bcel.internal.generic.I2F;

public class Boy {
	private String name;
	private int age;
	public Boy() {
		System.out.println("我被创建了!");
	}
	
	public Boy(String name) {
		this();
		this.name = name;
	}
	
	public Boy(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	
	public void marry(Girl girl) {
		System.out.printf("marry with %s",girl.getName());
	}
	
	public void shout() {
		if(this.age>22) {
			System.out.println("可以去登记了");
		}else {
			System.out.println("可以去工地了");
		}
	}
}

package com.study.java1;

public class Girl {
	private String name;
	private int age;
	
	public Girl(){
		System.out.println("我被创建出来了!");
	}
	
	public Girl(String name) {
		this();
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public void marry(Boy boy) {
		System.out.printf("Marry with %s",boy.getName());
	}
	
	public int compare(Girl girl) {
		if(this.age > girl.age) {
			return 1;
		}else if(this.age < girl.age) {
			return -1;
			
		}else {
			return 0;
		}
	}
	
}
package com.study.java1;

public class mainFuction {
	public static void main(String[] args) {
		Boy boy = new Boy("张三");
		Girl girl = new Girl("陈");
		Girl girl2 = new Girl("白");
		
		girl.marry(boy);
		
	}
}

结果:
在这里插入图片描述

package

方便管理,提出包概念,命名规则“xxxxxyyyy”,见名知义
每“."一下,代表一层目录
同一个包下不能命名同名接口和类,不同包下可以同名接口或类

import

导入,在源文件中,显式的使用import结构导入指定包下的类、接口,声明在包和类之间。
使用“xxx.*"结构,表示可以导入xxx包下的所有结构。
如果使用的类或接口属于java.lang或本包下定义的,可以省略import
如果在源文件中使用了不同包下的同名的类,则必须至少有一个用全命名的形式。
import static:导入指定类或接口中的静态结构

写在后面

趁着b站现在崩掉,导致我无法观看后面的视频,来说几句。
本人于7月5日入职,做机械的岗位,然后当晚决定自学java,尝试转行(其实意愿很大),到如今有一周多了,每天六点起床,学一个小时多,然后就去工厂上班了,晚上下班,近七点回到宿舍继续学,十二点上床,避免影响第二天的工作(毕竟拿了钱,工作还是要认真)。在毕业之前,我都不敢想象我会有今天这种生活状态,不过心态也在第一天就转变过来了,口号之类的话就不说了,希望能保持健康的身体来完成接下来的学习,共勉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个基于Java的Socket模拟以太网帧的封装和传输的示例代码: ```java import java.io.IOException; import java.net.*; public class EthernetFrameSimulator { public static void main(String[] args) { try { // 创建一个Socket对象 DatagramSocket socket = new DatagramSocket(); // 设置目标地址和端口号 InetAddress address = InetAddress.getByName("192.168.0.1"); int port = 1234; // 构造数据 byte[] data = "Hello, World!".getBytes(); // 构造以太网帧 byte[] frame = new byte[14 + data.length]; // 目标MAC地址 frame[0] = (byte) 0xff; frame[1] = (byte) 0xff; frame[2] = (byte) 0xff; frame[3] = (byte) 0xff; frame[4] = (byte) 0xff; frame[5] = (byte) 0xff; // 源MAC地址 frame[6] = (byte) 0x11; frame[7] = (byte) 0x22; frame[8] = (byte) 0x33; frame[9] = (byte) 0x44; frame[10] = (byte) 0x55; frame[11] = (byte) 0x66; // 以太网类型 frame[12] = (byte) 0x08; frame[13] = (byte) 0x00; // 数据部分 System.arraycopy(data, 0, frame, 14, data.length); // 构造数据报 DatagramPacket packet = new DatagramPacket(frame, frame.length, address, port); // 发送数据报 socket.send(packet); // 关闭Socket socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用了Java的DatagramSocket类来创建一个Socket对象,并设置目标地址和端口号。然后,我们构造了一个包含数据的数据部分,并将其封装在一个以太网帧中。最后,我们使用DatagramPacket类构造一个数据报,并通过Socket对象发送它。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值