首页 > 编程语言 >一个demo学会java

一个demo学会java

时间:2023-03-13 10:32:28浏览次数:52  
标签:java name demo 学会 接口 printf new public



全栈工程师开发手册 (作者:栾鹏)

快捷链接:
​java开发大全

这篇demo较长,包含了java基本的内容,若不是出于校验自己java基础能力的朋友,建议按照上面的链接分章节学习。本demo包含了java的数组、对象、对象属性、接口,面向对象,重载,多态、封装、字符串、正则表达式、函数、参数、容器、算法、线程、异常等方面的知识,可以全面检验你的java学习效果。

此demo包括文件:测试文件index.java和接口interface1.java、接口interface2.java、基类Student.java、派生类Monitor.java文件

Student.java实现了一个java基类

//static int var=10;                                //java禁止使用全局数据
//一个包可以包含多个类,类默认访问修饰符为包访问,每个文件只能有一个public类,类只能是包访问或public
public class Student implements Comparable<Student>{ //implements继承接口关键字,Comparable<Student>类比较接口
public static void main(String[] args) {} //每个类中都可以有一个main函数,用于调试

public Student(){ //不接受任何参数的叫默认构造器,没定义构造器,编译器会自动创建
this("student",12); //通过this仅能调用一个构造器,必须将构造器调用置于起始处
getname(); //构造器会调用成员函数和数据,所有在初始化构造器前会初始化成员数据
printf("基类无参构造器");
}
public Student(String name,int age){ //有参构造器
this.age = age;this.name = name;
printf("基类有参构造器"+name);
}
public Student(String name,Character...args){ //可变参数列表args是一个参数数组,重载方法中应只有一个可变参数列表,编译器
this.name = name;
printf("基类变参构造器"); //args[0]表示变参中的第一个参数
}
public void setname(String name){this.name=name;printf("基类设置名称:"+name);} //this表示对当前对象的引用
public String getname(){printf("基类获取名称"+name);return name;} //使用public方法实现对private数据的控制,保证类内数据安全
void setage(int age){printf("基类设置名称"+age);this.age=age;}
private int getage(){return age;} //private属于final方法

static long time=10; //所有类型数据均可在定义时初始化,数据均有默认值,所有类的静态数据最先初始化
private int age=0; //private外部不可以访问
String name = "student"; //不加访问修饰符,默认为包访问

public enum allsex{man,woman} //枚举类型,等价于类内组合class allsex{man,woman},枚举类型可以有构造函数,有几个枚举实例就调用几次构造函数
class Sextype{ //内部类,在内部类声明为static时为嵌套类,嵌套类不属于对象,而属于类名
public void setsex(allsex sextype){ //枚举类型,可作为变量,相当于const
printf("设置内部类性别");
switch (sextype) { //枚举类型用在switch中,用于限制参数的可选项
case man:sexstring="boy";break;
case woman:sexstring="girl";break;
default:break;
}
}
public Student getStudent(){
sexstring+=name; //内部类,嵌套类可以任意访问外部类数据,无论嵌套多少层
return Student.this; //返回外部类引用,当内部类是static时,内部类不存在对外部类的引用
}
private String sexstring;
}
public static <T> void printf(T str) //泛型方法,
{
System.out.println(str.toString()); //System.out.println打印输出
}


//重写equals虚函数,java中除了static和final都是虚函数,(private属于final方法)
public final boolean equals(Student another){ //final标记的函数不能被派生类重写
printf("比较了两个基类");
if(this.age==another.age && this.name==another.name)
return true;
return false;
}
//垃圾回收器准备收回对象占用内存时执行,java虚拟机并未面临内存耗尽的情形不会浪费时间执行垃圾回收,(垃圾回收:停止-复制,标记-清扫)
public void finalize(){
printf("基类对象"+name+"内存被收回");
}
void dispose(){
printf("基类对象"+name+"清理函数");
}

@Override
public int compareTo(Student arg0){ //要实现排序,必须要实现的比较接口
return age<arg0.age?-1:(age==arg0.age?0:1); //返回-1表示小于,0不表示等于,1表示大于
}

}





