day02_java基础加强(jdk新特性 javaa设计模式 反射)
1.Tcp协议发送数据
java.net.ConnectException: Connection refused: connect 连接被拒绝
public class Client {
public static void main(String[] args) throws Exception{
//1.创建socket的实例
Socket socket = new Socket(InetAddress.getByName("192.168.126.26"),9999);
String data = "tcp我来了";
//2.返回此套接字的输出流。通过输出流向服务器发送数据
socket.getOutputStream().write(data.getBytes());
//3.关闭socket
socket.close();
}
}
public class ServerClient {
public static void main(String[] args) throws Exception{
//1.创建serversocket对象
ServerSocket ss = new ServerSocket(9999);
//2.侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 这个对象其实就是发送端的socket对象
Socket socket = ss.accept();
//3.获取客户端发送的数据 要使用输入流
InputStream is = socket.getInputStream();
//4.把数据读取出来
int len =0;
byte buf[] = new byte[1024];
while((len = is.read(buf))!=-1){
String str = new String(buf,0,len);
System.out.println("服务器:"+str);
}
ss.close();
}
}
2.客户端发送数据 数据来自键盘录入
public class Client {
public static void main(String[] args) throws Exception{
//1.创建socket的实例
Socket socket = new Socket(InetAddress.getByName("192.168.126.26"),9999);
// String data = "tcp我来了";
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String data = scanner.nextLine();
//1.1 当用户输入的是886 跳出while循环
if ("886".equals(data)) {
break;
}
//2.返回此套接字的输出流。通过输出流向服务器发送数据
socket.getOutputStream().write(data.getBytes());
}
scanner.close();
//3.关闭socket
socket.close();
}
}
3.文件上传核心逻辑
public class Client {
public static void main(String[] args) throws Exception{
//1.创建socket的实例
Socket socket = new Socket(InetAddress.getByName("192.168.126.26"),9999);
//2.先读取abc.txt文件内容
FileInputStream fis = new FileInputStream("abc.txt");
int len=0;
byte buf[] = new byte[1024];
while((len=fis.read(buf))!=-1){
//2.返回此套接字的输出流。通过输出流向服务器发送数据
socket.getOutputStream().write(buf, 0, len);
}
fis.close();
//3.关闭socket
socket.close();
}
}
public class ServerClient {
public static void main(String[] args) throws Exception{
//1.创建serversocket对象
ServerSocket ss = new ServerSocket(9999);
//2.侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 这个对象其实就是发送端的socket对象
Socket socket = ss.accept();
//3.获取客户端发送的数据 要使用输入流
InputStream is = socket.getInputStream();
FileOutputStream fos =new FileOutputStream("abcd.txt");
//4.把数据读取出来 并写到指定文件中
int len =0;
byte buf[] = new byte[1024];
while((len = is.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.close();
ss.close();
}
}
4.枚举(1.5)
package com.itheima.enumtest;
//普通类 来模拟枚举功能 模拟星期
//枚举只能是固定的几个实例
public abstract class WeekDay {
//1.构造方法私有化
private WeekDay(){}
//2.自己创建几个实例 {}代表通过该类的子类完成实例化 就是实现父类为实现的方法
public static WeekDay mon = new WeekDay(){
@Override
public WeekDay nextDay() {
return sun;
}
};
public static WeekDay sun = new WeekDay(){
@Override
public WeekDay nextDay() {
return mon;
}
};
//3.定义一个方法 nextDay //Perosn
/*public WeekDay nextDay(){
if (this == mon) {
return sun;
}else if (this == sun) {
return mon;
}else {
return null;
}
}*/
//4.为了简化if else 语句 我这样定义
public abstract WeekDay nextDay();
//3.默认打印实例 打印地址 重写toString方法 alt + shift + s
@Override
public String toString() {
if (this == mon) {
return "mon";
}else if (this == sun) {
return "sun";
}else{
return "";
}
}
}
public enum Weekday {
// 这个成员默认是静态:
SUN, MON(2), TUE, WED, THRI, FRI(50), SAT;
// 1.定义构造方法
private Weekday() {
System.out.println("1111");
}
//2.定义一个带参数的构造方法
private Weekday(int day) {
System.out.println("22222");
}
}
public enum TrafficLamp {
RED{
@Override
public TrafficLamp nextLamp() {
return TrafficLamp.GREEN;
}
},GREEN{
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},YELLOW{
@Override
public TrafficLamp nextLamp() {
return TrafficLamp.RED;
}
};
//定义下一个灯
public abstract TrafficLamp nextLamp();
}
5.单例设计模式
//想保证student对象在内存中只有一个实例
//单例设计模式分类 饿汉式 懒汉式
public class Student {
//1.构造方法私有化
private Student(){}
//2.自己创建一个实例 李四
private static Student s = new Student();
//3.对外提供一个获取实例的方法
public static Student getStudent(){
return s;
}
}
public class Teacher {
//1.构造方法私有化
private Teacher(){}
//2.自己先不创建 先声明
private static Teacher t;
//3.提供一个方法获取teacher的实例 t1 t2 t3
public synchronized static Teacher getTeacher(){
if (t == null) {
t = new Teacher();
}
return t;
}
}
6.工厂设计模式
//定义一个猫类
public class Cat extends Anim{
//提供一个吃的方法
public void eat() {
System.out.println("鱼");
}
}
//定义一个狗 类
public class Dog extends Anim{
//提供一个吃的方法
public void eat() {
System.out.println("肉");
}
}
//抽象一个动物类 提供一个吃的方法
public abstract class Anim {
public abstract void eat();
}
//这个类就负责猫和狗的创建
public class AnimFactory {
//1.不需要提供new对象的方式获取工厂的实例 所以构造方法私有化
private AnimFactory(){};
//2.对外提供一个创建猫和狗实例的方法 参数代表 获取动物的类型
public static Anim getAnim(String type) {
if ("dog".equals(type)) {
return new Dog();
}else if ("cat".equals(type)) {
return new Cat();
}else {
return null;
}
}
}
7.模板设计模式
public abstract class GetTime {
//获取一段逻辑执行需要的时间 这个方法相当于是一个计算时间的模板
public long getCodeTime(){
//1.获取当前系统的时间
long startTime = System.currentTimeMillis();
code(); //具体要计算 的业务逻辑让子类去实现
//2.在获取一下系统时间
long endTime = System.currentTimeMillis()-startTime;
return endTime;
}
public abstract void code();
}
public class GetForTime extends GetTime {
@Override
public void code() {
//1.1 算出 for循环 需要多长时间
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}
}
public class GetCopyVideoTime extends GetTime {
@Override
public void code() {
//这里写拷贝视频的逻辑
//1.2 算出拷贝一段视频需要多长时间
try {
FileInputStream fis = new FileInputStream("test.avi");
FileOutputStream fos = new FileOutputStream("copy.avi");
//流对接操作
int len =0;
byte[] buf = new byte[1024];
while((len=fis.read(buf))!=-1){
fos.write(buf, 0, len);
}
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
8.适配器设计模式
public interface User {
public void add();
public void del();
public void update();
public void query();
}
public class Adapter implements User {
@Override
public void add() {
}
@Override
public void del() {
}
@Override
public void update() {
}
@Override
public void query() {
}
}
public class UserImp2 extends Adapter {
@Override
public void add() {
super.add();
}
}
9. 装饰设计模式
public interface Phone {
public void call();
}
public abstract class BaseDecorate implements Phone {
//子类在装饰的时候 要保证有基本的通话功能
private Phone p;
public BaseDecorate(Phone p){
this.p = p;
}
@Override
public void call() {
this.p.call();
}
}
public class MusicDecorate extends BaseDecorate {
public MusicDecorate(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("手机可以听音乐了");
}
}
public class TestPhone {
public static void main(String[] args) {
//1.手机可以通话了
Iphone iphone = new Iphone();
iphone.call();
System.out.println("-------------");
//2.对手机进行装饰 加彩铃 播放音乐 播放视频 不管对手机怎么装饰 都要保证电话的基本功能
RingDecorate ringDecorate = new RingDecorate(iphone);
ringDecorate.call();
System.out.println("---------***----");
//3.对iphone继续装饰 加音乐
MusicDecorate musicDecorate = new MusicDecorate(iphone);
musicDecorate.call();
}
}
10.Class介绍
public class TestClass {
public static void main(String[] args) throws Exception{
String str = "abc";
//1.获取str 对应的Class对象
Class class1 = str.getClass();//补充:需要写实例,麻烦
//2.类名.class 只要是在java中你能想到的任何类型 都会有一份字节码对象
Class class2 = String.class;//还需要引个包
//3.Class.forName(); 获取Class对象
Class class3 = Class.forName("java.lang.String");//所以一般用这个
System.out.println(class1 == class2);
System.out.println(class2 == class3);
}
}
11.反射
//获取带私有的构造方法
private static void method2() throws Exception{
//1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取person类中所有的构造方法
Constructor[] declaredConstructors = class1.getDeclaredConstructors();
//3.遍历
for (Constructor constructor : declaredConstructors) {
System.out.println(constructor);
}
}
//alt + shift + M 快速抽取一个方法 获取person类中构造方法 不包含私有的
private static void method1() throws ClassNotFoundException {
//1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取person类中所有的构造方法
Constructor[] constructors = class1.getConstructors(); //私有获取不到
//3.遍历数组
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
}
//获取person类中 public Person(){};
private static void method3() throws Exception{
//1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取 public Person(){};构造方法 参数:可变参数
Constructor constructor = class1.getConstructor(); //这个类的实例就代表构造方法
//3.通过构造方法获取person的实例
Object object = constructor.newInstance();
System.out.println(object);
}
//获取person类中单个带参构造方法并且实例化
private static void method4() throws Exception{
//1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取 public Person(String name,int age,String address);
Constructor constructor = class1.getConstructor(String.class,int.class,String.class);
//3.通过构造方法获取person的实例
Object object = constructor.newInstance("zhaowei",20,"沙河");
System.out.println(object);
}
//获取person类中私有的构造方法
private static void method5() throws Exception{
//1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取私有的构造方法 private Person(String name)
Constructor constructor = class1.getDeclaredConstructor(String.class);
//3.暴力反射 其实就是调用一个方法 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查
constructor.setAccessible(true);
//3.通过构造方法获取person的实例
Object object = constructor.newInstance("柳岩");
System.out.println(object);
}
// 获取所有的属性 包括私有的
private static void method2() throws Exception{
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
// 2.获取person类中所有的属性
Field[] declaredFields = class1.getDeclaredFields();
//3.遍历
for (Field field : declaredFields) {
System.out.println(field);
}
}
// 获取person类中所有的属性
private static void method1() throws Exception {
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
// 2.获取person类中所有的属性 (不要考虑私有)
Field[] fields = class1.getFields();
// 3.遍历
for (Field field : fields) {
System.out.println(field);
}
}
//获取person类中address属性并且
private static void method3() throws Exception{
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName("com.itheima.classtest.Person");
//2.获取address属性并且使用 参数:获取哪个属性
Field field = class1.getField("address");
//3.通过构造方法获取person的实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
System.out.println("---"+obj);
//3.给address属性赋值 参数1:代表person的实例
field.set(obj, "上海");
System.out.println(obj);
}
1.枚举:(具体见day2——4)
2.单例设计模式:(day2——5)
3.工厂设计模式:(day2——6)
4.模板设计模式:
5.适配器设计模式:
6.反射:
day02_java基础加强(jdk新特性 javaa设计模式 反射)相关推荐
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- Java基础之Java8 新特性
hp实训8.19_Java基础之Java8新特性 // 信息展示方法 ,接口中,就可以提供一种实现. 就可以使用这种功能.default void print() {System.out.printl ...
- Java基础语法96-Java91011新特性
Java基础语法96-Java9&10&11新特性 一.java9新特性 一. JDK 和 JRE 目录结构的改变 bin 目录 包含命令行开发和调试工具,如javac,jar和jav ...
- java 10新_【Java基础】Java10 新特性
Java10 新特性 局部变量类型推断 局部变量的显示类型声明,常常被认为是不必须的. 场景一:类实例化时.在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器. 场 ...
- 【JAVA基础】java基础之-java8新特性
写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...
- ES6基础-字符串的新特性
字符串的新特性 1. es6新增遍历接口:for...of循环遍历 2. 模版字符串: 使用``号对字符串进行原格式输出 可以使用trim()方法进行取消换行 模版字符串潜入变量,需要将变量名写在${ ...
- 【JavaSE】JDK新特性(二)————接口新特性,函数式接口(Suppier,Comsumer,Predicate,Function)
文章目录 1.接口新特性 1.1 接口组成更新概述 1.2 接口中的默认方法 1.3 接口中的静态方法 1.4 接口中的私有方法 2. 函数式接口 2.1 函数式接口概述 2.2 函数式接口作为方法的 ...
- 前端基础之ECMAScript新特性
目录 介绍 发展标准 ES6(ES2015) 类(Class) 箭头函数(Arrow function) 函数参数默认值(Function parameter defaults) 模板字符串(Temp ...
- 夯实基础,Java8新特性Stream详细教程
1 基本特性 Java8的API中添加了一个新的特性: 流,即stream.stream是将数组或者集合的元素视为流,流在管道中流动过程中,对数据进行筛选.排序和其他操作. 1.1 流的特性 stre ...
最新文章
- 【必备】VSCode开发Angular的必备插件
- 小程序客服自动回复图片,云开发的实现
- 若依微服务版前端怎样在接口返回500时去掉一直弹窗提示服务未找到
- declare begin end 中if怎么写_习语系列第45期:”未雨绸缪“英语怎么说?
- CAN总线技术 | 物理层01 - CAN信号电平
- gson java 对象_Gson把json串转换成java实体对象
- 【欧洲已死】李开复:欧洲人工智能毫无希望
- NBA Top Shot巨鲸17.5万美元购买的球星卡目前已值2000万美元
- 现代化多媒体教室的计算机系统,多媒体教室系统建设方案
- 18.事件基础,event对象,clientX,clientY,keyCode
- 分享C#实现XML和实体序列化和反序列化的代码
- Hyper-V 3.0 - 关于存储迁移的一些说明
- sap crystal reports(水晶报表) 2016 SP7中文破解版
- Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)Call Stack
- 全国计算机联合考试广西二级c语言近五年试题,计算机二级c语言试题
- 静默安装Oracle19c软件与数据库
- word护眼模式使用方法
- 《Natural Language Processing with Python》读书笔记 001期
- 代码发布前后的注意事项
- MySQL中的insert ignore into讲解