每種修飾符的作用范圍
private:只能在本類中使用
默認(不寫):能在本類中使用,又能在本包的其他類中使用
protected:本類、本包、不同包子類中使用
Public:任意包、任意類都可使用
需要注意:
1.private使用:定義成員變數需要私有
2.public使用:定義成員方法、構造方法、定義類
代碼塊
/**
代碼塊:被{}包裹起來的代碼叫代碼塊
區域代碼塊:寫在方法中的代碼塊
構造代碼塊:寫在成員位置(類中,方法外)的代碼塊
靜態代碼塊:寫再成員位置(類中方法外)被static修飾的代碼塊
*/
public class DemoStudent{
public static void main(String[] args){
/**
區域代碼塊作用:修飾變數的作用域提高效率
變數作用域:在變數所在的{}范圍內有效,出了作用域,就會被垃圾回收
*/
{
int a = 10;
System.out.println(a);
}
//System.out.println(a); //cannot resolve 'a'
System.out.println(s1.getName()+"\t"+s1.getAge()+"\t"+s1.getSex());
Student s2 = new Student();
System.out.println(s2.getName()+"\t"+s2.getAge());
Student s3 = new Student("李四",20);
}
}
public class Student{
private String name;
private int age;
private static String sex;
/**
構造代碼塊的特點:優先構造執行,每創建物件一次,就會執行一次
作用:1.可以成員變數賦值
2.可以把每個構造方法中共性的代碼提取出來,寫在構造代碼塊中
需求:無論是使用空引數|滿引數構造方法創建物件,都先列印10次HelloWord
*/
{
this.name = "張三";
this.age = "18";
System.ouut.println("構造代碼塊");
//構造方法中的共性代碼塊
/** for(int i = 0; i < 10; i++){
System.out.println("HelloWord");
}
*/
}
/**
靜態代碼塊:寫在成員位置(類中方法外)被static修飾的代碼塊
特點:
static修飾的成員屬于類,不屬于某個物件,無論創建多少次物件,只會執行一次
靜態優先加載到記憶體中,優先于構造代碼塊和構造方法執行
作用:
1.可以給靜態成員變數賦初始化值
2.在專案啟動程序中做一些初始化的設計(只執行一次 資料庫)
*/
static{
sex = "男";
System.out.println("靜態代碼塊");
}
public Student(){
/** for(int i = 0; i < 10; i++){
System.out.println("HelloWord");
}
*/
}
public Student(String name, int age){
this.name = name;
this.age = age;
System.out.println("Person滿引數構造方法!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static String getSex() {
return sex;
}
public static void setSex(String sex) {
Student.sex = sex;
}
}
Object類
Object類是類層次結構的根類(最頂層的類)
每個類都使用Object類作為超類,任何類直接或間接繼承了Object類
Object類的toString方法
public class Person extends Object{
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//alt+insert 重寫Object類的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
Object類中的常用成員方法
String toString() 回傳該物件的字串表示。
Object類toString方法的原始碼:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass().getName():使用反射技識訓取類的全類名(包名+類名) com.itheima.demo04Object.Person
"@":字串原樣輸出
hashCode():Object類中的方法,可以獲取物件的哈希值,哈希值是系統給出的一個隨機的十進制的整數 100000
Integer.toHexString(hashCode()):可以把十進制的整數轉換為十六進制 0-9 a-f
組合在一起:om.itheima.demo04Object.Person@AS12sdA(物件的地址值)
*/
public class Demo01ToString {
public static void main(String[] args) {
/**
Person類默認繼承了Object類,所以可以使用Object類中的toString方法
*/
Person p = new Person("迪麗熱巴",18);
String s = p.toString();
System.out.println(s);//com.llz.demo04Object.Person@4554617c | 1 | Person[name = 迪麗熱巴, age = 18]
//直接列印物件的名字,就是呼叫物件的toString方法
System.out.println(p);//p = p.toString() com.llz.demo04Object.Person@4554617c | 1 |Person[name = 迪麗熱巴, age = 18]
/**
注意:
以后查看一個類是否重寫toStirng方法,列印物件名看是否為地址值
是地址值:沒有重寫toString方法
不是地址值:重寫了toString方法
*/
String str = new String("aaaa");
System.out.println(str);//aaaa String類重寫了toString方法
Random r = new Random();
System.out.println(r);//java.util.Random@74a14482 Random類沒有重寫toString方法
Scanner sc = new Scanner(System.in);
System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][ma Scanner類重寫了toString方法
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);//[1, 2] ArrayList類重寫toString方法
}
}
Object類的equals方法
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//重寫Object類的equals方法,比較兩個物件的屬性(name,age)
public boolean equals(Object obj) {
/**
如果obj是this本身,那么沒有必須在比較屬性,直接回傳true,可以提高程式效率
*/
if(obj == this){
return true;
}
/**
如果obj的值是null,那么直接回傳false,可以提高程式的效率
*/
if (obj==null){
return false;
}
/**
為了防止型別轉換例外:ClassCastException: java.util.Random cannot be cast to com.itheima.demo04Object.Student
強轉之前使用instanceof關鍵字進行判斷
*/
if (obj instanceof Student){
/**
問題:多型==>多型無法訪問子類特有的成員==>需要向下轉型
Object obj = s2 = new new Student("韋德",38);
*/
Student s = (Student)obj;
//比較this(s1)和s(obj-->s2)兩個物件的屬性
boolean b = this.name.equals(s.name) && this.age == s.age;
return b;
}
//不是Student型別,直接回傳false
return false;
}
//快捷鍵alt+insert 重寫equals方法
/**@Override
public boolean equals(Object o) {
if (this == o){
return true;
}
//getClass() != o.getClass() 使用反射技術判斷物件的型別 相當于 obj instanceof Student
if (o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
if (age != student.age) {
return false;
}
return name != null ? name.equals(student.name) : student.name == null;
}*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
Obeject類中的常用方法:
boolean equals(Object obj) 指示其他某個物件是否與此物件“相等”。
Object類中的原始碼:
public boolean equals(Object obj) {
return (this == obj);
}
==:比較運算子
基本資料型別:比較的是值
參考資料型別:比較的是地址值
*/
public class Demo02Equals {
public static void main(String[] args) {
Student s1 = new Student("詹姆斯",35);
Student s2 = new Student("韋德",38);
//Student類繼承了Object類,可以使用Object類中的equals方法
System.out.println(s1);//com.llz.demo04Object.Student@4554617c
System.out.println(s2);//com.llz.demo04Object.Student@74a14482
boolean b = s1.equals(s2);
System.out.println(b);//false
s1 = s2;//把s2的地址值賦值給s1
System.out.println(s1);//com.llz.demo04Object.Student@74a14482
System.out.println(s2);//com.llz.demo04Object.Student@74a14482
b = s1.equals(s2);
System.out.println(b);//true
System.out.println("------------------------------");
Student s3 = new Student("馬爾扎哈",30);
Student s4 = new Student("馬爾扎哈",30);
System.out.println(s3);//com.llz.demo04Object.Student@1540e19d
System.out.println(s4);//com.llz.demo04Object.Student@677327b6
Random r = new Random();
//boolean b2 = s3.equals(s4);
//boolean b2 = s3.equals(r);
//boolean b2 = s3.equals(null);
boolean b2 = s3.equals(s3);
System.out.println(b2);//true
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277922.html
標籤:Java EE
下一篇:Go語言操作資料庫及其常規操作
