1. 程式人生 > >類的初始化練習和static關鍵字的用法

類的初始化練習和static關鍵字的用法

類的初始化過程

Student s = new Student();在記憶體中做了哪些事情?

載入Student.class檔案進記憶體

在棧記憶體為s開闢空間

在堆記憶體為學生物件開闢空間

對學生物件的成員變數進行預設初始化

對學生物件的成員變數進行顯示初始化

通過構造方法對學生物件的成員變數賦值

學生物件初始化完畢,把物件地址賦值給s變數

面向物件練習

定義一個類Demo,其中定義一個求兩個資料和的方法,定義一個測試了Test,進行測試。

/*

定義一個類Demo,其中定義一個求兩個資料和的方法,

定義一個測試了Test,進行測試。

變數什麼時候定義為成員變數:

如果這個變數是用來描述這個類的資訊的,那麼,該變數就應該定義為成員變數。

變數到底定義在哪裡好呢?

變數的範圍是越小越好。因為能及時的被回收。

*/

//方式1

/*

class Demo {

public int sum() {

int a = 10;

int b = 20;

int c = a + b;

return c;

}

}

*/

//方式1滿足了我們的要求,但是不好。

//因為參與操作的資料現在是固定的。

//方式2

/*

class Demo {

public int sum(int a,int b) {

return a + b;

}

}

*/

//方式2可以滿足我們的要求,但是呢我們學習過來面向物件的思想。

//我就再想,ab可不可以定義為成員變數呢?

//如果可以,我們再改進一版

class Demo {

int a;

int b;

publicint sum() {

return a + b;

}

}

//雖然這種方式可以,並且好像是符合了面向物件的思想。

//但是不好。

//因為我們曾經說過:類是一組相關的屬性和行為的集合。

//並且類是通過事物轉換過來的

//而類中的成員變數就是事物的屬性

//屬性是用來描述事物的

//同理:成員變數其實是用來描述類的。

//測試類

class Test {

public

staticvoid main(String[] args) {

//建立物件

//方式1測試

/*

Demo d = new Demo();

System.out.println(d.sum());

*/

//方式2測試

/*

Demo d = new Demo();

int a = 10;

int b = 20;

System.out.println(d.sum(a,b));

*/

//方式3測試

Demo d = new Demo();

d.a = 10;

d.b = 20;

System.out.println(d.sum());

}

}

定義一個長方形類,定義 求周長和麵積的方法,然後定義一個測試了Test2,進行測試。

/*

定義一個長方形類,定義 求周長和麵積的方法,

然後定義一個測試了Test2,進行測試。

長方形的類:

成員變數:

長,寬

成員方法:

求周長:(+)*2;

求面積:長*

注意:

import必須出現在所有的class前面。

*/

import java.util.Scanner;

class ChangFangXing {

//長方形的長

privateint length;

//長方形的寬

privateint width;

public ChangFangXing(){}

//僅僅提供setXxx()即可

publicvoid setLength(int length) {

this.length = length;

}

publicvoid setWidth(int width) {

this.width = width;

}

//求周長

publicint getZhouChang() {

return (length + width) * 2;

}

//求面積

publicint getArea() {

return length * width;

}

}

class Test2 {

publicstaticvoid main(String[] args) {

//建立鍵盤錄入物件

Scanner sc = new Scanner(System.in);

System.out.println("請輸入長方形的長:");

int length = sc.nextInt();

System.out.println("請輸入長方形的寬:");

int width = sc.nextInt();

//建立物件

ChangFangXing cfx = new ChangFangXing();

//先給成員變數賦值

cfx.setLength(length);

cfx.setWidth(width);

System.out.println("周長是:"+cfx.getZhouChang());

System.out.println("面積是:"+cfx.getArea());

}

}

定義一個員工類,自己分析出幾個成員,然後給出成員變數,構造方法,getXxx()/setXxx()方法,以及一個顯示所有成員資訊的方法。並測試。

/*

需求:

定義一個員工類,自己分析出幾個成員,

然後給出成員變數,構造方法,getXxx()/setXxx()方法,

以及一個顯示所有成員資訊的方法。並測試。

分析:

員工

成員變數:

員工編號,姓名,年齡

構造方法:

無參構造方法

成員方法:

getXxx()/setXxx()

show();

*/

