java面向对象

什么是面向对象

面向对象编程(Object-Oriented Programming, OOP)

面向对象编程的本质就是:以类的方式组织代码,以对象的形式封装数据

抽象

三大特性:

  • 封装

    • 高内聚,低耦合:高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用

    • 属性私有(private)

    • set,get:set设置值, get 拿出来赋值

      public class Person{
          private String name;
          public int money = 10000;
         
          public void setName(String name){
          this.name = name;
          }
          
          public String getName(){
          return this.name;
          }
      }
      
      public class Application(){
          public static void main(){
              Person.setName("旺财");
              System.out.println(Person.getName());    
          }
      }
      
    • 提高程序的安全性,保护数据;统一接口;易于维护

  • 继承

    • //类跟类之间的关系:子类继承父类的所有属性和方法 public  一般属性 private
      public class Student extends Person{
          
      }
      
    • public class Person(){
          int money = 10000;
          public void say(){
              System.out.println("人能说话:");
          }
          
      }
      
    • public class Application(){
          public static void main(){
              Student student = new Student();
              student.say();
              student.money;
          }
      }
      
    • 在java中,所有类都继承Object类

    • 只有单继承:儿子只有一个爸爸

    • 私有的东西无法被继承

    • super注意点

      • super调用父类的构造方法,必须在构造方法的第一个
      • this调用本类的构造方法
      • super和this不能同时调用构造方法
  • 多态

    • 多态是方法的多态
    • 父类和子类,有联系 classCastException
    • 存在条件

从代码运行角度考虑是先有类后有对象

回顾方法及加深

方法的定义

  • 修饰符

  • 返回类型

  • break和return的区别

    • break跳出循环
    • return结束方法
  • 方法名

    • 注意规范,见名知意
  • 参数列表

    • 参数类型,参数名

    • 注意可变参数的使用

      package method;
      
      public class Demo04 {
          public static void main(String[] args) {
              Demo04 demo04 = new Demo04();
              demo04.test(1,2,3,4,5);
      
          }
      
          public void test(int x,int... i){
              System.out.println(i[0]);
              System.out.println(i[1]);
              System.out.println(i[2]);
          }
      }
      
  • 异常抛出

方法的调用

  • 静态方法

  • 非静态方法

    • 非静态调非静态,静态调静态

    • 类实例化后非静态方法才存在

    • 静态不能调非静态,除非非静态所在的类被实例化

      package oop;
      //学生类
      public class Student {
      
          //非静态方法
          public void say(){
              System.out.println("学生说话了");
          }
      }
      
      package oop;
      
      public class Demo02 {
          public static void main(String[] args) {
              //实例化这个类 new
              //对象类型  对象名 = 对象值
              Student student = new Student();
              student.say();
              a();
          }
      
          public static void a(){
              Demo02 demo02 = new Demo02();
              demo02.b();
          }
      
          //类实例化后才存在
          public void b(){
              System.out.println("类实例化后非静态方法才存在");
          }
      }
      
  • 形参和实参

    • 实际参数与形式参数的类型一致
  • 值传递和引用传递

    package oop;
    
    //值传递
    public class Demo04 {
        public static void main(String[] args) {
            int a = 1;
            System.out.println(a); //1
    
            Demo04.change(a);
    
            System.out.println(a);  //1
        }
    
        public static void change(int a) {
            a = 10;
        }
    
    
    }
    
    package oop;
    
    //引用传递:对象,本质还是值传递
    
    //对象,内存!
    public class Demo05 {
        public static void main(String[] args) {
            Person person = new Person();
    
            System.out.println(person.name);  //null
    
            Demo05.change(person);
    
            System.out.println(person.name);  //秦疆
    
        }
    
        public static void change(Person perso){
            //person是一个对象,指向 Person person = new Person();这是一个具体的人,可以改变属性
            perso.name = "秦疆";
        }
    
    }
    
    //定义了一个Person类,有一个属性:name
    class Person{
        String name; //null
    }
    
  • this关键字

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void
  • 构造器必须要掌握
    • 使用new关键字,本质上是在调用构造器
    • 和类名相同,没有返回值
    • 初始化对象值
    • 定义有参构造之后,如果想使用无参构造,显示定义一个无参的构造

重写和重载

  • 重载:本类,方法名相同,参数列表不同
  • 重写
    • 重写都是方法的重写,和属性无关
    • 重写,子类重写父类的方法
    • 方法名必须相同,参数列表必须相同,方法体不同;修饰符:范围可以扩大但不能缩小
    • 抛出的异常,范围可以缩小,但不能被扩大
    • 为什么要重写:父类的功能,子类不一定需要

