package duotai;
class Customer{
@SuppressWarnings("unused")
private String account;
@SuppressWarnings("unused")
private String password;
//有兩個函數名稱一樣,但是系統可以接受,這叫做函數重載(靜態多態性)
//一個函數呈現爲多種狀態,系統能夠根據參數來決定調用誰
//三種情況:參數個數不同,參數個數相同類型不同,個數類型相同出現的順序不同
//靜態是指:雖然函數名只有一個,但是要寫代碼要寫多個
public Customer()
{
System.out.println("構造函數1");
}
public Customer(String account, String password) {
System.out.println("構造函數2");
this.account=account;
this.password=password;
}
}
public class CustomerTest {
public static void main(String[] args) {
@SuppressWarnings("unused")
Customer cus1 = new Customer();//調用構造函數
@SuppressWarnings("unused")
Customer cus2 = new Customer("3213","1213");//調用構造函數
}
}
package duotai;
//模塊1調用一個對話框,讓對話框顯示出來
class Module1 {
private Dialog dialog;
public Module1(Dialog dialog) {
this.dialog = dialog;
}
public void callDialog(){
dialog.show();
}
}
abstract class Dialog{
public abstract void show();
}
class Dialog1 extends Dialog {
public void show() {
System.out.println("對話框1顯示");
}
}
//客戶對Dialog1不滿意想自己開發一個Dialog2,被Module1調用,不能改變Module1原代碼
class Dialog2 extends Dialog{
public void show() {
System.out.println("對話框2顯示");
}
}
public class DaliogTest {
public static void main(String[] args) {
Dialog1 dia = new Dialog1();
Module1 mod1 = new Module1(dia);
mod1.callDialog();
}
}
package duotai;
//動態多態性一般在繼承時使用
abstract class Person{
public abstract void printInfo();
}
class Student extends Person{
public void printInfo() {
System.out.println("學生打印");
}
}
class Teacher extends Person{
public void printInfo() {
System.out.println("老師打印");
}
}
public class StudentTest {
/* public static void print(Student stu) {
stu.printInfo();
}
public static void print(Teacher tea) {
tea.printInfo();
}*/
public static void print(Person p) {//父類的引用可以指向子類對象
p.printInfo();
}
public static void main(String[] args) {
print(new Student());
}
}
package fanshe;
public class Customer {
private String account;
private String password;
public Customer() {
System.out.println("構造函數1");
}
public Customer(String account, String password) {
System.out.println("構造函數2");
this.account = account;
this.password = password;
}
public void printInfo() {
System.out.println("賬號:" + account + "密碼" + password);
}
}
package fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test1 {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
String className = "fanshe.Customer";
// className cus = new className();
// 得到類的信息
Class c = Class.forName(className);
// 得到構造函數,就可以生成一個對象
Constructor[] cons = c.getConstructors();
for (int i = 0; i < cons.length; i++) {
String str = cons[i].getName();
System.out.println("名字:" + str);
Class[] params = cons[i].getParameterTypes();// 得到參數類型
for (int j = 0; j < params.length; j++) {
String name = params[j].getName();
System.out.println(name);
}
}
//得到裏面的成員函數(包括繼承過來的),就可以調用成員函數
Method[] met = c.getMethods();
for (int i = 0; i < met.length; i++) {
String str = met[i].getName();
System.out.println("名字:" + str);
Class[] params = met[i].getParameterTypes();// 得到參數類型
for (int j = 0; j < params.length; j++) {
String name = params[j].getName();
System.out.println(name);
}
}
}
}
package fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test2 {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
/*
* 反射爲配置文件改變模塊行爲提供了可能
*/
String className = "fanshe.Customer";
Class c = Class.forName(className);
//c.newInstance();表示調用不帶參數的構造函數
// 生成一個對象:用構造函數
Constructor con1 = c.getConstructor(new Class[] {Class.forName("java.lang.String"),Class.forName("java.lang.String") });
//Constructor con1 = c.getConstructor(new Class[] {});// 得到不帶參數的構造函數
// 生成對象
Object obj = con1.newInstance(new Object[] {"222","111"});
//Object obj = con1.newInstance(new Object[] {});// 表示不傳入參數
//怎樣調用obj裏面的方法
Method met = c.getMethod("printInfo", new Class[]{});//得到方法
met.invoke(obj, new Object[]{});//調用
/*Customer cus = new Customer("222","111");
cus.printInfo();*/
}
}
/*public class Test2 {
public static void main(String[] args) throws Exception {
String className = "fanshe.Customer";
Class c = Class.forName(className);
Constructor con1 = c.getConstructor(new Class[] {Class.forName("java.lang.String"),Class.forName("java.lang.String") });
Object obj = con1.newInstance(new Object[] {"222","111"});
Method met = c.getMethod("printInfo", new Class[]{});
met.invoke(obj, new Object[]{});
}
}*/