乐趣区

关于java:鹅厂疯子整理了万字Java笔记小白硬核资源基础知识已入门

注释:

上一篇是《Java 基础教程、Java 包(package)、Eclipse 装置教程》,敌人们了解得怎么样?这篇分享的是《java 拜访权限和 javaObject》,接下来咱们间接进入技术性主题。

接下来开始明天的分享:

Java 拜访权限

公共类和非公共类

应用 public 润饰的类为公共类, 没有应用 public 润饰的类为非公共类。

公共类的利用场景

如果这个类想要在其余包中应用就定义为公共类

非公共类只能在以后包中应用

Java 类成员的拜访权限

在定义类的成员时, 遵循拜访权限最小化的准则。

如果想在任意地位都能够应用, 就定义为 public 公共的。

如果想在以后类和派生类中都能够间接应用, 就定义为 protected 受爱护的。

package com.bjpowernode.chapter01.demo02.p1;
public class Father {
    private int xx = 10;        // 公有的, 只能在以后类中应用
    int yy =  20;                // 默认的, 能够在以后包中应用
    protected int zz = 30;        // 受爱护的, 以后包 / 派生类中应用
    public int oo = 40;            // 公共的, 任意地位
    // 在以后类中
    public void m1() {System.out.println( xx);
        System.out.println(yy);
        System.out.println(zz);
        System.out.println(oo);
    }
}
package com.bjpowernode.chapter01.demo02.p1;
/**
 * 测试拜访以后包中 Father 类的成员权限
 *     在同一个包中, 能够应用默认权限 / 受爱护权限 / 公共权限的成员 , 不能应用公有成员
 * @author Administrator
 *
 */
public class Test {public static void main(String[] args) {
        // 创立 Father 类的对象
        Father f = new Father();
        // 拜访 f 的实例成员
        System.out.println(f.xx);      //The field(字段 / 域) Father.xx is not visible(不可见), 没有拜访权限
        System.out.println(f.yy);    
        System.out.println(f.zz);
        System.out.println(f.oo);
    }
}
package com.bjpowernode.chapter01.demo02.p2;
import com.bjpowernode.chapter01.demo02.p1.Father;
/**
 * 在 p2 包中, 测试拜访 p1 包中 Father 类的成员权限
 *         只能拜访公共成员 
 * @author Administrator
 *
 */
public class Test02 {public static void main(String[] args) {Father f = new Father();    
        // 拜访 f 的成员变量
        System.out.println(f.xx);      //The field(字段 / 域) Father.xx is not visible(不可见), 没有拜访权限
        System.out.println(f.yy);    
        System.out.println(f.zz);
        System.out.println(f.oo);
    }
}
package com.bjpowernode.chapter01.demo02.p3;
import com.bjpowernode.chapter01.demo02.p1.Father;
/**
 * p3 包中定义 Son 类, 继承 p1 包中的 Father 类
 *         子类继承了父类, 就主动领有了父类的实例变量与实例办法
 *         Son 类从 Father 类继承了四个实例变量:xx,yy,zz,oo, 和一个实例办法: m1()
 * @author Administrator
 *
 */
public class Son extends Father {
    //Son 类从 Father 类继承了四个实例变量:xx,yy,zz,oo
    // 子类的实例办法
    // 因为继承, 所有主动领有, 是否可能间接应用, 跟拜访权限无关
    public void sm() {System.out.println( xx);
        System.out.println(yy);
        System.out.println(zz);         // 受爱护的
        System.out.println(oo);
    }
}

Java 办法笼罩中的拜访权限

Java 拜访笼罩 (重写) 的规定:

● 子类办法签名必须和父类办法统一, 办法签名就是办法名与参数列表

● 子类办法的返回值类型能够和父类办法返回值类型一样, 也能够是父类办法返回值类型的子类型

● 子类办法的拜访权限能够和父类办法拜访权限雷同, 也能够比父类办法拜访权限更宽泛(更大)

如果父类办法是 public 润饰, 子类办法只能是 public 润饰

如果父类办法是 protected 润饰, 子类办法能够 protected/public 润饰

● 子类办法的异样不能比父类办法的异样更大

Java Object 类

Java 中 Object 类的办法

protected Object:clone() 对象的克隆

