zoukankan      html  css  js  c++  java
  • 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的视频,静下心来慢慢看,学而时习之,不亦乐乎?坚持下来肯定会有收获!明天开始学习网络编程的知识,坚持就是胜利!加油!

  • 相关阅读:
    nexus搭建maven私服
    eclipse 使用git
    多启动引导工具_YUMI – Multiboot USB Creator
    减压Zip与创建Zip文档
    将设置集成到右键联级菜单
    在Windows 10上清除和管理TPM (受信任的平台模块)
    删除Windows运行记录
    计算文本HasH
    在右键新建中添加"Windows PowerShell脚本"
    调整Windows 10字号
  • 原文地址:https://www.cnblogs.com/gaoyao/p/13350784.html
Copyright © 2011-2022 走看看