zoukankan      html  css  js  c++  java
  • 类与对象

    import java.io.Console;
    import java.time.*;
    import java.util.*;
    
    class Employee{
        private String name;
        
        // final 变量要么在定义的时候赋值,要么在构造函数里初始化,否则会报错
        private final String f_name;
        
        private final StringBuilder sb;
        
        // shared by all the instance, 静态域 == 类域
        private static int count = 0;
        
        // 静态常量
        public static final double PI = 3.1411592654;
        
        // 初始化顺序: 定义时的默认值 -> 初始化块 -> 构造函数
        // 初始化块先于构造函数执行
        // static 初始化块用于初始化静态变量,不能初始化实例变量
        {
            name = "haha";
            System.out.println("in initial block");
        }
        
        // 构造函数一旦定义,就不会用系统默认的那个无参的构造函数
        // this 指向所构造的对象, this(name) 可以调用别的构造函数
        public Employee(String n) {
            this.name = n;
            f_name = "where am I";
            sb = new StringBuilder();
            
            // final 表示 sb 不能再指向别的StringBuilder了,但是可以更改sb中的内容
    //        sb = new StringBuilder();  // no!
            sb.append("test");
            System.out.println("in constructor");
        }
        
        // other 的 name是私有的,类的方法可以访问类的任何私有变量
        public boolean equals(Employee other) {
            return name.equals(other.name);
        }
        
    //    静态方法,不能访问实例域,不能操作对象,可访问静态域
        public static int sum(int a, int b) {
            return a + b;
        }
        
        public void setName(String n) {
            name = n;
        }
        
    //    Java不支持析构器,自动回收
        
        // 方法名和参数类型构成了方法的签名,返回类型不是签名的一部分
        
        // java Employee 也可以单独执行这个
        public static void main(String[] args) {
         System.out.println("In Employee");
       }
    }
    public class Test{
        
        // Java按值传参,如果参数为基本主类型,则在这里面的操作不会更改原参数
        // 如果参数为对象(实际上为一个引用),则可以更改, 但是依然传的是值,不是引用
        // 不能让对象参数引用一个新的对象,只能改变这个对象的状态
        public static void changeEName(Employee e) {
            e.setName("Java");
        }
        public static void main(String[] args) {
            //类之间的关系
            // use-a 依赖 a调用b
            // has-a 聚合 a包含b
            // is-a  继承 
            
            // 编译的问题,如果文件组织形式是这样的:
            // -ETest (main)
            // -E
            // ETest中用了E,只需要 javac ETest.java即可在编译ETest的过程中发现没有E,继续编译E
            // 如果 E.java比E.class新,也会重新编译
            
            // public: 任何类的任何方法都能调用
            // private: 只有这个类自身的方法能够调用访问
            
            // 构造器与类同名,没有返回值
            // 不要在构造器中命名与实例域同名的变量
            
            // 不要编写返回引用可变对象的方法,如果一定要返回,则要先克隆,再返回
            // return xx.clone();
            
            // System.out 也是静态常量
            System.out.println(Employee.PI);
            
            System.out.println(Employee.sum(1,6));
            
            Employee e = new Employee("ck");
        }
    }

     包

    使用包的作用:确保类名的唯一性
    没有在源文件中放置package语句,则这个源文件中的类就被放置在默认包中。
    默认包没有名字

     

    权限控制:默认的类,方法或者变量可以被同一个包中的所有方法访问

    由于类中的变量在不加权限的情况下可以被包中的其他类看见,所以必须显式地添加private

     

    (这地方可使用通配符*)

    编译器和虚拟机的行为不同:

    虚拟机的搜索顺序:

    编译器的搜索顺序:

    以用户顺序为优先,同样import则平等关系

    非默认包,不声明package,则报错

    如果从当前包中导入一个类,编译器就会搜索当前包中的所有源文件,以确定哪个源文件定义了这个类

    类的设计技巧:

    保证数据私有,保持封装;

    要初始化数据,不能依赖默认类型;

    不要在类中使用较多的基本类型,要用类替换;

  • 相关阅读:
    AutoMapper用法
    这些基础却重要的面向对象概念,你还记得多少
    Ajax工作原理
    CSS中的绝对定位与相对定位
    NET中的Memcached.ClientLibrary使用详解
    经典Linq实例语句
    软件工程的意义
    C#.Net Mvc运营监控,计算方法/接口/action/页面执行时间
    属性与字段的区别
    SQL 递归树 子父节点相互查询
  • 原文地址:https://www.cnblogs.com/geeklove01/p/10021856.html
Copyright © 2011-2022 走看看