注释:
上一篇是《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 抽象类》。
也欢送大家交换探讨,该文章若有不正确的中央,心愿大家多多包涵。
你们的反对就是我最大的能源,如果对大家有帮忙给个赞哦~~~