boolean:equals(Object obj) 判断对象的内容是否一样.

protected void:finalize() 当垃圾回收器回收这个对象时, 会调用该办法

Class<?>:getClass() 返回对象的运行时类.

int:hashCode() 返回对象的哈希码.

void:notify() 唤醒期待中的线程

void:notifyAll() 

String:toString() 把对象转换为字符串.

void:wait() 线程期待

● clone()

对象克隆, 是在堆中再创立一个齐全一样的对象

● finalize()

当一个对象没有变量援用它时, 垃圾回收器就会把这个对象开释, 回收该对象时会调用对象的 finalize()办法, 垃圾回收器在什么时候回收这个对象不确定, finalize()办法的执行工夫不确定, 该办法个别不必

● wait()/notify()

线程期待 / 唤醒线程

● getClass()

返回对象的运行时类对象

把所有小狗能够形象为 Dog 类, 把所有小猫形象为 Cat 类, 把所有人形象为 Person 类, 把 Dog/Cat/Person/String/System 等所有的类进一步形象为 Class 类. Class 类形容的是所有类的雷同的特色

getClass()办法返回以后对象对应的 Class 对象

以后前能够简略地把 getClass()办法了解为返回对象的类, 或者了解为返回对象对应的类的字节码文件, 能够利用这个办法判断两个对象的类是否是同一个类

Person  p1 = new Person();
Person  p2  =  new Person();
if(p1.getClass() == p2.getClass()){p1 和 p2 是同一个类型的对象}

● toString()

作用是把对象转换为字符串

当应用 Sytem.out.println(obj)打印对象时, 会调用 obj 对象的 toString()办法

toString()默认显示残缺类名 @十六进制数, 如果想要打印 obj 对象的各个字段值, 须要重写 toString()

应用 Sytem.out.println(obj)打印对象时, 如果显示的内容不是残缺类名 @哈希码十六进制模式时, obj 的类或者父类必定重写过 toString()办法

package com.bjpowernode.chapter01.demo03;
import java.util.ArrayList;
/**
 * 测试 toString()办法
 * @author Administrator
 *
 */
public class Test01 {public static void main(String[] args) {
        // 创立 Person 对象
        Person lisi = new Person("lisi", 18, "男");
        // 在屏幕上打印 lisi
        System.out.println(lisi);
        /*
         * 输入后果:
         *         com.bjpowernode.chapter01.demo03.Person@15db9742
         *             残缺类名 @ 十六进制数    
         * 剖析:
         *         1) 在应用 System.out.println()打印一个对象时, 在 println()办法体中, 先把对象转换为字符串再打印
         *             调用了 String 类的 valueOf()办法
         *         2)在 String 类的 valueOf()办法中, 调用了对象的 toString()办法
         *             toString()办法是从 Object 类继承来的
         *         3)在 Object 类中, toString()办法返回以下内容:
         *             getClass().getName() + "@" + Integer.toHexString(hashCode())
         *             运行时类的残缺类名 + "@" + 哈希码的十六进制
         * 论断:
         *         当应用 System.out.println()打印一个对象时, 会调用对象的 toString()办法
         * 需要:
         *         当应用 System.out.println()打印一个对象时, 显示该对象的各个字段值(各个成员变量值)
         */
        // 下面一行, 相当于上面这一行,
        System.out.println(lisi.toString() );
        //toString()是从 Object 继承来的, 默认显示残缺类名 , 想要显示各个字段值 , 须要在子类中重写 toString()
        // 当子类从父类继承的办法, 满足不了子类需要时, 须要重写该办法
        String s1 = "feifei";
        System.out.println(s1);     //feifei, 显示不是残缺类名,String 类应该重写了 toString()办法
        Integer num = new Integer(456);
        System.out.println(num);     //456
        ArrayList list = new ArrayList<>();
        System.out.println(list); //[], ArrayList 的爷爷类 AbstractCollection 重写了 toString()    
    }
}
package com.bjpowernode.chapter01.demo03;
public class Person {
    String name;
    int age;
    String gender;             // 性别  
    public Person() {}
    public Person(String name, int age, String gender){
        this.age = age;
        this.name = name;
        this.gender = gender;
    }
    // 重写 toString()办法
    @Override                        // 注解, 验证重写是否正确
    public String toString() {return "name:" + name + ",age:" + age + ",gender:" + gender;}
}

