Fork me on GitHub

JavaSE Day08

JavaSE Day08 重载 和 构造方法


java中的注释

  1. 单行
  2. 多行
  3. 文档注释javadoc,为javadoc命令识别的;可以生成帮助文档;
    在idea中使用javadoc,Tools ---> generate javadoc;
    -encoding utf-8 -charset utf-8
    -w380
package day8;

package day8;

/**
 * 书类
 */
class Book {
    /**
     * 名称
     */
    private String title;
    /**
     * 页数
     */
    private int pageNum;

    /**
     * 名称的写访问器
     *
     * @param title 设置书的名称
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * 名称的读访问器
     *
     * @return 返回书的名称
     */
    public String getTitle() {
        return title;
    }

    /**
     * 页数的写访问器
     *
     * @param pageNum 设置页数的值
     */
    public void setPageNum(int pageNum) {
        if (pageNum >= 200) {
            this.pageNum = pageNum;
        } else {
            System.out.println("输入错误,页数不能少于200页");
            this.pageNum = 200;
        }
    }

    /**
     * 页数的写访问器
     *
     * @return 返回页数
     */
    public int getPageNum() {
        return pageNum;
    }

    /**
     * 显示名称 和 页数
     *
     * @return 名称 和 页数
     */
    public String show() {
        return this.title + "," + this.pageNum;
    }
}

/**
 * Book的测试类
 */
public class TestBook {
    /**
     * 测试类 主方法
     */
    public static void main(String[] args) {
        Book b1 = new Book();

        b1.setTitle("java");
        b1.setPageNum(50);
        System.out.println(b1.show());
        b1.setPageNum(250);
        System.out.println(b1.show());
    }
}

一个文件中定义多个类:

  1. 只能有一个public类,
  2. 包含主方法的类是public
  3. public所修饰的类的名字与文件名必须一致;

方法参数传递

  1. 值类型参数,基本数据类型
    1. 值不会受影响
  2. 引用类型参数
    1. 两个引用指向了同一个对象:值改变
    2. 两个引用指向不同的对象:值不变
package day8;

class Param {
    int value;

}

class B {

}

public class TestParam {
    public void f1(int n) {
        n = 22;
    }

    public  void f2(Param p){
        p.value =22;
    }
    public void f3(Param p){
        p = new Param();
        p.value = 22;
    }
    public static void main(String[] args) {
        TestParam t = new TestParam();
        // 1. 值
        int n = 11;
        t.f1(n);
        System.out.println(n);

        // 2. 引用
        Param p = new Param();
        p.value = 11;
        t.f2(p);
        System.out.println(p.value);

        //3.引用
        Param p1 = new Param();
        p1.value =11;
        t.f3(p1);
        System.out.println(p1.value);
    }

}

可变参数--jdk5.0 提出的

  1. 语法 :
  2. 底层是数组;
  3. 好处:传参的形式灵活;
  4. 位置:只能放再所有参数的最后;

可变参数 和数组参数的区别

  1. 数组作为参数 传参时只能传数组类型;
    可变参数 可以传数组,可以是一个值,可以是多个值,也可以不传值;
  2. 数组参数:可以有多个数组参数
    可变参数 只能有一个
  3. 数组参数,可以放在任何位置
    可变参数 只能放再所有参数的最后
    不同类型的可变参数,也只能有一个
package day8;

public class TestDemo1 {
    public int sum(int... args) {// 如果写成数组,那么在传参数的时候,参数也必须是数组;
        // 而写成... 则实参的类型可以不是数组;
        int sum = 0;
        for (int i = 0; i < args.length; i++) {
            sum += args[i];
        }
        return sum;
    }

    public int[] reverseArr(int[] arr) {
        int[] arr1  = new int[arr.length];
        for (int i = arr.length -1 ,j=0; i >=0 ; i--,j++) {
            arr1[j] = arr[i];
        }
        return arr1;

    }

    public static void main(String[] args) {
        TestDemo1 t = new TestDemo1();
        int sum = t.sum(11, 22, 33, 44, 55);
        System.out.println(sum);
        int[] m = {11,22,33,44,55};
        int[] m1 = t.reverseArr(m);
        for (int a:m1
             ) {
            System.out.println(a);
        }
    }
}

主方法传参

  1. public权限最大的
  2. Static 静态的
  3. Main 主方法,jvm调用;
  4. 用双引号引起来的表示一个参数;否则按照空格来区分参数的个数;
    -w452

封装

隐藏对象的属性和类中的实现细节,对外只提供公共的访问方式;

