第3章 Java的基础程序设计结构
整型
用int类型表示一百万可以这么写(since 1.7)
int a = 1_000_000;
System.out.println(a);//1000000
可用0b或0B表示二进制(同样since 1.7)
byte a = 0b0000_0010;
System.out.println(a);//2
如出现:
byte a = (byte) 200;
System.out.println(a);//-56
因200超出byte最大整数范围[-128,127],所以将200的二进制截取后8位(这个是编码方式决定的,Java中正数用源码表示,负数用补码表示,第一位是符号位。),出现结果;
浮点型
自动(隐性)类型转换
运算优先级
String
检测两个字符串是否相等,且不区分大小写
System.out.println("HELLO".equalsIgnoreCase("hello"));//true
输入输出
三种获取键盘输入方法:
//方式1:使用Scanner类(还是这个简单好用)Scanner in = new Scanner(System.in);System.out.println("输入你的名字");String name = in.nextLine();System.out.println("输入你的年龄");int age = in.nextInt();System.out.println("输入你的工资");float salary = in.nextFloat();System.out.println(name + " " + age + " " + salary);//方式2:直接接收System.out.println("Enter : ");byte[] bytes = new byte[1024];int len = System.in.read(bytes);System.out.println("Result : " + new String(bytes,0,len));//方法3:in流 ->包装流 -> 字符流BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("Enter : ");String str = br.readLine();System.out.println("Result : " + str);if (br != null){br.close();}
格式化输出
System.out.printf("%7.2f",222.333);// 222.33
共输出7个字符,1个空格 + 3个2 + 1个. + 2个3
System.out.printf("%tT",new Date());//00:32:49
格式化输出时间:
循环
可以说for循环是while循环的一种简写方式
switch循环中case
以及Character, Byte, Short, Integer
多维数组
//自动遍历多维数组
int[][][] a = new int[][][]{{{1,2},{3,4}},{{4,5},{6,7}},};
System.out.println(Arrays.deepToString(a));//[[[1, 2], [3, 4]], [[4, 5], [6, 7]]]
所谓"多维数组"就是数组里的元素在引用其他数组
第4章 对象与类
静态方法
可以通过实例对象调用静态方法,但不推荐,因为容易造成混淆;一律用类名调用
Java中参数总是按值传递的,使用情况如下
构造器:
编写类时应当提供一个默认的构造器(不带参数的构造器),保证所有域被赋予默认值
数值类型数据设置为0;布尔类型数据设置为false;String等对象类型将设置为null
在构造器中调用this(即另一个构造器时),应当放在第一句,这样对于公共的构造器代码部分只需编写一次
类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法尽量体现它们的职责
- 优先使用不可变的类
第5章 继承
测试代码如下:
Parent类
public class Parent {@Overridepublic String toString() {return "Parent{}";}
}
Child类
public class Child extends Parent{@Overridepublic String toString() {return "Child{}";}
}
Employee类
public class Employee {public Parent getParent(){return new Parent();}
}
Manager类
public class Manager extends Employee{@Overridepublic Child getParent() {return new Child();}
}
测试
public static void main(String[] args) {Manager manager = new Manager();Employee employee = new Employee();System.out.println(manager.getParent());//Child{}System.out.println(employee.getParent());//Parent{}}
得出结论:允许子类将覆盖方法的返回类型定义为父类被覆盖方法原返回类型的子类!!!重写方法的返回类型并不是一定不能修改
equals方法规范
注意点
下图重写equals方法
重写equals、hashCode、toString(雇员经理例子)
Employee类
package com.cxf.EqualsHashCodeDemo;import java.time.LocalDate;
import java.util.Objects;public class Employee {private String name;private double salsry;private LocalDate hireDay;public Employee(String name,double salsry,int year,int month,int day){this.name = name;this.salsry = salsry;hireDay = LocalDate.of(year,month,day);}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalsry() {return salsry;}public void setSalsry(double salsry) {this.salsry = salsry;}public LocalDate getHireDay() {return hireDay;}public void setHireDay(LocalDate hireDay) {this.hireDay = hireDay;}public void raiseSalary(double byPercent){double raise = salsry * byPercent / 100;salsry += raise;}@Overridepublic boolean equals(Object otherObject) {if (this == otherObject) return true;if (otherObject == null || getClass() != otherObject.getClass()) return false;Employee other = (Employee) otherObject;return Objects.equals(name,other.name) && salsry == other.salsry&& Objects.equals(hireDay,other.hireDay);}@Overridepublic int hashCode() {return Objects.hash(name, salsry, hireDay);}@Overridepublic String toString() {return getClass().getName() + "Employee{" +"name='" + name + '\'' +", salsry=" + salsry +", hireDay=" + hireDay +'}';}
}
Manager类
package com.cxf.EqualsHashCodeDemo;public class Manager extends Employee {private double bonus;public Manager(String name, double salsry, int year, int month, int day) {super(name, salsry, year, month, day);bonus = 0;}public double getSalary() {double baseSalary = super.getSalsry();return baseSalary + bonus;}public void setBonus(double bonus){this.bonus = bonus;}@Overridepublic boolean equals(Object otherObject){if (!super.equals(otherObject)) return false;Manager other = (Manager) otherObject;return bonus == other.bonus;}@Overridepublic int hashCode() {return super.hashCode() + 17 * new Double(bonus).hashCode();}@Overridepublic String toString(){return super.toString() + "[bonus=" + bonus + "]";}
}
测试
package com.cxf.EqualsHashCodeDemo;public class EqualsTest {public static void main(String[] args) {Employee emp1 = new Employee("Lucy",75000,1987,12,15);Employee emp2 = emp1;Employee emp3 = new Employee("Lucy",75000,1987,12,15);Employee bob = new Employee("Bob",50000,1989,10,1);System.out.println("emp1 == emp2: " + (emp1 == emp2));System.out.println("emp1 == emp3: " + (emp1 == emp3));System.out.println("emp1.equals(emp3): " + (emp1.equals(emp3)));System.out.println("emp1.equals(bob): " + (emp1.equals(bob)));System.out.println("bob.toString(): " + bob.toString());Manager man1 = new Manager("Tom",80000,1987,12,15);Manager boss = new Manager("Tom",80000,1987,12,15);boss.setBonus(5000);System.out.println("============================================================");System.out.println("boss.toString(): " + boss);System.out.println("man1.equals(boss): " + man1.equals(boss));System.out.println("emp1.hashCode(): " + emp1.hashCode());System.out.println("emp3.hashCode(): " + emp3.hashCode());System.out.println("bob.hashCode(): " + bob.hashCode());System.out.println("man1.hashCode(): " + man1.hashCode());}
}
利用反射分析类的能力
package com.cxf.reflectionDemo;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;/*** 用于打印一个类的全部信息* @author chen* @version 1.1 2019.9.27*/
public class ReflectionTest {public static void main(String[] args) {//键入全限定类名String name;Scanner in = new Scanner(System.in);System.out.println("Enter class name:(eg : java.util.Date)");name = in.next();try {Class c1 = Class.forName(name);Class superc1 = c1.getSuperclass();String modifiers = Modifier.toString(c1.getModifiers());if (modifiers.length() > 0) System.out.print(modifiers + " ");System.out.print("class" + " " + name);if (superc1 != null && superc1 != Object.class) System.out.print(" " + "extends" + " " + superc1.getName());System.out.print("\n{\n");printConstructors(c1);System.out.println();printMethods(c1);System.out.println();printFields(c1);System.out.println("}");} catch (ClassNotFoundException e) {e.printStackTrace();}System.exit(0);}/*** 打印一个类的全部构造方法* @param c1 一个类*/private static void printConstructors(Class c1) {Constructor[] constructors = c1.getDeclaredConstructors();for (Constructor c : constructors) {String name = c.getName();System.out.print(" ");String modifiers = Modifier.toString(c.getModifiers());if (modifiers.length() > 0) System.out.print(modifiers + " ");//修饰名System.out.print(name + "(");//方法名//参数类型Class[] paramTypes = c.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0) System.out.print(",");System.out.print(paramTypes[j].getName());}System.out.print(")");System.out.println();}}/*** 打印一个类的全部方法* @param c1 一个类*/private static void printMethods(Class c1) {Method[] declaredMethods = c1.getDeclaredMethods();for (Method m : declaredMethods) {Class returnType = m.getReturnType();String name = m.getName();System.out.print(" ");String modifiers = Modifier.toString(m.getModifiers());if (modifiers.length() > 0) System.out.print(modifiers + " ");//修饰名System.out.print(returnType.getName() + " " + name + "(");//返回类型,方法名//参数类型Class[] parameterTypes = m.getParameterTypes();for (int j = 0; j < parameterTypes.length; j++) {if (j > 0) System.out.print(",");System.out.print(parameterTypes[j].getName());}System.out.print(")");System.out.println();}}/*** 打印一个类的所有属性* @param c1 一个类*/private static void printFields(Class c1) {Field[] fields = c1.getFields();for (Field f : fields) {Class type = f.getType();String name = f.getName();System.out.print(" ");String modidfier = Modifier.toString(f.getModifiers());if (modidfier.length() > 0) System.out.print(modidfier + " ");System.out.print(type.getName() + " " + name + ";");System.out.println();}}
}
第6章 接口、lambda表达式和内部类
对接口提供泛型,尽量杜绝“强转”
第7章 异常、断言和日志