zoukankan      html  css  js  c++  java
  • JAVA学习总结(三)

    1.什么是是类?

    1.1.具有相同特征和行为的一组对象的抽象称为类。

    1.2.描述类时要描述:
      特征:属性,名词,数据。
      行为:方法,动词,对数据进行操作的代码块。

     

    1.3.定义类,就是设计模板根据模板生产产品,根据类实例对象程序就是对对象的操作。

    2.如何定义类 ?

    //例如:
        修饰符 class 类名{
            //构造器
            修饰符 构造器名(参数列表){
                初始化代码;
            }
            public 类名(){
                //初始化对象
                num = 10;
                name="无名氏";
                arr = new float[]{10,20.5,6,7.8};
            }
            public 类名(int num, String name, float[] arr){
                //初始化对象
                init(num, name, arr);
                或
                this.init(num, name, arr);
            }
            }    

    类中的属性定义

    /*
    修饰符 类型 属性名;
        或
    修饰符 类型 属性名=值;
    */
      private int num=0;
      private String name;
      private float[] arr;

    属性的作用:

      1.用于保存对象的状态值,在声明属性时可以显示或隐式的赋初始值。

      2.如果没有显式赋初始值,所有属性都有默认值,规则:int byte short long float double都默认为0,boolean默认为false,char编码0,其他引用类型默认为null。

      属性在外部调用:对象.属性名(私有化不能访问,公共化可以)
      属性在内部调用:this.属性名或直接属性名(当属性名与局部变量有命名冲突时,属性表示为this.属性名,如果没有前缀就是指局部变量)

      注意:在类中定义的属性,实例化成对象后,每个同类型的对象都有相同的属性作为对象数据成员

    类中的方法定义

    /*
    修饰符 类型 方法名(参数列表){
            方法的实现代码
    }
    */
    public String toString(){
            return ...;
    }
    private void init(int num, String str, float[] arr){
            初始化代码;
        }

    方法的作用:

    1.用于描述对象的行为,是外部访问接口,由两个部分构造:
      声明和实现
      public String toString()//声明部分
      //实现部分
      {
        return...;
      }
    2.在外部调用:对象.方法名();(私有化不能访问,公共化可以)。
    3.在内部调用:this.方法名()或方法名()。

    private 是私有的,只能在类的内部访问。
    public 是公共的,其他类都可以访问。

    3.如何访问对象的属性(读和写),调用方法?

    /*
    使用"."运算符
    类名 p1 = new 类名();
    为p1引用的对象设置一个name属性,值为“张三”,性别,身高。
    */
    p1.name = "张三";
    p1.sex = "男";
    p1.height = 160;
    
    //用方法访问:
    p1.setName("张三");
    p1.setSex("男");
    p1.setHeight("160");
    
    //打印信息;
    P1.print();

    什么是对象? 类的实例。

    对象是类的实例,类是对象的抽象,new实例化对象关键字。

    new 构造器();//生成一个对象,实例化

    new关键字创建对象,在内存开辟了空间,并初始化数据

    4.构造器: 

    1.每个类都有构造器,与类名同名。
    2.当类没有显式声明构造器,就会有一个默认构造器。

    //例如:
        new String();//String()是String类的构造器

    相同类型的对象:有相同属性和方法,属性值不同.

    构造器(构造方法)的作用:

      1.用于实例化对象,初始化对象,只能使用new关键字调用;
       new 构造器();
      2.注意:构造器名称必须与类名同名,构造器没有返回类型。

    5.关于访问修饰符:

                类的内部   同包的类   子类       不同包非子类

    public        公共的          允许           允许      允许          允许
    protected    受保护的     允许        允许      允许          不允许
    默认                允许        允许        不允许(不同包)  不允许
    private      私有的      允许      不允许     不允许         不允许

    1.对于类class来说,只能使用public或默认访问修饰符(内部类除外)。


    2.什么是内部类? 在一个类的内部嵌套定义的类。

    //内部类
    //
    例如: class ClassA{ //内部类 class ClassB{ } }

    类的修饰符:只能使用public或默认访问修饰符(内部类除外)或abstract 抽象的 | final 终态。

    构造器的修饰符:public|protected|默认|private
    属性的修饰符:public|protected|默认|private
    方法的修饰符:public|protected|默认|private

    //例如修饰属性:
        public  int a;//公共属性
        protected int b;//受保护的属性
        int c ;//默认权限属性
        private int d;//私有的属性

    包:定义类的域名

      package 打包用的关键字:

        一个类文件只能使用一次,并且必须是代码中的第一行(除注释以外)。


      import 导入包的关键字:
        一个类文件可以多次使用import,使用的顺序。
        一个类文件可以同时定义多个类,但只能有一个public类,其他只能默认权限的类。

    例如:

      package..
      import...
      import...
      .....
      public class A{
        ...
      }
      class B{

      }
      class C{
      }

    6.修饰符:

    static 静态的。可以修饰:属性,方法,代码块,不能修饰构造器.

    1.静态属性、方法调用方法:类名.属性|对象.属性,可称为类成员。
    2.非静态属性、方法调用方法:对象.属性,可称为对象成员。

    3.静态属性时所用对象的共享变量。

    4.类的静态属性,在类创建对象时。

    5.静态代码块仅执行一次,在类加载后第一个执行。
      static{
        代码块..
      }

    6.非静态代码块实例化对象一次执行一次,在创建对象之前(new 构造器())时执行。

    7.重载(overload)

      1.什么是重载:

        名称相同,参数不同(个数不同,类型不同,类型且顺序不同),重载应用范围:方法,构造器。

    //例如:
        //f1()重载,个数不同
        void f1(int x){}
        void f1(int x,int y){}
        //
        
        //f1()重载,个数不同
        void f1(int x){}
        void f1(int x, int y){}
        //f2()重载,类型不同
        void f2(int x){}
        void f2(float x){}
        //f3()重载,顺序不同
        void f3(int x, String str){ x+str;}
        void f3(String str, int x){ x+str+"
    ";}
        
        
        //f4()不是重载,顺序不同,出错
        int f4(int x, int y){ return x+y;}
        int f4(int y, int x){ return x*y;}    
        调用f4(10,20)执行哪一个方法?调用时不明确
        
        //f5()重载
        void f5(){ }
        void f5(String str, int x){ }
        void f5(int x, float y, String str){ }

      2.重载的好处:    

        1.同一个方法可执行不同的代码,根据参数不同自动选择。
        2.一个访问接口,多个实现方法。
        3.实现多态调用。

    class Driver{
            void driv(宝马  car){ ... }
            void driv(奔驰  car){ ... }
            void driv(奥迪  car){ ... }
        }

    8. 继承(extends)

    一个子类只能拥有一个父类,所以 extends 只能继承一个类。

    1.如何使用?

    class A{
        int x;
        
        public void setX(int x){this.x = x;}
        public int getX(){return x;}
        public String toString(){return "A类的实例,x属性的值是:"+x;}
        
        public A(){x=10;}
        public A(int x){this.x = x;}
    }
    //B类继承A类,A类是B类的父类(superClass,BaseClass)
    //B类是A类的子类(派生类,subClass, childClass)
    class B extends A{
        int y;
        public void setX(int x){this.x = x;}
        public int getX(){return x;}
    }

    1.如果要显式调用父类指定构造器,使用super([参数]);来调用。

    2.super()必须注意:在构造器中只能是第一行代码,只能使用一次。

    3.子类继承父类所有属性和方法,构造器不能被继承但new子类对象时,总是先new父类对象。

    4.默认调用父类的无参构造器。

    5.继承的好处:

      1.代码复用。
      2.子类可以扩展新的属性和方法。

    9.super 与 this 关键字:

     super关键字: 1.我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

                2.若要在子类调用父类的方法,需使用关键字super。

             3.super.属性或super.方法()表示引用父类的对象的属性或方法。

     this关键字:   1.this(参数列表)表示当前类的构造器,super()表示父类的构造器。

             2.this.属性或this.方法()表示引用当前类的对象的属性或方法。

    10.final关键字 

    final 最终的 关键字:

    修饰符,可以修饰类,属性,方法,不能修饰构造器。

    public final class A{//修饰类,终态类:不能作为父类,不能有子类
    int x;
    final int y;//修饰属性:只能赋一次值,不能修改
    public static final int Z=10;//一般用法,表示常量
    
    void fun1(){}
    final void fun2(){}//修饰方法:子类不能重写该方法
    }

    常量:声明常量使用三个修饰符:public static final,常量名全部大写,有别于变量名。
    常量的访问方法:类名.常量名,例如:A.Z

    11.abstract 关键字

    abstract    抽象的 关键字:

    修饰符,可以修饰类,方法,不能修饰属性,构造器。

    abstract 与 final不能同时并存。

    public abstract class A{//修饰类:抽象类,不能实例化对象,但可以有构造器.
            void fun1(){
                //有方法体,有实现
            }
            
            abstract void fun2();
            //修饰方法:抽象方法,不能有代码的实现部
        }

    抽象类:

      1.不能实例化对象,也就是不能new对象。

      2.抽象类中可以有具体方法,也可以包含抽象方法。

      3.如果一个类中有抽象方法,这个类必须是抽象类。
      4.抽象类一般作为父类。

    java程序设计四大原则: 

      1.开闭原则:源代码开放,对修改关闭。
      2.单一职则:业务逻辑与业务实体数据分离。 
      3.里氏替换:参数能用父类不用子类。

    一个模拟计算器的实例:

    public abstract class calc{
        private double num1, num2,rs;
        private String op;
        
        public void setNum1(double num1){
            this.num1 = num1;
        }
        public double getNum1(){
            return num1;
        }
        
        public void setNum2(double num2){
            this.num2 = num2;
        }
        public double getNum2(){
            return num2;
        }
        
        public void setOp(String op){
            this.op = op;
        }
        public String getOp(){
            return op;
        }
        
        protected void setRs(double rs){
            this.rs = rs;
        }
        public double getRs(){
            return rs;
        }
        
        public abstract void exec();//计算的抽象方法
    }
    //加法器
    public class Add extends calc{
        @Override
        public void exec(){
            double rs =getNum1()+getNum2();
            setRs(rs);
        }
    }
    //减法器
    public class Diff extends calc{
        @Override
        public void exec(){
            double rs =getNum1()-getNum2();
            setRs(rs);
        }
    }
    //乘法器
    public class Mul extends calc{
        @Override
        public void exec(){
            double rs =getNum1()*getNum2();
            setRs(rs);
        }
    }
    //除法器
    public  class chuf extends calc {
        public void exec(){
            double rs =getNum1()/getNum2();
            setRs(rs);
        }
    }
    //计算器的业务逻辑类
    public class ClacBo{
        public static calc getCalc(String op){
            calc c = null;
            if(op.equals("+"))
                c = new Add();
            else if(op.equals("-"))
                c = new Diff();
            else if(op.equals("*"))
                c = new Mul();
            else if(op.equals("/"))
                c = new chuf();
            return c;
        }
    }
    import java.util.*;
    //Main
    public class App{
        public static void main(String[] args){
            Scanner kb = new Scanner(System.in);
            System.out.print("请输入第一个操作数:");
            double num1 = kb.nextDouble();
            System.out.print("请输入一个运算符:");
            String op = kb.next();
            System.out.print("请输入第二个操作数:");
            double num2 = kb.nextDouble();
            
            calc c = ClacBo.getCalc(op);
            
            c.setNum1(num1);
            c.setNum2(num2);
            c.setOp(op);
            c.exec();
            
            System.out.println("结果是:"+c.getRs());
        }
    }
  • 相关阅读:
    trap命令
    MySQL数据库中日期中包涵零值的问题
    MySQL锁等待分析【2】
    MySQL锁等待分析【1】
    mysql日志文件相关的配置【2】
    mysql日志文件相关的配置【1】
    Linux的标准输出、标准错误输出、nohup
    mysql在关闭时的几个阶段
    MHA环境搭建【4】manager相关依赖的解决
    keepalived+httpd 做web服务的高可用
  • 原文地址:https://www.cnblogs.com/ldm666/p/7922535.html
Copyright © 2011-2022 走看看