//一个文件可以包含多个类,但是文件名必须和public类名相同,否则只能使用默认的包访问权限
abstract class Teacher{ //abstract关键字表示为抽象类
abstract void setname(); //abstract抽象方法
public String getname(){return name;} //使用public方法实现对private数据的控制,保证类内数据安全
String name="teacher"; //不加修饰符默认为报访问
}

Interface1.java定义了一个接口

public interface Interface1{                            //interface接口声明,完全抽象类
abstract void init1(); //abstract抽象方法,接口自动是public的,接口中,不能定义函数体,只能声明,abstract可以不写
class manclass implements Interface1{ //接口内部类自动是public和static的。属于嵌套类,接口内部类实现接口函数,为了创建接口所有不同实现的公共代码
@Override
public void init1() {
System.out.println("接口内部类,实现公共代码");
}

}
}

Interface2.java实现了一个派生接口

public interface Interface2<A> extends Interface1{            //接口也支持继承,接口可以多继承,extends后可以有多个子接口,接口可以嵌套在类中<A>泛型接口
abstract void init2(A name); //abstract抽象方法,接口自动是public的
void init1(); //接口重写了函数

int DEFAULT_GAE =12; //接口中的任何域都是自动的static和final的,static final使用大写风格
String DEFAULT_NAME ="name";

}

Monitor.java文件实现了一个继承自Student,并继承自Interface1和Interface2的派生类

import java.util.EnumSet;


final class Monitor<T> extends Student implements Interface1,Interface2<String>{ //<>泛型,extends继承类,implements继承接口,final终态类,不能再被继承
Monitor(){ //派生类无参构造器
super("monitor");printf("派生类无参构造器"); //关键字super显示调用基类构造器,printf调用基类函数
} //构造前会调用父类无参构造函数,如果父类没有构造函数,则会默认生成。如果有构造函数(无参),则会调用无参构造函数。如果只有有参构造函数,必须显示调用
Monitor(int age){printf("派生类有参构造器");} //派生类有参构造器,
static Student mysStudent = new Student("monitor",12); //静态数据初始化只在调用时刻才会进行,在第一次创建类对象或者第一次访问静态数据时最先被初始化
final static Student student1; //final用于,保持引用不变,对象可变
static Student student2;
static{ //静态块,仅执行一次,对象创建或静态数据访问时执行,仅定义对象的话不执行
student1 = new Student();
student2 = new Student();
printf("派生类静态块执行");
}
//重写函数的返回类型可以是基类型的派生类型,访问权限必须大于原访问权限,子类抛出异常小于等于父类方法抛出异常
public String getname(){ //重写虚函数不需要关键字,因为在java中除了static和final都是虚函数(private属于final方法)
printf("派生类获取名称:"+name); //
//name = super.name+"的派生"; //super代表基类
return name;
}
public int getage(){return 11;} //private不能重写,派生类重名,覆盖了基类私有方法


String name="monitor"; //同名变量和静态函数,不能动态绑定到基类引用上,和基类数据存储在不同的区域
String task ="帮助老师管理班级";

private T a; //设置泛型,也可以使用原始基类Object
public T getT(){return a;} //设置泛型函数,泛型会自动擦除传递过来的对象的类信息
public void setT(T a){this.a=a;printf("派生类设置泛型变量");}

public enum Group{ //枚举类型,函数枚举
SHUXUE{void action(){printf("数学");}},
YINGYU{void action(){printf("英语");}},
YUNWEN{void action(){printf("语文");}};
abstract void action(); //每个枚举元素要实现的函数
}

EnumSet<Group> allgroup=EnumSet.of(Group.SHUXUE,Group.YINGYU); //EnumSet枚举集合,EnumMap枚举映射
public void printfgroup(){
for(Group g:allgroup)
g.action();
}


@Override
public void init2(String name) { //泛型接口
printf("派生类实现接口2初始化函数");
}
@Override
public void init1() {
printf("派生类实现接口1初始化函数,或接口2初始化函数");
}

}

