将前面的所学的,自定义异常,异常处理,多态,等都有使用到
1.显示自己写的代码
(1).Stack代码
package stack;
//栈:后进先出
public class Stack {
//使用数组存储数据
//栈可以说存储多个引用类型的元素
Try[] elements;
int i=0;
//栈默认的初始化容量是5
//Constructor
Stack(){
this(5);
}
Stack(int max){
elements = new Try[max];
}
//栈应该对外提供一个压栈的方法
public void push(Try elemnt) {
if(i==5)
{
System.out.println("栈已压满,无法压入");
}else {
//以下两句话可以合成一句话:elements[i++] = element; i会先赋值再运算,所以在elements[i++] 时i++为零,代码执行完毕,i++w为1
elements[i] = elemnt;
i++;
}
}
//栈应该对外提供一个弹栈的方法
public Try pop() { //不用传入参数,因为弹栈弹的是栈顶的元素
Try o1;
o1 = null;
if(i==0) {
System.out.println("栈内还无元素");
return o1;
}else
{
o1 = elements[i-1];
i--;
return o1;
/*
* 以上考虑到的是弹栈时候实际上数组里的位置是i-1,所以想法是用个中间对象过渡下,但是实际上可以用下面一段话
* return elements[--i];
* */
}
}
}
(2).测试用代码
package stack;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Stack t1 = new Stack();
Try n1 = new Try(1);
Try n2 = new Try(2);
Try n3 = new Try(3);
Try n4 = new Try(4);
Try n5 = new Try(5);
Try n6 = new Try(6);
t1.push(n1);
t1.push(n1);
t1.push(n3);
t1.push(n5);
t1.push(n5);
t1.pop().test();
t1.pop().test();
//t1.push(n6);
/*
* t1.pop().test(); t1.pop().test(); t1.pop().test(); t1.pop().test();
*/
}
}
class Try {
int i;
public Try(int i){
this.i = i;
}
public void test() {
System.out.println("这是第["+i+"]个类");
}
}
2.在看了视频后总结之后,新的代码
(1).Stack代码
package Stack2;
/*Stack1里面是在看完讲解视频之前写的,讲解视频为B站动力节点,java进阶,模拟栈视频
* Stack1里主要缺少以下内容:
* 1 .多态应用观念不深刻(万物皆继承与Object类),所以在Stack类里都可以用Object类来定义,外部压入的可以是任何一个测试类,因为任何测试类都是继承与Object类的
* 在Stack1里面我把Stack里面所有的Object类定义改为新写的Try类,这不是必须的,Try类也是继承与Object类,所以一个入口为Object类,Try类也能放进去
*
* 2. 异常处理机制未使用(异常处理机制的平抛,try..catch..使用)。首先在Stack1虽然意识到了栈里面的两个会发生异常的地方,第一是在压栈时候,当栈满了将无法压入。
* 第二是弹栈的时候,当栈内没有元素的时候,将无法弹出。虽然也加了判断语句去规避,但是没有运用到异常机制去处理,同时可以发现在弹栈的时候,即使加了判断语句
* 但是依然需要弹出元素的,所以最后弹出了null
* 同时注意在throw之后,在方法位置和还需要throws上抛异常
*
* 3. toString方法的应用场景(对toString的应用场景了解不充分),注意:system.out.println(类名),当该类为空的时候,通过syso源码可以输出"null",如果不是空,是指向
* 一个具体的对象,那么输出该对象的toString方法(所有类都是继承与Object类,toString方法是Object类的),同时对toString方法进行重写。不重写输出的是“包名+哈希(地址)”
*
* 4.自定义异常的写法(自定义异常的写法使用不熟练)自定义异常与异常的平抛使用,联系到printStackTrace()方法。同时回顾前面的知识,自定义异常类型和系统指定异常类型
* 两者之间,虽然一个对象是自己创建,一个对象是系统默认创建的,但是都是对创建出来对象进行处理。
*
*
* 5 .语法不简洁,在Stakc1里面有对一些不简洁代码的注释,例如 i++ 和--i的应用。
*
*
*
* */
public class Stack {
Object[] elements;
int index;
public Stack()
{
this(5);
}
public Stack(int max)
{
elements = new Object[max];
}
//压栈方法
public void push(Object element) throws StackOutofException
{
//当栈满时候
if(index == elements.length)
{
throw new StackOutofException("已栈满,无法压入");
}
//先赋值在自加
elements[index++] = element;
}
public Object pop() throws StackOutofException {
if(index == 0)
{
StackOutofException e = new StackOutofException("栈一空无法弹栈");
throw e;
}
//先自减后再赋值
return elements[--index];
}
}
(2).自定义异常代码
package Stack2;
public class StackOutException{
}
class StackOutofException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public StackOutofException(){
}
public StackOutofException(String s) {
super(s);
}
}
(3).测试代码
package Stack2;
public class Test {
public static void main(String[] args) throws StackOutofException{
// TODO Auto-generated method stub
Stack s1 = new Stack();
Try n1 = new Try(1);
Try n2 = new Try(2);
Try n3 = new Try(3);
Try n4 = new Try(4);
Try n5 = new Try(5);
try {
s1.push(n1);
s1.push(n2);
s1.push(n3);
s1.push(n4);
s1.push(n5);
s1.push(n5);
}catch(StackOutofException e)
{
e.printStackTrace();
}
try {
System.out.println(s1.pop());
System.out.println(s1.pop());
System.out.println(s1.pop());
System.out.println(s1.pop());
System.out.println(s1.pop());
System.out.println(s1.pop());
}catch(StackOutofException e)
{
String e1 = e.getMessage();
System.out.println(e1);
}
s1.push(n5);
System.out.println(s1.pop());
}
}
class Try{
int no;
public Try(int no)
{
this.no = no;
}
public String toString()
{
return "这是第"+no+"个压入的";
}
}