zoukankan      html  css  js  c++  java
  • Java基础(二)

    Java基础(二)

    目录

    继承

    使用关键字extends来表示继承

    比如:

    经理是员工,而员工只是员工。

    再比如

    兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

    食草动物和食肉动物又是属于动物类。

    所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

    虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

    
    public class Manager extends Employee{
    	add some methods and fields;
    }
    
    

    关键字extends表明正在构造的心类派生与一个已存在的类。

    • 已存在的类称为超类、基类或父类
    • 新类称为子类、派生类或孩子类

    通过扩展超类定义子类的时候,只需要指出子类与超类的不同之处。因此在设计类的时候,应该将最一般的方法放在超类中,而将更特殊的方法放在子类中,这种将通用功能抽取到超类的做法在面向对象程序设计中十分普遍

    特别注意,java中,不适用于多重继承,但是java中可以使用关键字implements实现多个接口

    back

    覆盖办法

    在超类中的有些方法对子类不一定使用,对于上面的例子,员工和经理的工资的计算方法不一样,因此需要另一种的计算方式。这这,便是我们要说的覆盖方法。

    看下面:

    public class Employee{
    	private double salary;
       public double getSalary(){
       		return salary; 
       }
    }
    
    

    这就是员工(employee)的工资,如果经理(manager)是在员工的基础上,加上一些其他的工资,那应该怎样写呢?

    
    public Manager extends Employee{
    	private double bonus;
       public double getSalary(){
       	return salary+bonus;//这并不工作
       }
    }
    
    

    如果我们不考虑其他因素,是不是应该就如这样写?员工的工资加上自身的工资,就组成了经理的工资。但是像上面的,如果你这样做的话,肯定是不可以的。因为Manager类的getSalary方法是不可能直接访问Employee的salary字段,因为我用了private关键字。因此,要像其他的方法那样,使用公用接口,也就是在Employee里面写上getSalary方法。

    而上面,我已经写了该方法,那么我们是不是可以这样来访问?

    public Manager extends Employee{
    	private double bonus;
       public double getSalary(){
    		 double baseSalary=getSalary();
        	return bonus+baseSalary;
    	}
    }
    
    

    当然,你如果这样写的话,那么就会无线调用自己,从而导致程序崩溃

    为此,我们可以采用super关键字,这个关键字是调用父类中的方法,保证父类的方法能够正常运行,此时我们可以这样写:

    public Manager extends Employee{
    	private double bonus;
       public double getSalary(){
    		 double baseSalary=super.getSalary();
        	return bonus+baseSalary;
    	}
    }
    
    

    back

    super关键字

    作用:

    • 1 主要存在于子类方法中,用于指向子类对象中父类对象。
    • 2 访问父类的属性
    • 3 访问父类的函数
    • 4 访问父类的构造函数
    package Learn;
    class test1{
        int ans;
        test1(int ans){
            this.ans=ans;
        }
    }
    public class Demo extends test1 {
        int ans;
        Demo(int ans1,int ans2){
            //访问父类的构造函数
            super(ans1);
            this.ans=ans2;
        }
        int getFatherAns(){
            //访问父类的值
            return super.ans;
        }
    
        public static void main(String[] args) {
            Demo d=new Demo(1,2);
            System.out.println(d.ans);
            System.out.println(d.getFatherAns());
        }
    }
    
    

    back

    使用子类构造器

    class Employee{
    	private double salary;
    	//构造函数
       public Employee(double salary){
       		this.salary=salary;
       }
    }
    
    public class Manager extends Employee{
    	private double bonus;
       public Manager(double salary,double bonus){
       		super(salary);
          //使用super,即可调用父类的构造函数,使其初始化值
          
          this.bonus=bonus;
       }
    }
    
    

    back

    多态

    有一个简单的规则可以用来判断是否应该将数据设计为继承关系,这规则是is-a规则。它指出子类的对象也是超类的对象。

    下面引用动物,猫,狗的例子

    猫能干啥呢?抓老鼠,吃鱼,对吧,狗呢,能吃骨头,看家。

    下面我们使用了抽象类,猫和狗,抽象出来,都是动物吧,那么我们就把猫和狗抽象出来,他们都是动物。动物能干啥?能吃。所以添加了一个抽象的方法。

    猫是动物么?is-a原则,是!好,我们让Cat类继承Animal类

    抽象方法是我们得去实现它,猫能吃啥?刚刚说了,猫能吃鱼。

    对于狗,也一样,狗能吃啥?骨头。

    对于猫和狗,他们有自己的功能吧,那么猫能抓老鼠,狗能看家。

    
    //抽象类
    abstract class Animal{
    	//抽象方法
    	abstract void eat();
    }
     
     //继承
    class Cat extends Animal{
    	
    	public void eat(){
        //猫吃鱼
    		System.out.println("吃鱼");
    	}
    	public void catchMouse(){
    	  //猫能抓老鼠
       	 System.out.println("抓老鼠");
    	}
    }
     
    class Dog extends Animal{
    	public void eat(){
        //狗能吃骨头
    		System.out.println("吃骨头");
    	}
    	public void kanJia(){
        //狗能看家
    		System.out.println("看家");
    	}
    }
     
    class DuoTaiDemo{
    	//这是一个多态的样理
    	public static void main(String[] args){
        
    		function(new Cat());//这里是创建一个对象,创建猫这个对象
    		function(new Dog());//创建狗这个对象
    		
         //Animal是父类,那么我们在父类的基础上,申请了一个猫,这样是可以的,因为猫是动物,动物能做的东西,猫肯定能做。
         //换句话来理解就是,父类往往都是一些通用的东西,而子类往往都是父类的派生,功能更加强大。
    		Animal a = new Cat();//向上转型
    		a.eat();
    		
    		Cat c = (Cat)a;//向下转型
    		c.catchMouse();
    		
    		
    	}
    	
    	public static void function(Animal a){
    		a.eat();
    		//用于子类型有限
    		//或判断所属类型进而使用其特有方法
    		if(a instanceof Cat){
            //使用instanceof关键字,判断是什么类,如果是猫类,那么转换
    			Cat c = (Cat)a;
    			c.catchMouse();
    		}
    		else if(a instanceof Dog)
    		{
    			Dog c = (Dog)a;
    			c.kanJia();
    		}
    	}
    	
    	
    }	
    
    

    back

    instanceof关键字

    Java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

    它的语法是:

    object instanceof constructor

    • object
      object是某个实例对象

    • constructor
      constructor是某个构造函数

    back

    interface关键字

    在抽象类中,可以包含一个或多个抽象方法;但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加“抽象”。

    接口使用 interface 关键字来声明,可以看做是一种特殊的抽象类,可以指定一个类必须做什么,而不是规定它如何去做。

    比如你的电脑的STAT接口,他不规定你干啥,你有下个对应的东西插上就可以用了

    • 接口中只能定义抽象方法,这些方法默认为 public abstract 的。
    • 接口中没有构造方法,不能被实例化。
    • 一个接口不实现另一个接口,但可以继承多个其他接口。
    • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类(abstract)是可以有静态代码块和静态方法。

    back

    equals()方法和toString()方法

    有的时候需要重写equals方法或者toString方法,这个方法在你创建类的时候,就已经存在了,是系统给你写好的。有的时候确实是要重写这两个方法

    原型:

    
    @Override
    public boolean equals(Object obj) {
    	return super.equals(obj);
    }
    
    @Override
    public String toString() {
    	return super.toString();
    }
        
    

    为什么会存在这两个方法呢?

    我们在编写我们的类的时候,总是会继承Object类,这是java的规则。可以说,Object是所有类的超类,如果我们使用instanceof去与Object比较,返回的值必定是正确的。

    back

    异常、断言

    在一个理想的世界中,用户的所有的格式都是对的,文件也一定能够打开,代码永远不会出现bug。但是现实世界中,你永远都是在打bug.....

    Java异常机制用到的几个关键字:

    关键字 作用
    try 用于监听,主要是可能抛出异常的语句块中,当发生异常的时候,就会抛出
    catch 用于捕获异常,捕获try语句中的异常
    finally finally语句块总是会被执行的,主要是用于回收资源,比如你打开了数据库的连接,出现了异常,你得关闭,不然会浪费巨大的计算机资源。如果finally中使用了return或者throw等终止方法的语句,直接停止
    throw 抛出异常,本层抛出异常,可本层处理,也可返回上一层处理
    throws 抛出异常,用在方法签名中,声明该方法能够返回异常,移交上一层处理

    例子:

    
    package Learn;
    public class Test{
        void function1(int a,int b){
            int c;
            try{
                c=a/b;
                System.out.println(c);
            }catch (Exception e){
                System.out.println("函数一发生了异常,非法错误");
            }
    
            finally {
                System.out.println("实验一异常,finally字段");
            }
            System.out.println("实验一结束");
        }
        void function2(int a,int b){
            int c;
            try{
                if(b==0)
                    throw new Exception();
                c=a/b;
                System.out.println(c);
            }catch (Exception e){
                System.out.println("函数二发生了异常,非法错误");
            }
            finally {
                System.out.println("实验二异常,finally字段");
            }
            System.out.println("实验二结束了");
        }
        void function3(int a,int b)throws Exception{
            int c;
            if(b==0)
                throw new Exception();
            c=a/b;
            System.out.println(c);
        }
    
        public static void main(String[] args) {
            int a=1;
            int b=0;
    
            Test t=new Test();
            t.function1(a,b);
            t.function2(a,b);
            try {
                t.function3(a,b);
            }catch (Exception e){
                System.out.println("主函数接收到异常");
            }
    
            finally {
                System.out.println("主函数接收到异常,finally字段");
            }
            System.out.println("主函数结束了");
        }
    }
    
    

    back


    参考《Java核心技术卷一》

    大部分是个人思想,如果不对,请指正

    如果转载,请标明出处

    https://www.cnblogs.com/Yunrui-blogs/p/12821831.html

    这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
  • 相关阅读:
    SQL注入的一般步骤及防范方法
    防止SQL注入的五种方法
    document.getElementById("orderform").submit() 提交给了谁?
    页面调试-F12
    rs.last()续
    rs.last()
    14课后习题
    HashMap
    链表
    习题
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/12821831.html
Copyright © 2011-2022 走看看