index.java文件实现了所有知识点的测试。

import java.io.ByteArrayInputStream;
import java.lang.reflect.Executable;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.Stack;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.prefs.Preferences;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.List;

import javax.naming.InitialContext;

public class index implements Runnable{ //Runnable多线程,任务接口,如果类不是抽象类,必须实现接口函数,可以创建Thread的派生类,Callable<>有返回值的线程接口

static String stringtemp; //类内共享变量
public static void main(String[] args)
{

printf("===========基类相关操作==============");
Preferences prefs=Preferences.userNodeForPackage(index.class); //Preferences只能存放基本类型和字符串的键值对
prefs.put("default_name", "student"); //Preferences用作属性配置
prefs.putInt("default_age", 12);
Student.time+=Student.time<<2+0x21^26; //静态数据,可以铜鼓类型访问,<<位左移动,低位补0,^按位异或,0X表示16进制
Student student1=new Student(); //所有的对象都必须通过new来创建,基本数据类型可以定义创建
student1.name = student1.name+1; //访问类内数据,字符串+重载
student1.setage(-2*-6); //通过类内函数访问类数据,一元减号用于转变数据的符号
Student.Sextype student1_sextype = student1.new Sextype(); //创建内部类,必须通过外部类变量new构造
student1_sextype.setsex(Student.allsex.man); //调用枚举类型
Student student2=student1; //仅是复制引用,两个变量名指向同一块内存
if(student1==student2) //==和!=只是比较对象的引用,不比较对象内容
if(student1.equals(student2)) //对象的比较实用equals,比较对象的实际内容,但是定义类的equals默认行为还是比较引用,要在自定义类中重写equals函数
//if(1) //非布尔值不能用在逻辑表达式中
printf("创建了两个相同的类引用");

Field[] fileds = student1.getClass().getDeclaredFields(); //反射获取对象类的属性
try{ //尝试运行代码
for(Field field:fileds){
if(!field.isAccessible())
field.setAccessible(true); //设置对象属性可读取
Object obj=field.get(student2); //从实例对象中获取字段属性的值,(私有的没法获取,数值或对象统一为对象,没有值返回的)
}
}
catch (Exception e) {
printf("错误内容:"+e.toString()); //catch函数在try出错时调用,exception是所有异常类的基类,异常类可以捕获派生类异常
e.printStackTrace(System.out); //堆轨迹,出错原因和位置
//throw e; //抛出异常,停止运行
}
finally{ //finally函数总要执行
printf("finally函数总要执行");
}





printf("===========派生类相关操作==============");
Monitor monitor1 =new Monitor(Interface2.DEFAULT_GAE); //基类构造函数(绑定后函数),派生类成员,派生类构造函数,接口中的域相当于枚举常量
monitor1.name = "monitor1"; //基类静态-派生类静态-基类私有-基类构造-派生类私有-派生类构造。函数在构造前已经存在
printf("===========11111111111111111==============");
sprintf(monitor1,null); //可变参数,null为参数为空
sprintf(monitor1); //传递实现接口的类,向上转型为接口,实现函数回调
printf("===========2222222222222222==============");
Student student3 = new Monitor(); //基类引用,派生类对象
student3.getname(); //调用引用动态绑定的方法
((Monitor)student3).getage(); //向下转型成功,getage为派生类的公共函数


printf("===========接口相关操作==============");
Interface1 interface1=new Monitor(); //向上转型,interface1是基类,普通类,接口,无所谓,实现接口的类(包括内部类),都可以向上转型转化为接口
interface1.init1(); //调用动态绑定的函数
interface1=getInterface1(); //通过匿名内部类实现接口函数的实现
interface1.init1();


printf("===========容器相关操作==============");
//Collection接口,独立元素序列(List接口,Set接口,Queue接口)
//List接口,插入顺序保存数组,(ArrayList数组,LinkedList链表)
//Set接口,不能重复元素,(HashSet散列函数,TreeSet红黑树,LinkedHashList链表下的散列)
//Queue接口,先进先出队列,(LinkedList链表,PriorityQueue优先级队列)

//Map接口,键值对(字典,映射),HashMap(快速访问),TreeMap(键值排序),LinkedHashMap(保持元素插入顺序,通过散列提供快速访问)
//list整体赋值,Arrays.asList方法返回的ArrayList是继承自AbstractList,不可变大小数组,作为参数生成可变大小的ArrayList
List<String> allname = new ArrayList<String>(Arrays.asList("小明","小红","晓刚","小刘")); //ArrayList实现向上转型为list接口,动态连续数组,<>内的对象类型可以不写,不能是基本,<>内类型擦除,编译器无法获取,
allname.set(2,"小刚"); //list元素赋值
if(!allname.contains("小王")) //元素包含
allname.add("小王"); //添加元素
allname.remove(0); //删除元素
stringtemp=allname.get(1); //读取元素
Iterator<String> iterator = allname.iterator(); //集合的迭代器,next为首个元素的迭代器,ListIterator迭代器更厉害
iterator.next(); //指向第一个元素
iterator.remove(); //删除迭代器的对应元素,删除可以继续使用此元素的迭代器了
while(iterator.hasNext()) //迭代器是否有一下个元素
printf(iterator.next()); //获取序列的下一个元素

Stack<String> allname1 = new Stack<String>(); //stack先进后出堆栈,各种队列和栈基于LinkedList链表实现
LinkedList<String> allname2 = new LinkedList<String>(); //双端队列,队列
Set<String> allname3 = new HashSet<String>(); //不重复集合
Map<String,String> map = new HashMap<String,String>(); //或者是SortedMap
map.put("小明", "12");
Object x_name = map.get("小明");
Iterator iterator1 = map.entrySet().iterator(); //Map对象有keySet方法,返回key的Set集合,values()返回Collection集合,entrySet函数返回集合,元素类型为Map.Entry(一个<key,vlaue>的泛型接口)
Map.Entry entry = (Map.Entry)iterator1.next();
Object key=entry.getKey();
Iterator iterator2 = map.keySet().iterator();
key=iterator2.next();
x_name=map.get(key);
for(Map.Entry<String, String> entry2:map.entrySet()){
entry2.getKey();
entry2.getValue();
}
List<Map.Entry<String, String>> info_student= new ArrayList<Map.Entry<String,String>>(map.entrySet());







printf("===========字符串相关操作==============");
StringBuilder sb = new StringBuilder(); //StringBuilder包括insert,replace,substring,reverse,append,tostring,delete方法
sb.append(String.format("这里%s字符串相关操作", "shi")); //string.format()格式化函数,内部创建formatter类设置字符串格式
String outStr=sb.toString().replace("shi", "是"); //string是不可变量,取值变化是生成新的类,replace替换,repalceAll,replaceFirst
outStr=outStr.substring(3)+outStr.length(); //substring取子字符串,length字符串长度,+重载连接字符串和整型
if(outStr.indexOf("shi")<0) //indexof插叙子字符串所在位置,不存在返回-1,其他字符串相关操作较多
printf("字符串\""+outStr+"\"不存在指定子字符串");
outStr = "luanpeng luanpeng";
outStr=outStr.split(" ")[0]; //split分割字符串,返回数组,读取第一个数组赋值给outstr
Pattern pattern = Pattern.compile("lu[a-n]"); //创建正则法则,将正则字符串编译成正则表达式
Matcher matcher = pattern.matcher(outStr); //创建匹配器
while (matcher.find()) //依次查询是否存在匹配项
printf(matcher.group()+"起点"+matcher.start()+"终点"+matcher.end());//group匹配值,start起始位置,end结束位置
matcher.reset("luan"); //将正则法则重新使用到新的字符串上

Integer nn= Integer.parseInt("123"); //字符串转化为整型
String str = String.valueOf(nn); //整型转化为字符串
char[] temparr ={'a','b'}; //字符数组
str=new String(temparr); //字符数组转化为字符串
temparr = str.toCharArray(); //字符串转化为字符数组
byte[] temp1=str.getBytes(); //字符串转化为字节数组

StringBuffer buf=new StringBuffer(); //字符串的StringBuffer表示,
buf.append(str+"\r\n"); //StringBuffer可以追加
buf.deleteCharAt(buf.length()-1); //StringBuffer与StringBuilder有很多类似功能,这里不一一列举




printf("===========数组相关操作==============");
Random random =new Random(17); //随机数
int farrat[] =new int[10]; //数组创建int var[] 和int[] var等效
for(int x:farrat){ //for语句的遍历形式
x=random.nextInt(); //读取伪随机序列
}
Student[] all1 = new Student[7];
Student[] all2 = new Student[10];
Arrays.fill(all1, student1); //数组填充,填充对象时,只是填充了引用
Arrays.fill(all2, student3);
System.arraycopy(all1, 0, all2, 2, all1.length); //ii第0个开始复制到jj第2个开始,长度ii.length
Arrays.sort(all2); //调用重写的比较函数执行数组排序
int location = Arrays.binarySearch(all2, student1); //在数组中查找,不存在返回-1
if(!Arrays.equals(all1, all2)) //数组相等 个数和每个元素均相等
printf(Arrays.toString(all2));

Monitor<Student> monitor2 = new Monitor<Student>(); //包含泛型的类型调用,也可以不使用泛型创建对象
monitor2.setT(student1);


//注解
//数据流
//序列化
printf("===========线程相关操作==============");
new index().run(); //在主线程中调用线程类中的run函数,不是多线程,只是调用函数
Thread thread=new Thread(new index()); //调用子函数,执行线程类中run函数,thread构造参数为runnable接口,线程类向上转型为接口
thread.setDaemon(true); //设置线程为后台线程,否则为非后台线程
thread.start(); //线程启动,thread.join()等待线程执行完毕
thread.interrupt(); //线程中断,会在线程运行至阻塞时中断,弹出中断异常
ExecutorService exec= Executors.newCachedThreadPool(); //创建线程池管理器
exec.execute(new index()); //向线程管理器中添加一个线程实现接口,自动执行
exec.submit(new index()); //调用有返回的线程
exec.shutdown(); //关闭线程管理器,线程池继续运行

synchronized (stringtemp) { //对象锁控制同步块,需要锁才能进入
try {
printf("进入同步块,释放对象锁"); //对象释放锁,进入等待锁定池,当接收到对象notify、notifyAll后进入对象锁定池,准备重新获取对象继续执行
stringtemp.wait(); //wait,会抛出异常,synchronized 的目标与 wait() 方法的物件不相同,会有 IllegalMonitorStateException
printf("同步控制块恢复继续执行"); //java里面有专门捕获异常的try catch。异常是向上依次抛出的,如果在某一层被捕获就不会退出。如果一直没有被捕获直到抛出到系统层就是退出。
} catch (InterruptedException e) { //中断异常类,会在线程运行至阻塞时中断,弹出中断异常
e.printStackTrace();
}
}



printf("结束");
printf(Student.allsex.woman);


}


public static void sprintf(Student student,Object[] args) //基类参数允许传递派生类引用,//Object[] args用于可变参数列表,可以无参调用
{
student.setname("student1"); //调用引用动态绑定的方法-基类函数,修改的是基类属性
student.getname(); //调用引用动态绑定的方法-派生类重写的虚函数,获取的是派生类属性
}
public static void sprintf(Interface1 interface1) //接口参数允许传递接口类为参数,sprintf函数名相同实现重载
{
if(interface1 instanceof Monitor){ //判断引用的类型是否是指定类型
Student student=(Student)interface1; //先向下转型为monitor,在向上转型为student
printf("接口类型:"+interface1.getClass().getName()); //获取引用指向的对象类型
student.getname(); //调用动态绑定的方法
}
interface1.init1(); //接口相当于纯抽象类,调用动态绑定的方法
}



public static Interface1 getInterface1() { //不用创建实现接口的类,而直接实现接口的方法的定义
return new Interface1(){ //匿名内部类,可以传递参数
public void init1(){
System.out.println("通过匿名内部类实现向上转型为接口");
}
};
}


public static synchronized <T> void printf(T str) //泛型方法,synchronized同步函数,检查锁,获取锁,执行代码,释放锁
{
System.out.println(str.toString());
}

int num=0;
@Override //多线程,任务接口,只有调用线程接口才会执行
public void run(){ //线程接口重载函数
Thread.currentThread().setPriority(++num); //设置线程优先级,优先级不会导致死锁,优先级低的执行频率低
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
printf(df.format(new Date())+"执行了线程"+num); // new Date()为获取当前系统时间
Lock lock = new ReentrantLock(); //创建线程锁
lock.lock(); //锁定资源
try {
Thread.yield(); //线程让步,不释放锁,yield不能设置时间,只能控制同优先级
Thread.sleep(1000); //sleep可以使低优先级的线程得到执行的机会,线程睡眠,不释放锁,保持监控,自动恢复,sleep不操作锁,所以可以在非同步控制方法(块)中调用
} catch (Exception e) {
printf(df.format(new Date())+"线程错误"+e.toString());
}
finally{
lock.unlock(); //释放锁
printf(df.format(new Date())+"释放锁");
synchronized (stringtemp) { //对象锁控制同步块,需要锁才能进入
stringtemp.notifyAll(); //stringtemp调用线程恢复通知所有等待线程,wait、notify、notifyAll必须在同步控制方法(块)中调用
}
}

}

}


