人有不为也,而后可以有为
面向对象内容的三条主线:
Java 类及类的成员:属性、方法、构造器、代码块、内部类 面向对象的三大特征:封装、继承、多态性 其它关键字:this、super、static、final、abstract、interface、package、import 面向过程(POP)与面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。 面向对象,将功能封装进对象,强调具备了功能的对象,以类 / 对象为最小单位,考虑谁来做。 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等 类和对象 类(Class)和对象(Object)是面向对象的核心概念
类是对一类事物的描述,是抽象的、概念上的定义 对象是实际存在的该类事物的每个个体,因而也称为实例(instance) Java 类及类的成员
属性 :对应类中的成员变量行为 :对应类中的成员方法
类的成员:属性 语法格式
变量的分类
变量的区别
默认初始化值 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package com.base.learn;public class UserTest { public static void main (String[] args) { User user = new User (); System.out.println(user.name); System.out.println(user.age); System.out.println(user.isMail); user.talk("汉语" ); } } class User { String name; int age; boolean isMail; public void talk (String language) { System.out.println("我们使用" + language + "交流" ); } public void eat () { String food = "烙饼" ; System.out.println("北方人喜欢吃 " + food); } }
类的成员:方法 什么是方法(method、函数)
方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中 也称为函数或过程 将功能封装为方法的目的是,可以实现代码重用,简化代码 Java里的方法不能独立存在,所有的方法必须定义在类里 方法的声明
方法的返回值 无返回值 有返回值 无形参 void 方法名() {} 返回值的类型 方法名() {} 有行参 void 方法名(行参列表) {} 返回值的类型 方法名(行参列表) {}
返回值类型: 有返回值 vs 没有返回值
如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用 return 关键字来返回指定类型的变量或常量:“return 数据” 如果方法没有返回值,则方法声明时,使用 void 来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思 匿名对象的使用 匿名对象,即没有名字的对象,指的是在创建一个对象时,只有创建语句,却没有将其地址赋值给某个变量
总结:
匿名对象作为对象,也具有普通对象的所有功能 每一次使用匿名对象,都是新 new 出来新对象 匿名对象执行完毕,由于没有其它引用,会被 Java 的垃圾回收机制自动进行回收 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package com.base.learn;public class InstanceTest { public static void main (String[] args) { Phone p = new Phone (); System.out.println(p); p.playGame(); p.sendEmail(); System.out.println("------分割线-------" ); new Phone ().sendEmail(); new Phone ().playGame(); System.out.println("------分割线-------" ); PhoneMail phoneMail = new PhoneMail (); phoneMail.show(new Phone ()); } } class PhoneMail { public void show (Phone phone) { phone.sendEmail(); phone.playGame(); } } class Phone { double price; public void sendEmail () { System.out.println("发送邮件" ); } public void playGame () { System.out.println("打游戏" ); } public void showPrice () { System.out.println("手机价格为:" + price); } }
方法的重载 Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可
如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载overload
例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法
1 2 3 public void println (int i) {…}public void println (double d) {…}public void println (String s) {…}
这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之间就构成了方法的重载。实际调用时,根据实参的类型来决定调用哪一个方法。例如:
1 2 3 System.out.println(102 ); System.out.println(102.25 ); System.out.println("价格为 102.25" );
方法重载的要求是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。
使用方法重载其实就是避免出现繁多的方法名,有些方法的功能是相似的,如果重新建立一个方法,重新取个方法名称,会降低程序可读性。
例子: 在比较数值时,数值的个数和类型是不固定的,可能是两个 int 类型的数值,也可能是两个 double 类型的数值,或者是两个 double、一个 int 类型的数值;在这种情况下就可以使用方法的重载来实现数值之间的比较功能。具体实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class OverLoading { public void max (int a, int b) { System.out.println(a > b ? a : b); } public void max (double a, double b) { System.out.println(a > b ? a : b); } public void max (double a, double b, int c) { double max = (double ) (a > b ? a : b); System.out.println(c > max ? c : max); } public static void main (String[] args) { OverLoading ol = new OverLoading (); System.out.print("1 与 5 比较,较大的是:" ); ol.max(1 , 5 ); System.out.print("5.205 与 5.8 比较,较大的是:" ); ol.max(5.205 , 5.8 ); System.out.print("2.15、0.05、58 中,较大的是:" ); ol.max(2.15 , 0.05 , 58 ); } }
注:摘自C语言中文网
可变个数的行参 JavaSE 5.0 中提供了 Varargs(variable number of arguments) 机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参
JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量 public static void test(int a ,String[] books);
JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量 public static void test(int a ,String…books);
举例:public void show(int ... a){} 格式:数据类型 … 变量名 当调用可变个数行参的方法时,传入的参数的个数可以是:0个,1个,2个… 可变个数形参的方法与本类中方法名相同,形参不同的方法直接构成重载 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载,二者不可共存 假如要获取每一个填进去的元素(则把这种形式的变量当作一个数组就行) 方法的参数部分有可变行参,需要放在行参声明的末尾,最多只能声明一个可变行参 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 package com.base.learn;public class MethodArgs { public static void main (String[] args) { MethodArgs methodArgs = new MethodArgs (); methodArgs.show(12 ); methodArgs.show("hello" ); methodArgs.show("hello" , "world" ); } public void show (int i) { System.out.println("show(int i)" ); } public void show (String s) { System.out.println("show(String s)" ); } public void show (String ... strs) { System.out.println("show(String ... strs)" ); for (String i : strs) { System.out.println(i); } } public void show (int i, String ... strs) {} }
方法参数的值传递机制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 package com.base.learn;public class ValueTransferTest { public static void main (String[] args) { System.out.println("*********** 基本数据类型 ***********" ); int m = 10 ; int n = m; System.out.println("m = " + m + ", n = " + n); n = 20 ; System.out.println("m = " + m + ", n = " + n); System.out.println("*********** 引用数据类型 ***********" ); Order o1 = new Order (); o1.orderId = 10001 ; Order o2 = o1; System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " + o2.orderId); o2.orderId = 10002 ; System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " + o2.orderId); } } class Order { int orderId; }
基本数据类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com.base.learn;public class ValueTransferTest1 { public static void main (String[] args) { int m = 10 ; int n = 20 ; System.out.println("m = " + m + ", n = " + n); int temp = m; m = n; n = temp; System.out.println("m = " + m + ", n = " + n); ValueTransferTest1 test1= new ValueTransferTest1 (); test1.swap(m, n); System.out.println("m = " + m + ", n = " + n); } public void swap (int m, int n) { int temp = m; m = n; n = temp; } }
引用数据类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.base.learn;public class ValueTransferTest2 { public static void main (String[] args) { Data data = new Data (); data.m = 10 ; data.n = 20 ; System.out.println("m = " + data.m + ", n = " + data.n); ValueTransferTest2 test2 = new ValueTransferTest2 (); test2.swap(data); System.out.println("m = " + data.m + ", n = " + data.n); } public void swap (Data data) { int temp = data.m; data.m = data.n; data.n = temp; } } class Data { int m; int n; }
练习1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.base.learn;public class ValueTransferTest3 { public static void main (String[] args) { ValueTransferTest3 test3 = new ValueTransferTest3 (); test3.first(); } public void first () { int i = 5 ; Value v = new Value (); v.i = 25 ; second(v, i); System.out.println(v.i); } public void second (Value v, int i) { i = 0 ; v.i = 20 ; Value val = new Value (); v = val; System.out.println(v.i + " " + i); } } class Value { int i = 15 ; }
练习2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.base.learn;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 * 10 ; System.out.println("a = " + a); System.out.println("b = " + b); System.exit(0 ); } }
练习3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package com.base.learn;import java.util.Arrays;public class Test3 { public static void main (String[] args) { int [] arr = new int []{12 , 3 , 3 , 34 , 56 , 77 , 432 }; for (int i = 0 ; i < arr.length; i++) { arr[i] = arr[i] / arr[0 ]; } System.out.println(Arrays.toString(arr)); int [] arr2 = new int []{12 , 3 , 3 , 34 , 56 , 77 , 432 }; for (int i = arr2.length - 1 ; i >= 0 ; i--) { arr2[i] = arr2[i] / arr2[0 ]; } System.out.println(Arrays.toString(arr2)); int [] arr3 = new int []{12 , 3 , 3 , 34 , 56 , 77 , 432 }; int temp = arr3[0 ]; for (int i = 0 ; i < arr.length; i++) { arr3[i] = arr3[i] / temp; } System.out.println(Arrays.toString(arr3)); } }
练习4 1 2 3 4 5 6 7 8 9 10 11 12 package com.base.learn;public class Test4 { public static void main (String[] args) { int [] arr1 = new int []{1 , 2 , 3 }; System.out.println(arr1); char [] arr2 = new char []{'a' , 'b' , 'c' }; System.out.println(arr2); } }
1 2 3 4 5 6 public void println (char x[]) { synchronized (this ) { print(x); newLine(); } }
练习5 1 2 3 4 5 6 7 8 9 10 11 12 package com.base.exer;public class Circle { double radius; public double findArea () { return Math.PI * radius * radius; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package com.base.exer;public class PassObject { public static void main (String[] args) { PassObject test = new PassObject (); Circle c = new Circle (); test.printAreas(c, 5 ); System.out.println("no radius is:" + c.radius); } public void printAreas (Circle c, int time) { System.out.println("Radius\t\tAreas" ); for (int i = 1 ; i <= time; i++) { c.radius = i; System.out.println(c.radius + "\t\t" + c.findArea()); } } }
递归调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package com.base.exer1;public class RecursionTest { public static void main (String[] args) { int sum = 0 ; for (int i = 0 ; i <= 100 ; i++) { sum += i; } System.out.println("sum = " + sum); RecursionTest test = new RecursionTest (); int sum2 = test.getSum(100 ); System.out.println("sum2 = " + sum2); } public int getSum (int n) { if (n == 1 ) { return 1 ; } else { return n + getSum(n - 1 ); } } }
练习1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.base.exer1;public class RecursionTest1 { public static void main (String[] args) { RecursionTest1 test1 = new RecursionTest1 (); int a = test1.f(10 ); System.out.println(a); } public int f (int n) { if (n == 0 ) { return 1 ; } else if (n == 1 ) { return 4 ; } else { return 2 * f(n - 1 ) + f(n - 2 ); } } }
练习2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package com.base.exer1;public class RecursionTest2 { public static void main (String[] args) { RecursionTest2 test2 = new RecursionTest2 (); int a = test2.f(10 ); System.out.println(a); } public int f (int n) { if (n == 1 || n == 2 ) { return 1 ; } else { return f(n - 1 ) + f(n - 2 ); } } }
访问控制修饰符 访问级别 访问控制修饰符 同类 同包 子类 不同包 公开 public ✓ ✓ ✓ ✓ 受保护 protected ✓ ✓ ✓ ✕ 默认 无 ✓ ✓ ✕ ✕ 私有 private ✓ ✕ ✕ ✕
构造方法 构造方法总结 构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。
Java 构造方法有以下特点:
方法名必须与类名相同 可以有 0 个、1 个或多个参数 没有任何返回值,包括 void 默认返回类型就是对象类型本身 只能与 new 运算符结合使用 一旦显示的定义了类的构造器之后,系统不再提供默认的空参构造器。
值得注意的是,如果为构造方法定义了返回值类型或使用 void 声明构造方法没有返回值,编译时不会出错,但 Java 会把这个所谓的构造方法当成普通方法来处理。
这时候大家可能会产生疑问,构造方法不是没有返回值吗?为什么不能用 void 声明呢?
简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。
注意:构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。构造方法用于初始化一个新对象,所以用 static 修饰没有意义。构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。
在一个类中定义多个具有不同参数的同名方法,这就是方法的重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class WorkerTest { public static void main (String[] args) { System.out.println("---------带有一个参数的构造方法---------" ); Worker worker1 = new Worker ("张三" ); System.out.println("大家好!我是新来的员工,我叫 " + worker1.name + ",今年 " + worker1.age + " 岁。" ); System.out.println("---------带有一个参数的构造方法---------" ); Worker worker2 = new Worker ("李四" , 18 ); System.out.println("大家好!我是新来的员工,我叫 " + worker2.name + ",今年 " + worker2.age + " 岁。" ); } } class Worker { public String name; public int age; public Worker (String name) { this .name = name; } public Worker (String name, int age) { this .name = name; this .age = age; } }
总结属性赋值过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package com.base.learn;public class UserTest { public static void main (String[] args) { User u = new User (); System.out.println(u.age); User u2 = new User (2 ); System.out.println(u2.age); u2.setAge(3 ); System.out.println(u2.age); } } class User { String name; int age = 1 ; public User () { } public User (int age) { this .age = age; } public void setAge (int age) { this .age = age; } }
JavaBean JavaBeans 是 Java 中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化 ,提供无参构造器,提供 getter 方法和 setter 方法访问对象的属性。名称中的 Bean 是用于 Java 的可重用软件组件的惯用叫法。
JavaBean 是一种 Java 类,而且是一种特殊的、可重用的类。 JavaBean必须具有无参数的构造器,所有的属性都是private的,通过提供setter和getter方法来实现对成员属性的访问。 Javabean 是为了和 jsp 页面传数据化简交互过程而产生的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package com.base.learn;public class Customer { private String name; private char gender; private int age; private String phone; private String email; public Customer () { } public Customer (String name, char gender, int age, String phone, String email) { this .name = name; this .gender = gender; this .age = age; this .phone = phone; this .email = email; } public String getName () { return name; } public void setName (String name) { this .name = name; } public char getGender () { return gender; } public void setGender (char gender) { this .gender = gender; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public String getPhone () { return phone; } public void setPhone (String phone) { this .phone = phone; } public String getEmail () { return email; } public void setEmail (String email) { this .email = email; } }
UML 类图
详细内容可以参考
this 关键字 this 调用属性、方法、构造器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 package com.base.exer;public class PersonTest { public static void main (String[] args) { Person p1 = new Person (); p1.setAge(1 ); System.out.println(p1.getAge()); p1.eat(); System.out.println(); Person p2 = new Person ("jerry" , 20 ); System.out.println(p2.getAge()); } } class Person { private String name; private int age; public Person () { this .eat(); String info = "Person info." ; System.out.println(info); } public Person (String name) { this (); this .name = name; } public Person (int age) { this .age = age; } public Person (String name, int age) { this (age); this .name = name; } 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("人吃饭" ); } }
练习1 关于 this 的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package com.base.learn;public class Boy { private String name; private int age; public Boy (String name, int age) { this .name = 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 marry (Girl girl) { System.out.println("我想娶" + girl.getName()); } public void shout () { if (this .age >= 22 ) { System.out.println("你可以合法登记结婚了。" ); } else { System.out.println("好好学习" ); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package com.base.learn;public class Girl { private String name; private int age; public Girl (String name, int age) { this .name = 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 marry (Boy boy) { System.out.println("我想嫁给" + boy.getName()); boy.marry(this ); } public int compare (Girl girl) { return this .age - girl.age; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.base.learn;public class BoyGirlTest { public static void main (String[] args) { Boy boy = new Boy ("罗密欧" , 21 ); boy.shout(); Girl girl = new Girl ("朱丽叶" , 18 ); girl.marry(boy); Girl girl1 = new Girl ("祝英台" , 19 ); int compare = girl.compare(girl1); if (compare > 0 ) { System.out.println(girl.getName() + "年龄大" ); } else if (compare < 0 ) { System.out.println(girl1.getName() + "年龄大" ); } else { System.out.println("年龄一样大" ); } } }
练习2 取钱存钱
写一个名为 Account 的类模拟账户。该类的属性和方法如下图所示。该类包括的属性: 账号 id,余额 balance,年利率 annualInterestRate
包含的方法:访问器方法(getter 和 setter 方法),取款方法 withdraw(),存款方法 deposit()
在提款方法 withdraw 中,需要判断用户余额是否能够满足提款数额的要求,如果不能,应给出提示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 package com.base.exer;public class Account { private int id; private double balance; private double annualInterestRate; public Account (int id, double balance, double annualInterestRate) { this .id = id; this .balance = balance; this .annualInterestRate = annualInterestRate; } public int getId () { return id; } public void setId (int id) { this .id = id; } public double getBalance () { return balance; } public void setBalance (double balance) { this .balance = balance; } public double getAnnualInterestRate () { return annualInterestRate; } public void setAnnualInterestRate (double annualInterestRate) { this .annualInterestRate = annualInterestRate; } public void withdraw (double amount) { if (balance < amount) { System.out.println("余额不足,取款失败!" ); return ; } balance -= amount; System.out.println("成功取出:" + amount); } public void deposit (double amount) { if (amount > 0 ) { balance += amount; System.out.println("成功存入:" + amount); } } }
声明三个私有对象属性:firstName、lastName 和 account。 声明一个公有构造器,这个构造器带有两个代表对象属性的参数(f 和 l) 声明两个公有存取器来访问该对象属性,方法 getFirstName 和 getLastName 返回相应的属性。 声明 setAccount 方法来对 account 属性赋值。 声明 getAccount 方法以获取 account 属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.base.exer;public class Customer { private String firstName; private String lastName; private Account account; public Customer (String firstName, String lastName) { this .firstName = firstName; this .lastName = lastName; } public String getFirstName () { return firstName; } public String getLastName () { return lastName; } public Account getAccount () { return account; } public void setAccount (Account account) { this .account = account; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package com.base.exer;public class CustomerTest { public static void main (String[] args) { Customer cust = new Customer ("Jane" , "Smith" ); Account acct = new Account (1000 , 2000 , 0.0123 ); cust.setAccount(acct); cust.getAccount().deposit(100 ); cust.getAccount().withdraw(960 ); cust.getAccount().withdraw(2000 ); System.out.println("Custormer [" + cust.getLastName() + ", " + cust.getFirstName() + "] has a account: id is " + cust.getAccount().getId() + ", annualInterestRate is " + cust.getAccount().getAnnualInterestRate() * 100 + "%, balance is " + cust.getAccount().getBalance()); } }
练习3 银行账户
在提款方法 withdraw() 中,需要判断用户余额是否能满足提款数额的要求,如果不能应给出提示。
deposit() 方法表示存款
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package com.base.exer1;public class Account { private double balance; public Account (double balance) { this .balance = balance; } public double getBalance () { return balance; } public void deposit (double amount) { if (amount > 0 ) { balance += amount; System.out.println("成功存入:" + amount); } } public void withdraw (double amount) { if (balance < amount) { System.out.println("余额不足,取款失败!" ); return ; } balance -= amount; System.out.println("成功取出:" + amount); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package com.base.exer1;public class Customer { private String firstName; private String lastName; private Account account; public Customer (String firstName, String lastName) { this .firstName = firstName; this .lastName = lastName; } public String getFirstName () { return firstName; } public String getLastName () { return lastName; } public Account getAccount () { return account; } public void setAccount (Account account) { this .account = account; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package com.base.exer1;public class Bank { private Customer[] customers; private int numberOfCustomers; public Bank () { customers = new Customer [10 ]; } public void addCustomer (String f, String l) { Customer cust = new Customer (f, l); customers[numberOfCustomers++] = cust; } public Customer getCustomers (int index) { if (index >= 0 && index < numberOfCustomers) { return customers[index]; } else { return null ; } } public int getNumberOfCustomers () { return numberOfCustomers; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.base.exer1;public class BankTest { public static void main (String[] args) { Bank bank = new Bank (); bank.addCustomer("Jane" , "Smith" ); bank.getCustomers(0 ).setAccount(new Account (2000 )); bank.getCustomers(0 ).getAccount().withdraw(500 ); bank.getCustomers(0 ).getAccount().deposit(100 ); double balance = bank.getCustomers(0 ).getAccount().getBalance(); System.out.println("客户:" + bank.getCustomers(0 ).getFirstName() + " 的账户余额为:" + balance); System.out.println("-------------------" ); bank.addCustomer("三" , "张" ); System.out.println("银行客户的个数为:" + bank.getNumberOfCustomers()); } }
package、import 关键字 package 基础理解:
package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包。 它的格式为: package 顶层包名.子包名 为了更好的实现项目中类的管理,提供包的概念 使用 package 声明类或接口所属的包,声明在原文件的首行 包,属于标识符,遵循标识符的命名规则和规范,“见名知意”,所有字母都小写 每“.”一次代表一层文件目录 补充:同一个包下不能命名同名的接口、类,不同的包下可以命名同名接口或者类 JDK中主要的包介绍 java.lang—-包含一些Java语言的核心类,如String、Math、Integer、 System和 Thread,提供常用功能 java.net—-包含执行与网络相关的操作的类和接口 java.io —-包含能提供多种输入/输出功能的类 java.util—-包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日 期日历相关的函数 java.text—-包含了一些java格式化相关的类 java.sql—-包含了java进行JDBC数据库编程的相关类/接口 关键字 import 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类 或全部类(.*)。import语句告诉编译器到哪里去寻找类。 import 包名. 类名; 在源文件中显式的使用 import 结构导入指定包下的类、接口 声明在包的声明和类的声明之间 如果需要导入多个结构,则并列写出即可 可以使用 “xxx.*“ 的方式,表示可以导入 xxx 包下的所有结构。 如果导入的类或接口是 java.lang 包下的,或者是当前包下的,则可以省略此 import 语句。 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。 如果已经导入 java.a 包下的类。那么如果需要使用 a 包的子包下的类的话,仍然需要导入。 import static 组合的使用:调用指定类或接口下的静态的属性或方法. MVC 设计
MVC 是常用的设计模式之一,将整个程序分为三个层次:视图模型层,控制器层,数据模型层 。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变的灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。
以上笔记内容大部分都是来自 B站康师傅 Java 基础教程 主要记录下自己学习的过程
注: 如果文章有任何错误和建议,请各位大佬尽情评论留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个关注点赞收藏下,非常感谢啦!