好处:

  1. 安全
  2. 方法中,可以有流程控制语句,控制数据的范围;
  3. 只能用提供的公共的访问方式访问;

访问器语法;(间接读)

  1. Public 类型 get属性名(){
        return 值;
    }
    
  2.   public void set属性名(类型 变量名){
        this.属性 = 变量;
      }
    				
    
  3. 可以在set方法中定义逻辑判断;

  4. 所以属性的值可以控制;(星号数量的作业)

this

  1. 当前类对象
  2. 作用
    1. 可以调用 本类成员;
    2. 区分同名的成员变量和局部变量;
    3. 调用本类构造器,this([参数]);
    4. 位置:
      1. 构造器中
      2. 构造器的第一行代码处;

方法重载

通常是在一个类中,方法名相同;参数列表不同(类型、个数、顺序);与返回值无关;

package day8;

public class TestOVerload1 {
    public  void f(byte n){
        System.out.println("byte");
    }
    public void f(short n){
        System.out.println("short");
    }
    public void f(int n){
        System.out.println("int");
    }
    public void f(long n){
        System.out.println("long");
    }
    public void f(float n){
        System.out.println("float");
    }
    public void f(double n){
        System.out.println("double");
    }
//    public  void f(int n1,double n2){
//        System.out.println("intdouble");
//    }
    public void f(double n1,int n2){
        System.out.println("doubleint");
    }
    // 不能根据返回值对方法进行重载;
//    public double f(double n1,int n2){
//        return 22.2;
//    }
    public static void main(String[] args) {
        TestOVerload1 t = new TestOVerload1();
        t.f(11);// int
        t.f((byte)11);// byte
        t.f(11L);// long
        t.f(11.1);// double
        t.f(11.1F);// float
        t.f(11,22);
        //t.f(11,22);// 自动类型转换,导致编译器不知道转换为那个方法;
    }
}

作用:

方便记忆

package day8;

public class TestOVerload1 {
    public  void f(byte n){
        System.out.println("byte");
    }
    public void f(short n){
        System.out.println("short");
    }
    public void f(int n){
        System.out.println("int");
    }
    public void f(long n){
        System.out.println("long");
    }
    public void f(float n){
        System.out.println("float");
    }
    public void f(double n){
        System.out.println("double");
    }
//    public  void f(int n1,double n2){
//        System.out.println("intdouble");
//    }
    public void f(double n1,int n2){
        System.out.println("doubleint");
    }
    // 不能根据返回值对方法进行重载;
//    public double f(double n1,int n2){
//        return 22.2;
//    }
    public static void main(String[] args) {
        TestOVerload1 t = new TestOVerload1();
        t.f(11);// int
        t.f((byte)11);// byte
        t.f(11L);// long
        t.f(11.1);// double
        t.f(11.1F);// float
        t.f(11,22);
        //t.f(11,22);// 自动类型转换,导致编译器不知道转换为那个方法;
    }
}

可变参数的重载:

  1. 可变参数 和数组是一回事,不能重载
  2. 调用int,为了代码的兼容(优先调用基础数据类型)
  3. 传参的值对于多个方法都适合时,编译提示出错;
package day8;

public class TestOverload3 {
    // 可变参数和数组是一回事,不能重载
//    public void f(int[] n){
//        System.out.println("int[]");
//    }
    // 2.调用int,为了代码的兼容
    public void f(int n){
        System.out.println(n);
    }
    public void f(int... n){
        System.out.println("int...");
    }
    // 3.传参的值对于多个方法都适合,编译提示出错;
    public void f(String... s){
        System.out.println("String");
    }
    public void f(TestOverload3... t){
        System.out.println("TestOverload3");
    }

    public static void main(String[] args) {
        TestOverload3 t = new TestOverload3();
        t.f(11);// 可变参数是5.0之后才出现的,为了代码的兼容一定调用int
        String s = null;
        //System.out.println(s.equals("abc"));
        TestOverload3 t3 = null;
        t.f(s);
        t.f(t3);
        //t.f(null);
        // null 可以给所有引用类型赋值,所以编译器不知道给那个方法传值;

    }
}

构造方法

语法:

访问修饰符 构造方法名(参数列表){
			//初始代码;
		}

分类:

  1. 默认构造器。
    1. 在定义类时,我们没有显示定义构造器,那么编译器会自动创建一个默认构造器;默认构造器是无参的,访问修饰符与类相同;
    2. 注意:只要在类中显示定义了构造器,那么默认构造器就不存在了
  2. 无参的
  3. 带参数的

作用:

  1. 初始化对象;
    给对象的成员变量分配空间并赋值;
  2. 注意:
    1. 名字与类名一致
    2. 不能定义任何的返回值类型;
    3. 调用:只有在创建对象 new时调用;