标签:java,name,demo,学会,接口,printf,new,public
From: https://blog.51cto.com/u_15858929/6117125

相关文章

  • 【Java】知识点汇总(1)
    周末重新整理了一下过往的笔记,发现以前有很多Java相关的经验都用txt或者word记录起来,于是稍微整理了一下全部打包放上网,做个记录也好。1.包装类用equals,基础类就用==结论In......
  • java反射
    1.反射机制的概念及作用(原文链接:https://blog.csdn.net/lililuni/article/details/83449088)   JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属......
  • 【面试系列1】Java基础
    1.面向对象三大特征封装   1. 属性与方法:属性描述同一类事务的特征、方法描述同一类事务的操作。封装就是将同一类事务的属性、方法归结到同一个类里面。  2. ......
  • java初识
    一java简介二开发环境搭建三开发第一个java程序四使用Eclipse进行java程序开发  Java简介java是一门面向对象的程序设计语言1995年由sun公司发布2010......
  • java学习日记20230312-构造方法
    构造方法/构造器基本语法[修饰符]方法名(形参列表){方法体;}构造器的修饰符可以是默认;构造器没有返回值;方法名和类名字必须一样;参数列表和成员方法一样的规则;构......
  • Java基础知识点(集合、ArrayList集合、基本数据类型对应的包装类及
    1.为什么要有集合?集合它可以自动扩容。2.集合存储数据类型的特点:不能直接存基本数据类型,需要将其变为包装类再存入,可以存引用数据类型。二:集合和数组的对比长度:数组的长度固......
  • 学习java第三周
    前言:这周过的很充实,因为对之前的内容没有很好理解本周一部分时间消化之前内容,经过三周的学习,对Java开始有了自己的认知,长路漫漫对自己的学习情况并不是很满意.对本周内......
  • java学习日记20230311-方法重载/可变参数/作用域
    方法重载java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致:System.out.println();减轻了起名的麻烦减轻了记名的麻烦方法名必须相同形参列表必须不同(个......
  • java.lang.IllegalStateException: couldn't determine local port. Please set sprin
    2023-03-12记录一下出现上述问题的原因(1)问题描述:在打包springboot项目时,出现了上述问题(2)产生原因:在打包时,项目的生命周期中没有关闭test(3)解决方法:关闭test,如图,之后......
  • 学java前预备知识
    计算机预科1.打开CMD的方式开始+系统+命令提示符。Win+R输入CMD打开控制台(推荐使用)。在任意文件夹下,按住Shift键+鼠标右键打开命令行窗口。在资源管理......