class Employee {

//員工編號

private String employeeId;

//姓名

private String name;

//年齡

privateint age;

//構造方法

public Employee() {}

//getXxx()/setXxx()

public String getEmployeeId() {

return employeeId;

}

publicvoid setEmployeeId(String employeeId) {

this.employeeId = employeeId;

}

public String getName() {

return name;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getAge() {

return age;

}

publicvoid setAge(int age) {

this.age = age;

}

//顯示所有成員資訊的方法

publicvoid show() {

System.out.println("員工編號是:"+employeeId+"的這個人是:"+name+"的年齡是:"+age);

}

}

class EmployeeTest {

publicstaticvoid main(String[] args) {

//建立物件

Employee e = new Employee();

//給成員變數賦值

e.setEmployeeId("czbk9527");

e.setName("唐伯虎");

e.setAge(18);

//獲取資料

//System.out.println(e.getEmployeeId()+"---"+e.getName()+"---"+e.getAge());

//我們在Employee類中定義了一個show方法。所以,我們改進一下,使用show方法

e.show();

}

}

定義一個類MyMath,提供基本的加減乘除功能,然後進行測試。

/*

定義一個類MyMath,提供基本的加減乘除功能,然後進行測試。

*/

import java.util.Scanner;

class MyMath {

//加法功能

publicint add(int a,int b) {

return a + b;

}

//減法功能

publicint sub(int a,int b) {

return a - b;

}

//乘法功能

publicint mul(int a,int b){

return a * b;

}

//除法功能

publicint div(int a,int b) {

return a / b;

}

}

//測試類

class MyMathTest {

publicstaticvoid main(String[] args) {

//建立鍵盤錄入物件

Scanner sc = new Scanner(System.in);

System.out.println("請輸入第一個運算元:");

int firstNumber = sc.nextInt();

System.out.println("請輸入第二個運算元:");

int secondNumber = sc.nextInt();

//建立MyMath物件,並使用

MyMath mm = new MyMath();

System.out.println("加法結果:"+mm.add(firstNumber,secondNumber));

System.out.println("減法結果:"+mm.sub(firstNumber,secondNumber));

System.out.println("乘法結果:"+mm.mul(firstNumber,secondNumber));

System.out.println("除法結果:"+mm.div(firstNumber,secondNumber));

}

}

static關鍵字

可以修飾成員變數和成員方法

static關鍵字特點

     隨著類的載入而載入

     優先於物件存在

     被類的所有物件共享

         這也是我們判斷是否使用靜態關鍵字的條件

     可以通過類名呼叫

static關鍵字注意事項

     在靜態方法中是沒有this關鍵字的