● equals()

应用关系运算符 == 判断两个援用是否指向堆中的同一个对象

用 equals()办法判断两个对象的内容是否一样, 即各个字段值是否相等

如果两个类须要应用 equals()判断两个对象是否一样时, 须要重写 equals()办法

就像之前判断两个字符串是否一样时, 须要调用 equals()办法, String 类曾经重写过 equals()办法了

package com.bjpowernode.chapter01.demo03;
public class Book {
    String name;
    String author;
    String press;
    double price;    
    public Book(String name, String author, String press, double price) {
        this.author = author;
        this.name = name;
        this.press = press;
        this.price = price;
    }
    // 重写 equals()办法
    @Override
    public boolean equals(Object obj) {
        // 顺次判断两个对象的内容, 如果一个不雷同的就返回 false, 如果都雷同就返回 true
        //1)两个变量援用同一个对象, 返回 true
        if (this == obj) {return true;}
        //2)参数为 null, 返回 false
        if (obj == null) {return false;}
        //3) 如果参数对象和以后对象不是同一个类型, 返回 false
        if (this.getClass() != obj.getClass()) {return false;}
        //4) 以后对象与参数对象类型一样, 如果有一个字段的值不相等, 就返回 false
        // 先把 obj 对象转换为 Book 类型
        Book other = (Book) obj;
        // 判断书名, 如果书名不一样就返回 false
        if (this.name == null) {if ( other.name != null) {return false;             // 以后书名为 null, 参数对象书名不为 null 返回 false}            
        }else if (!this.name.equals(other.name) ) {   // 以后书名不为 null, 与参数对象的书名不一样 返回 false
            return false;
        }
        // 判断作者, 如果作者不一样就返回 false
        if (this.author == null){if (other.author != null) {return false;}
        }else if (!this.author.equals(other.author)) {return false;}
        // 判断出版社
        if (this.press == null) {if (other.press != null) {return false;}
        }else if (!this.press.equals(other.press)) {return false;}
        // 判断价格,price 字段是一个小数, 在计算机 中小数采纳近似值保留, 不精确, 不能间接 应用 == 判断
        // 能够比拟两个小数的差值, 依据差值是否小于指定的阈值, 来判断两个小数是否相等
        if (this.price - other.price > 0.01 || other.price - this.price > 0.01) {return false;         // 两本书的差值大于 0.01 元就认为不相等}    
        return true;
    }
}
package com.bjpowernode.chapter01.demo03;
/**
 * 测试 equals()办法
 * @author Administrator
 *
 */
public class Test02 {public static void main(String[] args) {
        Book myBook1 = new Book
        Book myBook2 = new Book
        System.out.println(myBook1 == myBook2);         //false
        /*
         * 关系运算符 ==, 判断两个变量的值是否相等  ,
         * myBook1 变量存储堆中的一个对象的援用, myBook2 变量存储另外一个对象的援用
         */
        // 需要: 判断堆中两个对象的内容是否一样, 能够调用 equals()办法, 该办法是从 Object 类继承的, Object 类中 equals()依据 == 判断是否相等
        System.out.println(myBook1.equals(myBook2) );     
        Book myBook3 = myBook1;            // 两个变量援用堆中同一个对象
        System.out.println(myBook1.equals(myBook3));          //true        
        Book mybook4 = null;
        System.out.println(myBook1.equals(mybook4));        //false        
        Person  lisi = new Person();
        System.out.println(myBook1.equals(lisi));          //false    
        Book myBook5 = new Book
        System.out.println(myBook1.equals(myBook5));          //true        
    }
}

● hashCode()

依据哈希约定, 如果两个对象 equals()相等, 这两个对象的哈希码也应该相等

在重写 equals()办法时, 必须同时重写 hashCode()

下面就是《java 拜访权限和 javaObject》的分享,接下来为大家梳理《Java 中 final 关键字的作用和 Java 抽象类》。

也欢送大家交换探讨,该文章若有不正确的中央,心愿大家多多包涵。

你们的反对就是我最大的能源,如果对大家有帮忙给个赞哦~~~

退出移动版