package day8;

class Person{
    private int age;
    private String sex;

    // ---------------------------
    // 无参构造;
    public Person(){
        //System.out.println("无参构造");
        this.age = 22;
        this.sex = "男";
    }

    //
    public Person(int age,String sex){
        this.age = age;
        if(sex.equals("男") || sex.equals("女")){
            this.sex = sex;
        } else{
            System.out.println(this.age + "输入错误");
            this.sex = "男";
        }

    }

    // ---------------------------
    //间接赋值  访问器 写访问器
    public void setAge(int age) { // int age = 22;
        if(age >= 0 && age <= 150) {
            this.age = age; // this.age = 22;
        } else{
            System.out.println("赋值出错了,必须0-150之间");
            this.age = -1;
        }
    }

    public void setSex(String sex) {
        if("男".equals(sex)||"女".equals(sex)) {
            this.sex = sex;
        } else{
            System.out.println("赋值出错,只能是男和女;");
            this.sex = "男";
        }
    }

    public String getSex() {
        return this.sex;
    }

    // 访问器 读访问器
    public int getAge() {
        return this.age;
    }

    public String show(){
        return  age + "," + sex;
    }
    // 公共的 pulic 权限最大,所有人都能够调用;
    // 私有的 private 访问级别最低;只能在定义他们的类中可见;
}
public class TestPerson {
    public static void main(String[] args) {
        // 调用过了 构造方法;构造器的访问权限与类的访问权限一样;
        Person zhangsan = new Person();
        Person lisi = new Person(33,"a");





        /*zhangsan.setAge(22);
        System.out.println();
        zhangsan.setSex("男");
        System.out.println(zhangsan.show());*/



    }
}

构造方法重载

package day8;

class Role {
    private String name;
    private int age;
    private String sex;
    private String job;
    // 声名处初始化
    private String address = "内蒙古";
    // 构造块   解决构造方法初始化 代码冗余的问题
    {
        address = "内蒙古";
    }

    public Role() {
        this.name = "匿名";
        //this.address = "内蒙古";
    }

    public Role(String job) {
        // 调用本类构造方法
        this();
        this.job = job;
    }

    public Role(String sex, int age, String job) {
        this(job);
        this.sex = sex;
        this.age = age;
    }

    public Role(String name, int age, String sex, String job, String address) {
        this(sex, age, job);
        this.name = name;
//        this.address = address;

    }

    public String show() {
        return name + "," + age + "," + sex + "," + job + "," + address;
    }
}

public class TestRole {
    public static void main(String[] args) {
        Role person = new Role();
        System.out.println(person.show());
        Role killer = new Role("杀手");
        System.out.println(killer.show());

        Role monk = new Role("男", 80, "扫地");
        System.out.println(monk.show());
        Role qiaofeng = new Role("乔峰", 22, "男", "丐帮帮主", "西安");
        System.out.println(qiaofeng.show());

    }
}

构造块

class 类{
	{
		构造块
		作用:解决多个构造器重载时;
			代码冗余问题
		执行:在创建对象时执行,
			先执行构造块;
			后执行构造器。
	}
}
package day8;


class Employee{
//    private int no;
//    private String name;
    private int age = 11;
    {
        age = 22;
//        System.out.println("我是构造块");
    }
    public Employee(){
//        System.out.println("我是构造器");
        age = 33;
    }

    public int getAge() {
        return age;
    }
}
public class TestEmployee {
    public static void main(String[] args) {
        Employee emp  = new Employee();
        System.out.println(emp.getAge());
    }
}

成员变量初始化过程

  1. 默认初始化 数据类型的默认值
  2. 按照代码执行顺序(从上到下)
    主要看 声明处,构造块的位置
  3. 最后执行构造器;

构造方法 和访问器的区别

  1. 构造器 在创建对象new的时候完成初始化;对象创建完了,值都有了
    访问器,在创建对象之后调用赋值;
  2. 构造器 在创建对象new的时候 可以一次性给所有的成员变量初始化;
    访问器,只能一个一个的赋值;
  3. 构造器 只能完成赋值,在创建对象后修改成员变量的值;
    访问成员变量的值,只能用访问器;

构造器 和普通方法的区别

  1. 构造器 就是为对象初始化的
  2. 普通方法是为了完成特定功能的;
  3. 构造器 只能在创建对象的时候才能调用;
  4. 普通方法用对象去调用;
posted @ 2018-10-03 00:50  耳_东  阅读(157)  评论(0)    收藏  举报