栈和队列
栈:先进后出
栈空:使用pop(),push()都抛出EmptyStackException
peek()返回栈顶元素,不弹出
pop()返回栈顶元素并弹出
由Stack实现
System.out.println(stack);打印栈从栈底到栈顶
由LinkedList实现
System.out.println(list);打印从栈顶到栈底
public class Demo3stack {
public static void main(String[] args) {
}
static void test1() {
Stack<String> stack = new Stack<>();
// System.out.println(stack.peek());// java.util.EmptyStackException
stack.push("hello");
stack.push("a");
stack.push("hjanj");
System.out.println(stack);
// System.out.println(stack.peek());//返回栈顶元素,不弹出
// System.out.println(stack.peek());
System.out.println(stack.pop());//返回栈顶元素并弹出,空栈抛异常EmptyStackException
System.out.println(stack);
}
static void test2() {
LinkedList<String> list = new LinkedList<>();
list.push("hello");
list.push("a");
list.push("hjanj");
System.out.println(list);//与stack声明的完全相反,从栈顶到栈底
System.out.println(list.pop());
System.out.println(list);
}
}
队列:先进先出
offer(e):放入元素
poll():返回队首元素,并抛出
peek():返回栈顶元素,不抛出
若无元素返回null
public class Demo4Queue {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
System.out.println(list.peek());//队列无元素返回null
System.out.println(list.poll());//队列无元素返回null
list.offer("a");
list.offer("b");
list.offer("c");
System.out.println(list.peek());
System.out.println(list);
System.out.println(list.poll());
System.out.println(list);
}
}
反射
程序运行过程中我们可以获取得类的构造方法,成员变量(包含私有的)方法,对象使用类成员,我们把获取类成员和对象去调用类成员的机制叫做反射
Class类
封装了运行过程中的大量的方法,通过方法可以获取到构造方法,方法,成员变量
public class Demo6Ddc {
public void qi() {
System.out.println("兜风!!!");
}
}
public class Demo6Gjc {
public void zuo() {
System.out.println("看风景!!!");
}
}
public class Demo6 {
public static void main(String[] args) throws Exception {
//都配置文件
Properties p = new Properties();
p.load(new FileInputStream("test.properties"));
System.out.println(p.getProperty("className"));
System.out.println(p.getProperty("methodName"));
String className = p.getProperty("className");
String methodName = p.getProperty("methodName");
//获取类的对象
Class<?> class1 = Class.forName(className);
Object obj = class1.newInstance();
Method m = class1.getDeclaredMethod(methodName);
m.invoke(obj);
}
}
public class Demo5 {
//1\获取Class类对象
public static void test1() throws ClassNotFoundException {
//通过对象获取
Class<? extends Demo5test> class1 = new Demo5test().getClass();
//通过类名获取
Class<Demo5test> class2 = Demo5test.class;
System.out.println(class1 == class2 );
//forName("包名+类名")
Class class3 = Class.forName("Demo0807.Demo5test");
System.out.println(class2 == class3);
System.out.println(class1 == class3);
}
//2、获取和使用构造方法
public static void test2() {
Class<Demo5test> class1 = Demo5test.class;
@SuppressWarnings("rawtypes")
Constructor[] constructs = class1.getDeclaredConstructors();
for(Constructor<?> construct:constructs) {
System.out.println(construct.getModifiers()+"->"+
Modifier.toString(construct.getModifiers()));
System.out.println(construct.getName());
//返回参数列表的class列表的数组
Class[] pclass = construct.getParameterTypes();
for(Class c: pclass) {
System.out.println(c.getName());
}
System.out.println("-----------");
}
}
//获取无参的构造方法,创建对象
public static void test2_1() throws Exception {
Class<Demo5test> class1 =Demo5test.class;
Constructor<Demo5test> con = class1.getDeclaredConstructor();
//得到无参的构造方法对象
// Demo5test stu = con.newInstance();//new Demo5test();
//使用无参的构造方法创建对象,不用获取Constructor对象,可以使用下面的方式
//直接由Class类型的对象调用
Demo5test stu = class1.newInstance();
stu.name ="zhangsan";
stu.eat("饺子");
}
//代餐的狗早方法,创建对象
public static void test2_2() throws Exception{
Class<Demo5test> class1 = Demo5test.class;
Constructor<Demo5test> constructor
= class1.getDeclaredConstructor(new Class[] {String.class});
//使用构造方法创建对象
Demo5test stu = constructor.newInstance(new Object[] {"李四"});
stu.eat("米饭");
}
//私有的带参的构造方法,创建对象
public static void test2_3() throws Exception{
Class<Demo5test> class1 = Demo5test.class;
Constructor<Demo5test> constructor
= class1.getDeclaredConstructor(new Class[] {String.class,int.class});
//使用构造方法创建对象
constructor.setAccessible(true);//IllegalAccessException:设置后访问属性,可获取
Demo5test stu = constructor.newInstance(new Object[] {"李四",18}); //IllegalAccessException:
stu.eat("米饭");
}
//3、获取功能方法
//getDeclaredMethods获取本类的方法
//getMethods()获取本类和父类的非私有方法
public static void test3() {
Class class1 = Demo5test.class;
// Method[] methods = class1.getDeclaredMethods();
Method[] methods = class1.getMethods();
for(Method m :methods) {
System.out.println(m.getName());
System.out.println(m.getReturnType());
System.out.println("----------------");
}
}
public static void test3_1() throws Exception {
Class<Demo5test> class1 = Demo5test.class;
Demo5test stu = class1.newInstance();
Method method = class1.getDeclaredMethod("sleep");
method.invoke(stu);
Method method1 = class1.getDeclaredMethod("eat",new Class[] {String.class});
method1.invoke(stu,new Object[] {"mantou"});
// System.out.println(method1);
Method method2 = class1.getDeclaredMethod("setAge",new Class[] {int.class});
method2.setAccessible(true);
method2.invoke(stu,new Object[] {18});
Method method3 = class1.getDeclaredMethod("getAge");
method3.setAccessible(true);
System.out.println(method3.invoke(stu));
}
//获取和使用成员变量
public static void test4() throws Exception {
Class<Demo5test> class1 = Demo5test.class;
Demo5test stu = class1.newInstance();
Field[] fileds = class1.getDeclaredFields();
for(Field f:fileds) {
System.out.println(f.getName());
}
Field filed = class1.getDeclaredField("name");
filed.set(stu, "zhangsan");
System.out.println(filed.get(stu));
System.out.println(filed.getType()+":"+filed.getName());
Field filed1 = class1.getDeclaredField("age");
filed1.setAccessible(true);
filed1.set(stu,18);
System.out.println(filed1.get(stu));
System.out.println(filed1.getType()+":"+filed1.getName());
}
public static void main (String[] args) throws Exception{
test4();
}
}
public class Demo5test {
public String name;
private int age;
public Demo5test() {
}
public Demo5test(String name ) {
super();
this.name = name;
}
private Demo5test(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void eat(String food) {
System.out.println(name+"吃"+food);
}
public void sleep() {
System.out.println("睡觉");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
}