Java 類與物件全解析
阿新 • • 發佈:2019-02-01
如何建立物件和如何書寫一個類?
程式碼舉例:
public class Demo01 {
public static void main(String[] args) {
//例項化一個物件 名字為 animal
Animal animal = new Animal();
//如何訪問成員變數? 物件.變數 物件建立在堆記憶體有初始值
//如果成員變數在 = 前面叫賦值 如果在等號後面叫獲取
animal.name = "來福";
//獲取成員變數
System.out .println(animal.name);
//呼叫方法
animal.sayHi();
animal.sleep();
animal.eat();
}
}
// 建立一個動物類
class Animal{
//成員變數的作用域 整個類中都能訪問到
String name = "旺財"; //動物的姓名
int age = 2; //動物的年齡
String gender = "公"; //性別
//成員方法
public void sayHi() {
System.out.println("名字:" + name);
System.out.println(age +"歲");
System.out.println("性別:" + gender);
}
//睡覺
public void sleep() {
String name = "小強"; //區域性變數
System.out.println(name + "在睡覺" );
}
//吃飯
public void eat() {
System.out.println(name + "在吃飯");
}
}
上面我們具體程式碼舉例了寫一個類和如何示例一個類.在程式碼中有引入了 成員變數和區域性變數概念 它們具體有什麼區別呢?
書寫位置
成員變數:在類中方法外
區域性變數:在類中方法內或方法宣告上記憶體位置
成員變數:在堆記憶體中
區域性變數:在棧記憶體中.初值
成員變數:有預設值(堆賦予的)
區域性變數:無預設值 如果要使用 必須要給初值- 生命週期
成員變數: 隨著物件的建立而建立 隨著物件的銷燬而銷燬
區域性變數: 隨著方法存在
有些時候一些方法需要傳參,那就建立這個引數傳進去 當引數為引用資料型別(類) 需要建立這個物件 然後將它傳進去(傳入的為記憶體地址!)
程式碼舉例:
public class Demo03 {
public static void main(String[] args) {
//匿名物件 new Person()
//只調用方法 這時可以使用匿名物件(測試的時候會用)
//可以當做引數進行傳遞
//好處:當引數的時候 程式碼簡單 壞處:無法直接修改裡面的值
new Person().name ="james";
new Person().sayHi();
Person p1 = fun("Tom", new Person());
p1.sayHi();
}
//封裝一個更改name的方法
public static Person fun(String name) {
Person person = new Person();
person.name = name;
person.sayHi();
return person;
}
//函式的過載 功能同上 Person person 實際上和 Person person = new Person() 相同的
public static Person fun(String name, Person person) {
// = 後面的為傳入引數name 右邊的為Person類中的name 和第一個封裝方法一樣
person.name = name;
return person;
}
}
//建立一個類
class Person{
String name = "peter";
int age = 16;
//方法
public void sayHi() {
System.out.println("姓名:" + name + " " + "年齡:" + age);
}
}
從上面我們可以看出 類中的屬性 好像只要例項化誰都可以拿來取值賦值 能不能避免這樣呢?
當然可以,只需要在屬性前面加一個關鍵字就可以了 —private 私有的
我們來看看程式碼中是如何實現的
public class Dmoe04 {
public static void main(String[] args) {
Student student = new Student();
//使用 set/get 方法
student.setName("jamea");
student.setAge(18);
System.out.println(student.getName());
student.sayHi();
}
}
//建立類
class Student{
// 成員變數私有化(只能本類進行訪問 本類以外無法訪問)
//不能通過物件點屬性來直接訪問 但是可以通過方法來間接訪問
private String name;
private int age;
// get/set方法 命名規範 以set /get 開頭 小駝峰
//獲取
public String getName() {
return name;
}
//修改
public void setName(String name) {
//提供關鍵字 this 代表本類的物件
// 哪個物件呼叫方法 這個物件就是this
this.name = name;
//這裡 = 右邊的name 是傳入的引數 左邊的相當於 student.name
//this 用來區分兩個name
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 就近原則(這裡會列印區域性變數)
public void sayHi() {
String name = "猜猜我是誰?";
System.out.println(name + " " + age);
}
}