多态

  • 同一方法可以根据发送对象的不同而采取多种不同的行为方式
  • 一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多(父类,有关系的类)
  • 多态存在的条件
    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类对象
    • 理解:人是灵长类动物,人是子类,灵长类是父类。灵长类的智商(方法)大于等于50,人的智商(方法)大于等于80,这相当于子类对父类的继承与改写。智商这个方法在人,灵长类这两个发送对象的表现行为不同。
  • instanceof (类型转换) 引用类型

static关键字详解

  • 静态导入包

    package opp.demo04;
    
    //静态导入包
    import static  java.lang.Math.random;
    import static  java.lang.Math.PI;
    
    public class Test {
    
        public static void main(String[] args) {
            System.out.println(random());
            System.out.println(PI);
        }
    }
    
  • 静态方法和类一起加载

    package opp.demo04;
    
    public class Student {
        private static int age;  //静态的变量
        private double score;  //非静态的变量
    
        public void run(){
    
        }
    
        public static void go(){
    
        }
    
        public static void main(String[] args) {
            go();
            new Student().run();
        }
    
    }
    
  • 静态代码块(和类一起加载,只执行一次)

    package opp.demo04;
    
    public class Person {
        //2  赋初值
        {
            System.out.println("匿名代码块");
        }
    
        //1    static只执行1次
        static {
            System.out.println("静态代码块");
        }
    
        //3
        public Person(){
            
            System.out.println("构造方法");
        }
    
        public static void main(String[] args) {
            Person person1 = new Person();
            System.out.println("=================");
            Person person2 = new Person();
    
        }
    }
    

抽象类

  • 抽象类可以写普通方法,抽象方法只能在在抽象类中

    package opp.demo05;
    
    //abstract  抽象类:类 单继承          (接口可以多继承)
    public abstract class Action {
        //约束,有人帮我们实现
        //abstract,抽象方法,只有方法名字,没有方法的实现
        public abstract void doSomething();
    
        //不能new这个抽象类,只能靠子类去实现它
    
        //抽象类里可以写普通方法,抽象方法必须在抽象类中
        public void hello(){
    
        }
    }
    
  • 抽象类不能new

  • 抽象类有构造器

接口

  • 接口的本质是契约

  • 专业的约束

  • 定义一些方法,没有方法体,让不同的人实现

  • 接口不能被实例化,接口不是类,接口中没有构造方法

  • 必须要重写接口中的方法

    package opp.demo06;
    
    //类 可以实现接口 implements UserServices
    //实现了接口的类,就需要重写接口中的方法
    public class UserImpl implements UserService,TimeService {
        public void add(String name){
    
        };
    
        public void delete(String name){
    
        };
    
        public void update(String name){
    
        };
    
        public void query(String name){
    
        };
    
        public void timer() {
    
        }
    }
    

内部类

  • 通过外部类来实例化内部类

    package opp.demo07;
    
    public class Outer {
    
        private int id = 10;
        public void outer(){
            System.out.println("这是外部类的方法");
        }
    
        public class Inner{
            public void in(){
                System.out.println("这是内部类的方法");
            }
    
            //获得外部类的私有属性
            public void getID(){
                System.out.println(id);
            }
        }
    }
    
    package opp.demo07;
    
    public class Application {
        public static void main(String[] args) {
            Outer outer = new Outer();
            //通过这个外部类来实例化内部类
            Outer.Inner inner = outer.new Inner();
            inner.in();
            inner.getID();
        }
    }
    

异常

  • Error,Exception

  • 抛出异常

  • 捕获异常

  • 异常处理5个关键字:try,catch,finally,throw,throws

    package exception;
    
    public class Test {
        public static void main(String[] args) {
            int a = 1;
            int b = 0;
    
            //假设要捕获多个异常,大的放在最后
    
            try {  //try监控区域
                System.out.println(a/b);
            }catch (Error e) {  //catch 想要捕获的异常类型
                System.out.println("Error");
            }catch (Exception e){
                System.out.println("Exception");
            }catch (Throwable t){
                System.out.printf("Throwable");
            }finally {
                System.out.println("finally");
            }
    
            //finally 可以不要  IO资源关闭
    
            try {
                new Test().a();
            }catch (Error e) {  //catch 想要捕获的异常类型
                System.out.println("Error");
            }catch (Exception e){
                System.out.println("Exception");
            }catch (Throwable t){
                System.out.printf("Throwable");
            }finally {
                System.out.println("finally");
            }
    
            int c = a+b;
            System.out.println(c);
        }
    
        public void a(){
            b();
        }
    
        public void b(){
            a();
        }
    }
    

    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IagbZRd5-1646743525691)(C:\Users\Carl Zhou\Desktop\捕获异常.png)]

  • throws,throw一般在方法中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值