     靜態方法只能訪問靜態的成員變數和靜態的成員方法

/*

定義一個人類

姓名和年齡都是變化的,這個我能接收,因為每個人的姓名和年齡是不同的。

但是,我們現在選取的幾個人都是中國人,他們的國籍是一樣的。

一樣的國籍,我每次建立物件,在堆記憶體都要開闢這樣的空間,

我就覺得有點浪費了。怎麼辦呢?

針對多個物件有共同的這樣的成員變數值的時候,

Java就提高了一個關鍵字來修飾:static

*/

class Person {

//姓名

String name;

//年齡

int age;

//國籍

//String country;

static String country;

public Person(){}

public Person(String name,int age) {

this.name = name;

this.age = age;

}

public Person(String name,int age,String country) {

this.name = name;

this.age = age;

this.country = country;

}

publicvoid show() {

System.out.println("姓名:"+name+",年齡:"+age+",國籍:"+country);

}

}

class PersonDemo {

publicstaticvoid main(String[] args) {

//建立物件1

Person p1 = new Person("鄧麗君",16,"中國");

相關推薦

初始練習static關鍵字用法

類的初始化過程 Student s = new Student();在記憶體中做了哪些事情? 載入Student.class檔案進記憶體 在棧記憶體為s開闢空間 在堆記憶體為學生物件開闢

C++從靜態物件的初始順序理解static關鍵字

問題 首先考慮一個全域性變數的初始化順序問題 在標頭檔案1中: extern int b; int a = b + 1; 在標頭檔案2中: extern int a; int b = a + 1; 原始檔中包含了標頭檔案1和標頭檔案2,這種情況下a和b可能的值是什麼呢? 雖然在開發過程一般不會出現上述這

Java基礎4——深入理解final關鍵字static關鍵字以及初始順序

深入理解final關鍵字和static關鍵字以及初始化順序 final關鍵字(基礎1中提到) final關鍵字可以修飾類、方法和引用。 修飾類,該類不能被繼承。並且這個類的物件在堆中分配記憶體後地址不可變。 修飾方法,方法不能被子類重寫。 修飾引用,引用無法改變,對於基本型別,無法修

C++構造函數對成員變量初始,使用初始列表構造函數內部直接賦值 的差別

初始化列表 不能 構造 調用 ron 二次 art size strong 初始化和賦值對內置類型的成員沒有什麽大的差別,像任一個構造函數都能夠。但有的時候必須用帶有初始化列表的構造函數: (1) 成員類型是沒有默認構造函數的類。若沒有提供顯式初始化時,則編譯器隱式

super 子初始例子

n) elf flag python highlight 初始 class PE bject # #重寫父類初始化 class Person(object): def __init__(self, flag=False, name="jim"):

初始構造器初始的區別

zed ali ati ise reat div cto 練習 diff // initialization/ConstructorTest2.java // TIJ4 Chapter Initialization, Exercise 2, p158 /* Create

初始例項初始過程

類初始化過程①,一個類要建立例項需要先載入並初始化該類--》main方法所在的類需要先載入和初始化②,一個子類要初始化需要先初始化父類③,一個類初始化就是執行<clinit>() 方法--》<clinit>() 由靜態類變數賦值程式碼和靜態程式碼塊組成--》靜態類變數賦值程式碼和靜態程

OC學習篇之---初始方法點語法的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++中的預設建構函式初始列表呼叫父建構函式

預設建構函式:未提供顯式初始值時,用來建立物件的建構函式。 class testClass { public:     testClass();               

Java初始例項

摘要: Java有以下幾種方式建立類物件: 利用new關鍵字 利用反射Class.newInstance 利用Constructor.newIntance(相比Class.newInstance多了有參和私有建構函式) 利用Cloneable/Object.clone() 利

java中子初始流程(包括靜態區非靜態區)

一. 類中的方法分為例項方法和類方法兩種,用static修飾的是類方法。二者有什麼區別呢? 例項方法:        當類的位元組碼檔案被載入到記憶體時,類的例項方法不會被分配入口地址,當該類建立物

Objc的載入初始(+load+initialize方法)

作為一個程式設計師,絕大多數時候你都不需要關心一個類是怎麼被載入進記憶體的。這裡面 runtime linker 在你的程式碼還沒跑起來之前就已經做了很多複雜的工作。 對於大多類來說,知道這一點就已經相當足夠了。但是,有一些類可能需要做一些特殊的準備工作。比如初始化一個全域性的表,從 UserDefau

Java基礎學習系列-Java初始例項

Java有以下幾種方式建立類物件: 利用new關鍵字 利用反射Class.newInstance 利用Constructor.newIntance(相比Class.newInstance多了有參和私有建構函式) 利用Cloneable/Object.clon

初始初始方法(init與deinit)

//: Playground - noun: a place where people can play // 1. init() 類的初始化(構造方法) // 使用預設的建構函式 class Student { // 類屬性 var n

python2,python3子呼叫父初始函式的方法注意事項

python2、python3: python子類呼叫父類初始化函式有兩種方式,以下程式碼在python2和python3都能執行: class A(object): def __init__(self, x): self.x = x # 方法

03_javaSE面試題:初始例項初始

題目 下面程式碼執行的結果是什麼? Father 類 /** * @author kevin * @date 2019/7/8 15:48 */ public class Father { private int i = test(); private static int j = m

02.初始倉庫提交

配置 目錄 sta files pda 添加文件 追蹤 str ssa 初始化創庫 $ git init// 或者clone一個已經存在的倉庫到本地$ git clone [email protected]/* */.com:Wesly186/JianDuAp

Java中static關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

Java基礎之finalstatic關鍵字

推薦 構造方法 其他 如果 靈活 位置 map 機制 lis 一、final 根據程序上下文環境,它可以修飾非抽象類、非抽象類成員方法和變量。 final類不能被繼承,沒有子類,final類中的方法默認是final的。 final

Chapter5_初始與清理_this關鍵字

靜態方法 訪問 過程 scu pan 表示 lte span 編譯   this關鍵字是Java中一類很特殊的關鍵字,首先它只能在方法內使用,用來表示調用這個方法的對象,在這一點上this和其他對對象的引用的操作是相同的。我們之所以可以在方法內部訪問到它是因為編譯器在方法調