成員變量 vs 局部變量前端
提供某種功能的實現java
public void eat(){//方法體} public String getName(){} public void setName(String n){} //格式:權限修飾符 返回值類型(void:無返回值/具體的返回值) 方法名(形參){}
/* * 4. 對象數組題目: 定義類Student,包含三個屬性:學號number(int),年級state(int),成績score(int)。 建立20個學生對象,學號爲1到20,年級和成績都由隨機數肯定。 問題一:打印出3年級(state值爲3)的學生信息。 問題二:使用冒泡排序按學生成績排序,並遍歷全部學生信息 提示: 1) 生成隨機數:Math.random(),返回值類型double; 2) 四捨五入取整:Math.round(double d),返回值類型long。 * * * // 兩位數的,隨機數 10 - 99 公式:【a,b】 : Math.random()*(b-a+1)+a 再強轉數據類型。 * */ public class StudentTest { public static void main(String[] args) { // 聲明Student類型的數組 Student[] stu = new Student[20]; for (int i = 0; i < stu.length; i++) { // 給數組元素賦值 stu[i] = new Student(); stu[i].number = i + 1; // [1,6] stu[i].state = (int) (Math.random() * (6 - 1 + 1) + 1); // [0,100] stu[i].score = (int) (Math.random() * (100 - 0 + 1)); } StudentTest test = new StudentTest(); // 問題1 test.searchState(stu,3); System.out.println("------------------------"); // // 問題2 test.sort(stu); test.print(stu); } // 遍歷學生數組 public void print(Student[] stu) { for (int i = 0; i < stu.length; i++) { System.out.println(stu[i].info()); } } /** * * @Description 查找指定年紀的學生 * @author MD * @date 2020年7月6日下午12:02:56 * @param stu 查找的數組 * @param state 指定的年紀 */ public void searchState(Student[] stu, int state) { for (int i = 0; i < stu.length; i++) { if (stu[i].state == 3) System.out.println(stu[i].info()); } } public void sort(Student[] stu) { for (int i = 0; i < stu.length - 1; i++) { for (int j = 0; j < stu.length - i - 1; j++) { if (stu[j].score <= stu[j + 1].score) { // 注意,這裏交換的不是成績而是對象 Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } } } class Student { int number; int state; int score; public String info() { return "學號:" + number + " 年級:" + state + " 分數:" + score; } }
要求:
* 同一個類中
* 方法名必須相同
* 方法的參數列表不一樣(①參數的個數不一樣②參數類型不一樣)
補充:方法的重載與方法的返回值類型沒有關係!面試
//以下的四個方法構成重載 //定義兩個int型變量的和 public int getSum(int i,int j){ return i + j; } //定義三個int型變量的和 public int getSum(int i,int j,int k){ return i + j + k; } //定義兩個double型數據的和 public double getSum(double d1,double d2){ return d1 + d2; } //定義三個double型數組的和 public void getSum(double d1,double d2,double d3){ System.out.println(d1 + d2 + d3); } //不能與如上的幾個方法構成重載 // public int getSum1(int i,int j,int k){ // return i + j + k; // } // public void getSum(int i,int j,int k){ // System.out.println(i + j + k); // } //如下的兩個方法構成重載。 public void method1(int i,String str){ } public void method1(String str1,int j){ }
//以下四個方法構成重載 //在類中一旦定義了重載的可變個數的形參的方法之後,以下的兩個方法能夠省略 // public void sayHello(){ // System.out.println("hello world!"); // } // public void sayHello(String str1){ // System.out.println("hello " + str1); // } //可變個數的形參的方法 public void sayHello(String ... args){ for(int i = 0;i < args.length;i++){ System.out.println(args[i] + "$"); } //System.out.println("====="); } public void sayHello(int i,String ... args){ //public void sayHello(String ... args,int i){ System.out.println(i); for(int j = 0;j < args.length;j++){ System.out.println(args[j] + "$"); } } public void sayHello1(String[] args){ for(int i = 0;i < args.length;i++){ System.out.println(args[i]); } }
public static void main(String[] args) { TestArgsTransfer tt = new TestArgsTransfer(); int i = 10; int j = 5; System.out.println("i:" + i + " j:" + j);//i : 10 j : 5 // //交換變量i與j的值 // int temp = i; // i = j; // j = temp; tt.swap(i, j);//將i的值傳遞給m,j的值傳遞給n System.out.println("i:" + i + " j:" + j);//i : 10 j : 5 } //定義一個方法,交換兩個變量的值 public void swap(int m,int n){ int temp = m; m = n; n = temp; System.out.println("m:" + m + " n:" + n); }
public class TestArgsTransfer1 { public static void main(String[] args) { TestArgsTransfer1 tt = new TestArgsTransfer1(); DataSwap ds = new DataSwap(); System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j); tt.swap(ds); System.out.println(ds); System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j); } //交換元素的值 public void swap(DataSwap d){ int temp = d.i; d.i = d.j; d.j = temp; System.out.println(d);//打印引用變量d的值 } } class DataSwap{ int i = 10; int j = 5; }
package com.atguigu.exer; import java.io.PrintStream; public class Test { public static void main(String[] args) { int a = 10; int b = 10; method(a,b); System.out.println("a="+a); System.out.println("b="+b); } // public static void method(int a , int b) { // a = a * 10; // b = b * 20; // System.out.println(a); // System.out.println(b); // System.exit(0); // } public static void method(int a, int b) { PrintStream ps = new PrintStream(System.out) { public void println(String x){ if("a=10".equals(x)) { x = "a=100"; }else if("b=10".equals(x)) { x = "b=200"; } super.println(x); } }; System.setOut(ps); } }
輸出的什麼?sql
public class Test1 { public static void main(String[] args) { int[] arr = new int[] {1,2,3}; System.out.println(arr); //地址值 char[] arr1 = new char[] {'a','b','c'}; System.out.println(arr1); //abc } }
構造器的做用:①建立對象 ②給建立的對象的屬性賦值數據庫
public class TestPerson { public static void main(String[] args) { Person p1 = new Person(); System.out.println(p1.getName() + ":" + p1.getAge()); Person p2 = new Person("BB",23); int temp = p2.compare(p1); System.out.println(temp); } } class Person{ private String name; private int age; public Person(){ this.name = "AA"; this.age = 1; } public Person(String name){ this(); // 先調用空參數的 this.name = name; } public Person(String name,int age){ this(name); this.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; } public void eat(){ System.out.println("eating"); } public void sleep(){ System.out.println("sleeping"); this.eat(); } //比較當前對象與形參的對象的age誰大。 public int compare(Person p){ if(this.age > p.age) return 1; else if(this.age < p.age) return -1; else return 0; } }
package: 聲明源文件所在的包,寫在程序的第一行
import:編程
/import java.util.Scanner; //import java.util.Date; //import java.util.List; //import java.util.ArrayList; import java.lang.reflect.Field; import java.util.*; import static java.lang.System.*; public class TestPackageImport { public static void main(String[] args) { out.println("helloworld"); Scanner s = new Scanner(System.in); s.next(); Date d = new Date(); List list = new ArrayList(); java.sql.Date d1 = new java.sql.Date(522535114234L); Field f = null; } }
class Cirlce{ //求圓的面積 public double findArea(){ } } class Cylinder extends Circle{ //求圓柱的表面積 public double findArea(){ } }
不管經過那個構造器建立子類對象,須要保證先初始化父類後端
目的:當子類繼承父類後,繼承父類中全部的屬性和方法,所以子類必須知道父類如何爲對象進行初始化數組
public class TestDog { public static void main(String[] args) { Dog d = new Dog(); d.setAge(10); d.setName("小明"); d.setHostName("花花"); System.out.println("name:" + d.getName() + " age:" + d.getAge() + "hostName:" + d.getHostName()); System.out.println(d.toString()); } } // 生物 class Creator { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Creator() { super(); System.out.println("this is Creator's constructor"); } } // 動物類 class Animal extends Creator { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Animal() { super(); System.out.println("this is Animal's constructor"); } } // 狗 class Dog extends Animal { private String hostName; public String getHostName() { return hostName; } public void setHostName(String hostName) { this.hostName = hostName; } public Dog() { super(); System.out.println("this is Dog's constructor"); } }
①方法的重載與重寫 ②子類對象的多態性dom
①要有繼承關係 ②要有方法的重寫ide
編譯時,認爲p是Person類型的,故只能執行Person裏纔有的結構,即Man裏特有的結構不可以調用,子類對象的多態性,並不使用於屬性。
調用方法:編譯看左邊,運行看右邊
屬性:編譯和運行都看左邊
package com.atguigu.java; public class AnimalTest { public static void main(String[] args) { AnimalTest test = new AnimalTest(); // 多態性的體現 test.func(new Dag()); test.func(new Cat()); } public void func(Animal an) { // Animal an = new Dag(); an.eat(); an.shot(); } // public void func(Dag dag) { // dag.eat(); // dag.shot(); // } } class Animal{ public void eat() { System.out.println("動物:吃食物"); } public void shot() { System.out.println("動物:叫"); } } class Dag extends Animal{ public void eat() { System.out.println("狗吃肉"); } public void shot() { System.out.println("汪!汪"); } } class Cat extends Animal{ public void eat() { System.out.println("貓吃魚"); } public void shot() { System.out.println("喵!喵"); } }
有了對象的多態性以後,內存中其實是加載了子類特有的屬性和方法,可是因爲變量聲明爲父類類型,致使了編譯時只能調用父類中聲明的屬性和方法,子類中特有的屬性和方法調用不了,因此有了向下轉型
if (p1 instanceof Woman) { System.out.println("hello!"); Woman w1 = (Woman) p1; w1.shopping(); } if (p1 instanceof Man) { Man m1 = (Man) p1; m1.entertainment(); }
運行時行爲
package com.atguigu.java5; import java.util.Random; //面試題:多態是編譯時行爲仍是運行時行爲? //證實以下: class Animal { protected void eat() { System.out.println("animal eat food"); } } class Cat extends Animal { protected void eat() { System.out.println("cat eat fish"); } } class Dog extends Animal { public void eat() { System.out.println("Dog eat bone"); } } class Sheep extends Animal { public void eat() { System.out.println("Sheep eat grass"); } } public class InterviewTest { public static Animal getInstance(int key) { switch (key) { case 0: return new Cat (); case 1: return new Dog (); default: return new Sheep (); } } public static void main(String[] args) { int key = new Random().nextInt(3); System.out.println(key); Animal animal = getInstance(key); animal.eat(); } }
package com.atguigu.exer; /* * 練習: * 1.若子類重寫了父類方法,就意味着子類裏定義的方法完全覆蓋了父類裏的同名方法, * 系統將不可能把父類裏的方法轉移到子類中:編譯看左邊,運行看右邊 * * 2.對於實例變量則不存在這樣的現象,即便子類裏定義了與父類徹底相同的實例變量, * 這個實例變量依然不可能覆蓋父類中定義的實例變量:編譯運行都看左邊 */ class Base { int count = 10; public void display() { System.out.println(this.count); } } class Sub extends Base { int count = 20; public void display() { System.out.println(this.count); } } public class FieldMethodTest { public static void main(String[] args) { Sub s = new Sub(); System.out.println(s.count);//20 s.display();//20 Base b = s;//多態性 //==:對於引用數據類型來說,比較的是兩個引用數據類型變量的地址值是否相同 System.out.println(b == s);//true System.out.println(b.count);//10 b.display();//20 } }
package com.atguigu.exer; //考查多態的筆試題目: public class InterviewTest1 { public static void main(String[] args) { Base1 base = new Sub1(); base.add(1, 2, 3); //sub_1 Sub1 s = (Sub1)base; s.add(1,2,3); //sub_2 } } class Base1 { public void add(int a, int... arr) { System.out.println("base1"); } } class Sub1 extends Base1 { public void add(int a, int[] arr) { System.out.println("sub_1"); } public void add(int a, int b, int c) { System.out.println("sub_2"); } }