Day07_java对象下

Day07_java对象下

类型转换

  1. 父类引用指向子类的对象。
  2. 把子类转换为父类,向上转型,无需强制转换,但会丧失子类特有的方法。
  3. 把父类转换为子类,向下转型,强制转换。
  4. 方便方法的调用,减少重复的代码

static详解

静态变量调用

public class Student {
        private static int age;
        private double score;
  
  public static void main(String[] args) {
            Student s1=new Student();
            System.out.println(Student.age);//静态变量通常使用这种调用方法
            System.out.println(s1.age);
            System.out.println(s1.score);
        }

代码块

public class Student {
        private static int age;
        private double score;
    {
        //匿名代码块
        System.out.println("匿名代码块");
    }
        static{
            //静态代码块,首先被执行,只执行一次
            System.out.println("静态代码块");
        }

    public Student() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Student s1=new Student();
        System.out.println("=================");
        Student s2=new Student();
        }
}

输出:

静态代码块
匿名代码块
构造方法
=================
匿名代码块
构造方法

解释:静态代码块,首先被执行,只执行一次。匿名代码块在构造方法前执行。

静态导入包

import static java.lang.Math.random;

public class Demo01 {
    public static void main(String[] args) {
        System.out.println(random());
    }
}

此时可以直接调用random方法。

注意

final类不能被继承。

抽象类

abstract 抽象类,只能单继承。(接口可以多继承)

抽象方法

  • 约束,有人去实现
  • 只有方法名,没有方法的实现
public abstract class Action {
    public abstract void doSomething();
}
  • 不能new这个抽象类,只能靠子类去实现它
  • 抽象类中可以写普通的方法
  • 抽象方法必须在抽象类中

new抽象类的子类后,该抽象类有构造器。

抽象类存在的意义:提高开发效率。

接口

声明关键字:interface

注意点

  1. 约束
  2. 定义一些方法,让不同的人去实现
  3. 方法的类型都是public abstract
  4. 常量的类型都是public static final
  5. 接口不能被实例化,接口内没有构造方法
  6. implements可以实现多个接口
  7. 必须要重写接口中的方法
//userService.java
public interface userService {
    //接口中定义的是常量,public static final
    int AGE=99;
    
    //接口中定义的所有方法都是是抽象的,默认是public abstract
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}
timeService.java
public interface timeService {
    void timer();
}
//userServiceImpl.java
//类可以实现接口 implements 接口名称
//实现接口的类,需要重写接口中的方法
//利用接口实现多继承
public class userServiceImpl implements userService,timeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {
    }
}

成员内部类

public class Outer {
        private int id=10;
        public void out(){
            System.out.println("这是外部类的方法");
        }
        public class Inner{
            public void in(){
                System.out.println("这是内部类的方法");
            }

            //获取外部类的属性
            public void getID(){
                System.out.println("Id: "+id);
            }
        }
}
//一个java文件中可以有多个class类,但是只能有一个public class
class A{
}
public class test extends Outer{
    public static void main(String[] args) {
        Outer out = new Outer();
        //通过外部类来实例化内部类
        Outer.Inner inner=out.new Inner();
        inner.getID();
    }
}

输出:

Id: 10

静态内部类

public class Outer {
        static private int id=10;
        public void out(){
            System.out.println("这是外部类的方法");
        }
        public static class Inner{
            public void in(){
                System.out.println("这是内部类的方法");
            }

            //此时id会报错,这是由于id不是静态常量,将id前修饰符加上static即可
            public void getID(){
                System.out.println("Id: "+id);
            }
        }
}
public class test extends Outer{
    public static void main(String[] args) {
        Outer out = new Outer();
        //通过外部类来实例化内部类,此时直接将Inner类实例化即可
        Inner inner=new Inner();
        inner.getID();
    }
}

局部内部类

public class Outer {
       publid void method(){
       //局部内部类,不建议这样用
       class A{
       
       }
}
}

匿名内部类

public class test extends Outer{
    public static void main(String[] args) {
        //没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();
        new UserService(){
            @Override
            public void Hello() {
            }
        };
    }
}

class Apple{
    public void eat(){
        System.out.println("eat");
    }
}

interface UserService{
    void Hello();
}

异常机制

  • 抛出异常
  • 捕获异常

异常处理5个关键字

  • try
  • catch
  • finally
  • throw
  • throws

捕获异常

public class test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        //windows中crtl+alt+t快捷生成try
        //Mac中Command+option+t快捷生成try
        try { //try监控区域
            new test().divide(a, b);
        }catch (Error e){//捕获异常,括号内为想要捕获的异常类型
            System.out.println("Error,b不能为0");
        }
        catch (Exception e){//捕获异常,括号内为想要捕获的异常类型
            System.out.println("Exception,b不能为0");
        }
        catch (Throwable e){//捕获异常,括号内为想要捕获的异常类型
            System.out.println("Throwable,b不能为0");
        } finally{//处理善后工作
            System.out.println("finally");
        }
    }
        public void divide ( int a, int b){
            System.out.println(a / b);
        }
}

输出:

Exception,b不能为0
finally

主动抛出异常

public class test {
    public static void main(String[] args) {
        try {
            new test().divide(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
            System.out.println("程序异常,b不能为0");
        }
    }
    //假设在这个方法,处理不了这个异常。方法上抛出异常用throws
    public void divide(int a, int b) throws ArithmeticException{
       if (b==0){//方法内抛出异常用throw
           System.out.println("程序异常,divide抛出异常");
           throw new ArithmeticException();//主动抛出异常,一般在方法中使用
       }
    }
}

输出:

程序异常,divide抛出异常
程序异常,b不能为0
java.lang.ArithmeticException
	at com.shan.oop.test.divide(test.java:17)
	at com.shan.oop.test.main(test.java:6)

自定义异常

//MyException.java
public class MyException extends Exception{
     private int detail;
     public MyException(int a){
         this.detail=a;
     }
     //toString:异常的打印信息
    @Override
    public String toString() {
        return "MyException{" + detail +
                '}';
    }
}
//test.java
public class test {
    public static void main(String[] args) {
        try {
            test(1);
            test(11);
            test(5);
        } catch (MyException e) {
            System.out.println("MyException==>"+e);
        }
    }
    //可能会存在异常的方法
    static void test(int a) throws MyException{
        System.out.println("传递的参数为: "+a);
        if(a>10){
            throw new MyException(a);//抛出异常
        }
        System.out.println("OK");
    }
}

输出:

传递的参数为: 1
OK
传递的参数为: 11
MyException==>MyException{11}

test(5)未运行,这是由于test(11)抛出异常后,被catch捕获,跳过test(5)。

实际应用中的经验总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
  • 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
  • 对于不确定的代码,也可以加上try-catch,处理潜在的异常
  • 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定
  • 尽量添加finally语句块去释放占用的资源

总结

今天看完了java零基础入门的最后一节课,对java知识有了更清晰的了解,之前的很多疑惑也明白了。如果基础不好,想学习java,强烈推荐b站上狂神说java的视频,静下心来慢慢看,学而时习之,不亦乐乎?坚持下来肯定会有收获!明天开始学习网络编程的知识,坚持就是胜利!加油!

原文地址:https://www.cnblogs.com/gaoyao/p/13350784.html