题目1.写出下面代码运行的结果
class Animal { public Animal() { System.out.println("Animal构造"); } { System.out.println("Animal代码块"); } static{ System.out.println("Animal静态代码块"); } } class Tiger extends Animal{ public Tiger() { System.out.println("Tiger构造"); } { System.out.println("Tiger代码块"); } static{ System.out.println("Tiger静态代码块"); } } class Test{ public static void main(String[] args) { new Tiger(); } }
答案:
Animal静态代码块
Tiger静态代码块
Animal代码块
Animal构造
Tiger代码块
Tiger构造
结论:1.静态代码块优先级最高,直接从父类初始化到子类
2.代码块和构造方法都属于对象,同样先初始化父级,
3.代码块的优先级高于构造方法。
4.顺序: 父类静态代码->子类静态代码->父类代码块->父类构造->子类代码块->子类构造
题目2.写一个静态方法来判断一个字符串中的括号是否匹配。给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效
例如:
String str1 = "[(])"; false String str2 = "(])"; false String str3 = "([[]()])"; true String str4 = "([{}])"; true
分析:
1.首先因想到需要把字符串中的每一个括号都取出来判断一下。
2.然后我们怎么来匹配括号呢?
3.因为左括号和右括号必须成对出现。使用栈方便逻辑编写
算法思路:
1.左括号全部入栈
2.判断是否有左括号,没有直接返回false
3.遇到左括号进行全部压栈
4.如果遇到右括号则出栈,然后进行判断,不符合则返回
其中两种特殊情况。
(1)循环时,如果栈为空,则说明右括号比左括号多,返回false
(2)循环结束时,如果栈非空,则说明左括号比右括号多,返回false
答案:
public static void main(String[] args) { String str1 = "[(])"; String str2 = "(])"; String str3 = "([[]()])"; String str4 = "([{}])"; System.out.println(isValid(str1)); System.out.println(isValid(str2)); System.out.println(isValid(str3)); System.out.println(isValid(str4)); } public static boolean isValid(String str) { Stack stack = new Stack(); //使用栈集合 for(int i=0;i<str.length();i++) { //遍历字符串每一位 if (str.charAt(i)=='['||str.charAt(i)=='('||str.charAt(i)=='{') { stack.push(str.charAt(i)); //判断如果时左括号类型就加入栈集合 }else { //否则右括号就比对 //如果栈里没有左括号了,但是字符串中还存在右括号,即不匹配直接返回false if (stack.isEmpty()) { return false; } //如果是']'类型的右括号,就出栈一个比对是不是'['如果不是返回false if (str.charAt(i)==']'&&(char)stack.pop()!='[') { return false; } //如果是'}'类型的右括号,就出栈一个比对是不是'{'如果不是返回false if (str.charAt(i)=='}'&&(char)stack.pop()!='{') { return false; } //如果是')'类型的右括号,就出栈一个比对是不是'('如果不是返回false if (str.charAt(i)==')'&&(char)stack.pop()!='(') { return false; } }//else结束 }//for循环结束 return stack.isEmpty();//如果for循环结束了,栈中还有左括号就返回false,如果已经空了就返回true }