import java.util.Scanner; public class ArrayTest { public static void main(String[] args) { Scanner myScanner = new Scanner(System.in); //快捷键自动分配变量名,在后面加.var // Scanner scanner = new Scanner(System.in); // Scanner scanner1 = new Scanner(System.in) // MyTools myTools = new MyTools(); MyTools mt = new MyTools(); int[] arr = {10, 2, -1, 8, 32}; //定位到方法ctrl + B mt.bubble(arr); //输出排序后的arr,引用传递 System.out.println("排序后的arr"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } //注意 //在idea当我们run一个文件时,会先编译成.class文件 } } //查看类的继承关系ctrl+H class Person { String name; int age; //构造器-快捷键alt+insert public Person(String name, int age) { this.name = name; this.age = age; } } //创建一个类MyTools,编写一个方法,可以完成对int数组冒泡排序的功能 //从小到大 class MyTools { public void bubble(int[] arr) { //冒泡排序 int temp = 0; for (int i = 0; i < arr.length; i++) {//外层循环次数arr.length-1 for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } }
public class TestTemplate { //模板快捷键 //输出main public static void main(String[] args) { //输入sout System.out.println(); //输入fori // for (int i = 0; i < ; i++) { // // } } }
package com.use; import com.xiaoqiang.Dog; public class Test { public static void main(String[] args) { Dog dog = new Dog(); System.out.println(dog);//com.xiaoqiang.Dog@1540e19d com.xiaoming.Dog dog1 = new com.xiaoming.Dog(); System.out.println(dog1);//com.xiaoming.Dog@677327b6 } }
package com.xiaoming; public class Dog { }
package com.xiaoqiang; public class Dog { }
package com.hspedu.pkg; import java.util.Arrays; //注意 //需要使用到哪个类,就导入哪个类即可,不建议使用*导入 //表示只会引入java.util包下的Scanner import java.util.Scanner; //表示引入java.util包下的所有类 //import java.util.*; public class Import01 { public static void main(String[] args) { //使用系统系统的Arrays完成数组排序 int[] arr = {-1,20,2,13,3}; //对上面数组进行排序 //传统方法,自己编写排序(冒泡) //系统提供了相关的类,可以方便完成Arrays Arrays.sort(arr); //输出排序结果 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }
//package的作用是声明当前类所在的包,需要放在类(或者文件)的最上面 //一个类中最多只有一句package package com.hspedu.pkg; //import指令位置放在package的下面,在类定义之前,可以有多句且没有顺序要求 import java.util.Arrays; import java.util.Scanner; //类定义 public class PkgDetail { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] arr = {0,-1,1}; Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i] + " "); } } }
package com.hspedu.modifier; //只有默认和public才能修饰类 //修饰符可以用来修饰类中的属性和成员方法以及类 public class A { //四个属性,用不同访问修饰符修饰 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; public void m1() { //在同一个类下,可以访问public,protected和默认,private修饰的属性 System.out.print("n1=" + n1 + " "); System.out.print("n2=" + n2 + " "); System.out.print("n3=" + n3 + " "); System.out.print("n4=" + n4 + " "); } protected void m2(){} void m3(){} private void m4(){} public void hi(){ //在同一个类下,可以访问public,protected和默认,private修饰的方法 m1(); m2(); m3(); m4(); } }
package com.hspedu.modifier; public class B { public void say() { A a = new A(); //在同一个包下,可以访问public,protected和默认修饰的属性 System.out.print("\nn1=" + a.n1 + " "); System.out.print("n2=" + a.n2 + " "); System.out.print("n3=" + a.n3 + " "); //n4是private的访问控制,无法访问 //System.out.println("n1=" + a.n4);//错误不能调用 //在同一个包下,可以访问public,protected和默认修饰的方法 a.m1(); a.m2(); a.m3(); //a.m4();//错误不能调用 } }
package com.hspedu.modifier; public class Test { public static void main(String[] args) { A a = new A(); a.m1(); B b = new B(); b.say(); } } //只有默认和public可以修饰类 class Tiger {}
package com.hspedu.pkg; import com.hspedu.modifier.A; public class Test { public static void main(String[] args) { A a = new A(); //在不同包下,可以访问public修饰的属性 //不能访问protected,默认private修饰的属性或方法 System.out.println("n1=" + a.n1); // System.out.println("n2=" + a.n2);//错误不能调用 // System.out.println("n3=" + a.n3);//错误不能调用 // System.out.println("n4=" + a.n4);//错误不能调用 //在不同包下,可以访问public修饰的方法,不能访问a.m2(),a.m3(),a.m4() a.m1(); } }
package com.hspedu.encap; public class Encapsulation01 { public static void main(String[] args) { //如果要使用快捷键alt+r,需要先配置主类 Person person = new Person(); person.setName("jack"); person.setAge(30); person.setSalary(30000); System.out.println(person.info()); System.out.println(person.getSalary()); } } class Person { public String name;//名字公开 private int age;//年龄私有 private double salary;//... //自己写setxxx和getxxx太慢,使用快捷键 //然后根据要求来完善我们的代码. public String getName() { return name; } public void setName(String name) { //加入对数据的校验,相当于增加了业务逻辑 if(name.length() >= 2 && name.length() <= 6){ this.name = name; }else{ System.out.println("名字的长度不对,需要(2-6)个字符,默认名字"); this.name = "无名人"; } } public int getAge(){ return age; } public void setAge(int age) { if(age >= 1 && age <= 120){ this.age = age; }else{ System.out.println("你设置的年龄不对,年龄需要在1-120,默认年龄18"); this.age = 18;//给一个默认年龄 } } public double getSalary() { //可以这里增加对当前对象的权限判断 return salary; } public void setSalary(double salary) { this.salary = salary; } //写一个方法,返回属性信息 public String info(){ return "信息为name=" + name + " age=" + age + " 薪水=" + salary; } }
package com.hspedu.encap; public class Encapsulation01 { public static void main(String[] args) { //如果要使用快捷键alt+r,需要先配置主类 Person person = new Person(); person.setName("jack"); person.setAge(30); person.setSalary(30000); System.out.println(person.info()); System.out.println(person.getSalary()); // 如果直接使用构造器指定属性 Person smith = new Person("smith", 80, 50000); System.out.println("===smith的信息==="); System.out.println(smith.info()); } } class Person { public String name;//名字公开 private int age;//年龄私有 private double salary;//... //构造器alt+insert public Person(){ } //有3个属性的构造器 public Person(String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; //可以将set方法写在构造器中,这样仍然可以验证 setName(name); setAge(age); setSalary(salary); } //自己写setxxx和getxxx太慢,使用快捷键 //然后根据要求来完善我们的代码. public String getName() { return name; } public void setName(String name) { //加入对数据的校验,相当于增加了业务逻辑 if(name.length() >= 2 && name.length() <= 6){ this.name = name; }else{ System.out.println("名字的长度不对,需要(2-6)个字符,默认名字"); this.name = "无名人"; } } public int getAge(){ return age; } public void setAge(int age) { if(age >= 1 && age <= 120){ this.age = age; }else{ System.out.println("你设置的年龄不对,年龄需要在1-120,默认年龄18"); this.age = 18;//给一个默认年龄 } } public double getSalary() { //可以这里增加对当前对象的权限判断 return salary; } public void setSalary(double salary) { this.salary = salary; } //写一个方法,返回属性信息 public String info(){ return "信息为name=" + name + " age=" + age + " 薪水=" + salary; } }
package com.hspedu.encap; public class Account { //为了封装,将3个属性设置为private private String name; private double balance; private String pwd; //两个构造器 public Account(){ } public Account(String name, double balance, String pwd) { this.setName(name); this.setBalance(balance); this.setPwd(pwd); } public String getName() { return name; } public void setName(String name) { if(name.length() >= 2 && name.length() <= 4){ this.name = name; }else{ System.out.println("名字输入错误,姓名要求(长度为2,3,4),默认值无名"); this.name = "无名"; } } public double getBalance() { return balance; } public void setBalance(double balance) { if(balance > 20){ this.balance = balance; }else{ System.out.println("余额必须>20,默认为0"); } } public String getPwd() { return pwd; } public void setPwd(String pwd) { if(pwd.length() == 6){ this.pwd = pwd; }else{ System.out.println("密码必须是6位,默认密码为000000"); this.pwd = "000000"; } } //显示账号信息 public void showInfo(){ //可以增加一个权限校验 System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码=" + pwd); // if() { // System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码="); // }else{ // System.out.println("你无权查看..."); // } } }
package com.hspedu.encap; public class AccountTest { public static void main(String[] args) { //创建Account Account account = new Account("jack",60,"123456"); //Account account = new Account(); //account.setName("jack"); //account.setBalance(60); //account.setPwd("123456"); account.showInfo(); } }
package com.hspedu.extend; //小学生->模拟小学生考试的情况 public class Pupil { public String name; public int age; private double score; public void setScore(double score) { this.score = score; } public void testing(){ System.out.println("小学生" + name + "正在考小学数学..."); } public void showInfo() { System.out.println("小学生名" + name + "年龄" + age + "分数" +score); } }
package com.hspedu.extend; //大学生考试情况-模拟大学生类 public class Graduate { public String name; public int age; private double score; public void setScore(double score) { this.score = score; } public void testing(){ System.out.println("大学生" + name + "正在考大学数学..."); } public void showInfo() { System.out.println("大学生" + name + "年龄" + age + "分数" +score); } }
package com.hspedu.extend; public class Extends01 { public static void main(String[] args) { Pupil pupil = new Pupil(); pupil.name = "银角大王"; pupil.age = 10; pupil.testing(); pupil.setScore(60); pupil.showInfo(); System.out.println("====="); Graduate graduate = new Graduate(); graduate.name = "金角大王"; graduate.age = 22; graduate.testing(); graduate.setScore(100); graduate.showInfo(); } }
package com.hspedu.extend.improve_; public class Pupil extends Student{ public void testing(){ System.out.println("小学生" + name + "正在考小学数学..."); } }
package com.hspedu.extend.improve_; public class Graduate extends Student{ public void testing(){ System.out.println("大学生" + name + "正在考大学数学..."); } }
package com.hspedu.extend.improve_; //父类 public class Student { //共有属性 public String name; public int age; private double score; //共有方法 public void setScore(double score) { this.score = score; } public void showInfo() { System.out.println("学生" + name + "年龄 " + age + " 分数 " +score); } }
package com.hspedu.extend.improve_; import com.hspedu.extend.Graduate; import com.hspedu.extend.Pupil; public class Extends01 { public static void main(String[] args) { com.hspedu.extend.Pupil pupil = new Pupil(); pupil.name = "银角大王~"; pupil.age = 11; pupil.testing(); pupil.setScore(50); pupil.showInfo(); System.out.println("====="); com.hspedu.extend.Graduate graduate = new Graduate(); graduate.name = "金角大王~"; graduate.age = 23; graduate.testing(); graduate.setScore(80); graduate.showInfo(); } }
package com.hspedu.encap; public class TopBase {//父类是Object public TopBase() { System.out.println("父类的父类构造器TopBase()被调用"); } }
package com.hspedu.extend; import com.hspedu.encap.TopBase; public class Base extends TopBase {//父类 //4个属性 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; public Base() {//父类的无参构造器 System.out.println("父类Base()构造器被调用..."); } public Base(String name,int age){//父类的有参构造器1 System.out.println("父类Base(String name,int age)被调用..."); } public Base(String name){//父类的有参构造器2 System.out.println("父类Base(String name)被调用..."); } //父类提供public方法,返回n4 public int getN4(){ return n4; } public void test100() { System.out.println("test100"); } protected void test200() { System.out.println("test200"); } void test300() { System.out.println("test300"); } private void test400() { System.out.println("test400"); } public void callTest400(){ test400(); } }
package com.hspedu.extend; import java.util.Arrays; //输入ctrl + H 可以看到类的继承关系 public class Sub extends Base {//子类 public Sub(String name,int age){ //1.调用父类的无参构造器,或者什么都不写 //super();//父类的无参构造器 //2.调用父类的Base(String name)构造器 //细节4:如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表) //super("hsp"); //3.调用父类的Base(String name,int age)构造器 super("hsp",11); //细节5:super在使用时,必须放在构造器的第一行(super只能在构造器中使用) //细节6:super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器 System.out.println("子类Sub(String name,int age)构造器被调用...."); } public Sub() {//子类的无参构造器 //细节2:默认隐藏调用父类的无参构造器 //super(); super("smith",10); System.out.println("子类Sub()构造器被调用...."); } //细节3-1:当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器 public Sub(String name) { //细节3-2:如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用 //父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过 super("tom",30); System.out.println("子类Sub(String name) 构造器被调用...."); } public void sayOk() {//子类方法 //细节1:非私有的属性和方法可以在子类直接访问 //私有的属性和方法不可以在子类直接访问 System.out.println(n1 + " " + n2 + " " + n3 + " "); test100(); test200(); test300(); //test400();//错误 //属性n4无法输出,要通过父类提供的公共方法去访问 System.out.println("n4=" + getN4()); //要通过父类提供的公共方法去访问 callTest400(); } }
package com.hspedu.extend; public class ExtendsDetail { public static void main(String[] args) { // System.out.println("==第1个对象=="); // Sub sub = new Sub();//创建子类对象sub // System.out.println("==第2个对象=="); // Sub sub2 = new Sub("jack");//创建子类对象sub2 System.out.println("==第3个对象=="); Sub sub3 = new Sub("king",10);//创建子类对象sub3 //sub.sayOk(); } }
package com.hspedu.extend; /** 讲解继承的本质 */ public class ExtendsTheory { public static void main(String[] args) { Son son = new Son();//内存的布局 //1.首先看子类是否有该属性 //2.如果子类有这个属性,并且可以访问(比如private 私有) //3.如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息...) //4.如果父类没有就按照3.的规则,就继续找上级父类,直到Object... System.out.println(son.name);//返回的是大头儿子 // System.out.println(son.age);//返回的是39 System.out.println(son.getAge());//返回的是39 System.out.println(son.hobby);//返回的是旅游 } } class Grandpa {//爷类Grandpa String name = "大头爷爷"; String hobby = "旅游"; } class Father extends Grandpa {//父类Father String name = "大头爸爸"; private int age = 39; public int getAge() { return age; } } class Son extends Father {//子类Son String name = "大头儿子"; }
package com.hspedu.extend.exercise; public class ExtendsExercise01 { public static void main(String[] args) { B b = new B(); /** * 结果 * a * b name * b */ } } class A { A() { System.out.println("a"); } A(String name) { System.out.println("a name"); } } class B extends A { B() { this("abc");//有了this以后就没有super()了 System.out.println("b"); } B(String name) { //解题关键:分析出有默认的super(); System.out.println("b name"); } }
package com.hspedu.extend.exercise; public class ExtendsExercise02 { public static void main(String[] args) { C c = new C(); /** * 结果: * 我是A类 * hahah我是B类的有参构造器 * 我是C类的有参构造 * 我是C类的无参构造 * */ } } class A{//A类 public A() { System.out.println("我是A类"); } } class B extends A{//B类,继承A类 public B(){ System.out.println("我是B类的无参构造器"); } public B(String name){ //解题关键:分析出有默认的super(); System.out.println(name + "我是B类的有参构造器"); } } class C extends B{ public C(){ this("hello"); System.out.println("我是C类的无参构造"); } public C(String name){ super("hahah"); System.out.println("我是c类的有参构造"); } }
package com.hspedu.extend.exercise; public class Computer { private String cpu; private int memory; private int disk; public Computer(String cpu, int memory, int disk) { this.cpu = cpu; this.memory = memory; this.disk = disk; } public String getDetails(){ return " cpu=" + cpu + " memory=" + memory + " disk=" + disk; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public int getMemory() { return memory; } public void setMemory(int memory) { this.memory = memory; } public int getDisk() { return disk; } public void setDisk(int disk) { this.disk = disk; } }
package com.hspedu.extend.exercise; public class PC extends Computer{ private String brand; //这里IDEA 根据继承的规则,自动把构造器的调用写好 //这里也体现出继承的一个基本设计的基本思想,父类的构造器完成父类属性初始化 //子类的构造器就完成子类的属性初始化 public PC(String cpu, int memory, int disk, String brand) { super(cpu, memory, disk); this.brand = brand; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public void printInfo() { System.out.println("PC信息="); //调用父类的getDetails方法,得到相关属性... System.out.println(getDetails() + " brand=" + brand); // System.out.println(getCpu() + getDisk() + getMemory() + getBrand()); } }
package com.hspedu.extend.exercise; public class NotePad extends Computer{ private String color; public NotePad(String cpu, int memory, int disk, String color) { super(cpu, memory, disk); this.color = color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void printInnfo() { System.out.println("PC信息="); System.out.println(getDetails() + " color=" + color); } }
package com.hspedu.extend.exercise; public class ExtendsExercise03 { public static void main(String[] args) { PC pc = new PC("intel",16,500,"IBM"); pc.printInfo(); NotePad notepad = new NotePad("mac",24,1000,"black"); notepad.printInnfo(); } }
package com.hspedu.super_; public class B extends A { public int n1 = 888; //编写测试方法 public void test() { //细节3:Super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super //去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则 //A->B->C,当然也需要遵守访问权限的相关规则 System.out.println("super.n1=" + super.n1); super.cal(); } //语法1:访问父类的属性,但不能访问父类的private属性 [案例]super。属性名 public void hi() { //super.n4为父类的private属性不能访问 System.out.println(super.n1 + " " + super.n2 + " " +super.n3 /*+ super.n4*/); } //语法2:访问父类的方法,不能访问父类的private方法[案例] super。方法名(参数列表) public void ok(){ super.test100(); super.test200(); super.test300(); //super.test400();父类的private方法不能访问 } //语法3:访问父类的构造器:super(参数列表);只能放在构造器的第一句,只能出现一句: public B(){ // super(); // super("jack"); super("jack",10); } public void cal() { System.out.println("B类的cal()方法..."); } public void sum() { //细节1:调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化) System.out.println("B类的sum()"); //细节2-1:希望调用父类A的cal方法 //这时,因为子类B没有cal方法,因此可以使用下面三种方式: //找cal方法时,顺序是: //1.先找本类,如果有,则调用 //2.如果没有,则找父类(如果有并可以调用则调用) //3.如果父类没有,则继续找父类的父类,整个规则就是一样的。 //提示:如果查找方法的过程中,找到了,但是不能访问,则报错 // 如果查找方法的过程中,没有找到,则提示方法不存在 cal(); this.cal();//等价于cal() super.cal();//直接进入上面的第2步找父类,其他规则一样 /** * 结果: * B类的sum() * B类的cal()方法... * B类的cal()方法... * A类的cal()方法... * */ //细节2-2:演示访问属性的规则 //n1和this查找的规则是 //1.先找本类,如果有,则调用 //2.如果没有,则找父类(如果有并可以调用则调用) //3.如果父类没有,则继续找父类的父类,整个规则就是一样的。 //提示:如果查找属性的过程中,找到了,但是不能访问,则报错 // 如果查找属性的过程中,没有找到,则提示属性不存在 System.out.println(n1); System.out.println(this.n1); //super.n1的顺序是直接找父类,其他的规则一样 System.out.println(super.n1); /** * 结果: * 888 * 888 * 100 * */ } }
package com.hspedu.super_; public class A extends Base{ //4个属性 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; public A(){} public A(String name) {} public A(String name,int age){} public void cal() { System.out.println("A类的cal()方法..."); } public void test100() { } protected void test200() { } void test300() { } private void test400() { } }
package com.hspedu.super_; public class Base { public int n1 = 999; public int age = 111; public void cal() { System.out.println("Base类的cal()方法..."); } public void eat() { System.out.println("Base类中eat()方法..."); } }
package com.hspedu.super_; public class Super01 { public static void main(String[] args) { B b = new B();//子类对象 // b.sum(); b.test(); } }
package com.hspedu.override_; public class Dog extends Animal{ //细节1:子类的方法的形参列表,方法名称要和父类方法的形参列表,方法名称完全一样 //1.因为Dog是Animal子类 //2.Dog的cry方法和Animal的cay()方法定义形式一样(名称,返回类型,参数) //3.Dog的cry()方法重写了Animal的cry()方法 public void cry() { System.out.println("小狗汪汪叫"); } //细节2:子类方法的返回类型和父类返回类型一样 //或者是父类返回类型的子类,比如父类返回类型是Object,子类方法返回类型是String public String m1(){ return null; } //细节3:子类方法不能缩小父类方法的访问权限 //public > protected > 默认 > private public void eat() { } }
package com.hspedu.override_; public class Animal { public void cry() { System.out.println("动物叫唤..."); } public Object m1() { return null; } protected void eat() { } }
package com.hspedu.override_; public class Override01 { public static void main(String[] args) { //演示方法重写的情况 Dog dog = new Dog(); dog.cry();//小狗汪汪叫 } }
package com.hspedu.override_; //编写一个Student类,继承Person类,增加id、score属性/private //以及构造器,定义say方法(返回自我介绍的信息) public class Student extends Person { private int id; private double score; public Student(String name, int age, int id, double score) { super(name, age);//调用父类构造器 this.id = id; this.score = score; } //say方法 public String say(){//体现super好处,代码复用 return super.say() + ",id是" + id + ",分数是" + score; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } }
package com.hspedu.override_; //编写一个Person类,包括属性/private(name、age),构造 // 器,方法say(返回自我介绍的字符串) public class Person { private String name; private int age; public Person(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 String say(){ return "我的名字是:" + name + ",我的年龄是" + age; } }
package com.hspedu.override_; public class OverrideExercise { //在main中分别创建Person和Student对象,调用say方法输出自我介绍 public static void main(String[] args) { Person jack = new Person("jack",10); System.out.println(jack.say()); Student smith = new Student("smith",19,144564,92.8); System.out.println(smith.say()); } }
package com.hspedu.poly_; public class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.hspedu.poly_; public class Cat extends Animal { public Cat(String name) { super(name); } }
package com.hspedu.poly_; public class Dog extends Animal { public Dog(String name) { super(name); } }
package com.hspedu.poly_; public class Fish extends Food { public Fish(String name) { super(name); } }
package com.hspedu.poly_; public class Bone extends Food { public Bone(String name) { super(name); } }
package com.hspedu.poly_; public class Food { private String name; public Food(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.hspedu.poly_; public class Master { private String name; public Master(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //完成主人给小狗喂食骨头 public void feed(Dog dog,Bone bone){ System.out.println("主人" + name + "给" + dog.getName() + "吃" + bone.getName()); } //完成主人给小猫喂食黄花鱼 public void feed(Cat cat,Fish fish){ System.out.println("========"); System.out.println("主人" + name + "给" + cat.getName() + "吃" + fish.getName()); } //如果动物很多,食物很多 //feed方法很多,不利于管理和维护 //Pig --> Rice //Tiger --> meat //... }
package com.hspedu.poly_; public class poly01 { public static void main(String[] args) { Master tom = new Master("tom"); Dog dog1 = new Dog("大黄狗"); Bone bone1 = new Bone("大棒骨"); tom.feed(dog1,bone1); Cat cat1 = new Cat("小花猫"); Fish fish1 = new Fish("黄花鱼"); tom.feed(cat1,fish1); } }
package com.hspedu.poly_; public class PloyMethod { public static void main(String[] args) { //方法重载体现多态 A a = new A(); //传入不同的参数,就会调用不同的sum方法,就体现多态 System.out.println(a.sum(10,20)); System.out.println(a.sum(20,30,40)); //方法重写体现多态 B b = new B(); a.say(); b.say(); } } class B {//父类 public void say() { System.out.println("B say()方法被调用..."); } } class A extends B {//子类 public int sum(int n1,int n2) {//和下面sum构成重载 return n1 + n2; } public int sum(int n1, int n2, int n3){ return n1 + n2 + n3; } public void say() { System.out.println("A say()方法被调用..."); } }
Animal.java
package com.hspedu.poly_.objpoly_; public class Animal { public void cry(){ System.out.println("Animal cry()动物再叫..."); } }
Cat.java
package com.hspedu.poly_.objpoly_; public class Cat extends Animal{ public void cry(){ System.out.println("Cat cry()小猫喵喵叫..."); } }
Dog.java
package com.hspedu.poly_.objpoly_; public class Dog extends Animal{ public void cry(){ System.out.println("Dog cry()小狗汪汪叫..."); } }
PolyObject.java
package com.hspedu.poly_.objpoly_; public class PolyObject { public static void main(String[] args) { //体验对象多态的特点 //animal编译类型就是Animal,运行类型就是Dog Animal animal = new Dog(); //因为运行时,执行到该行时,animal运行类型就是Dog,所以cry就是dog cry animal.cry();//Dog cry()小狗汪汪叫... //animal编译类型是Animal,运行类型就是Cat animal = new Cat(); animal.cry();//Cat cry()小猫喵喵叫... } }
package com.hspedu.poly_; public class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.hspedu.poly_; public class Cat extends Animal { public Cat(String name) { super(name); } }
package com.hspedu.poly_; public class Dog extends Animal { public Dog(String name) { super(name); } }
com.hspedu.poly_.Pig.java
package com.hspedu.poly_; public class Pig extends Animal { public Pig(String name) { super(name); } }
com.hspedu.poly_.Rice.java
package com.hspedu.poly_; public class Rice extends Food{ public Rice(String name) { super(name); } }
package com.hspedu.poly_; public class Fish extends Food { public Fish(String name) { super(name); } }
package com.hspedu.poly_; public class Bone extends Food { public Bone(String name) { super(name); } }
package com.hspedu.poly_; public class Food { private String name; public Food(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.hspedu.poly_; public class Master { private String name; public Master(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //使用多态机制 ,可以统一管理主人喂食的问题 //animal编译类型是Animal,可以指向(接收)Animal子类的对象 //food变异类型是Food,可以指向(接收)Food子类的对象 public void feed(Animal animal,Food food){ System.out.println("主人" + name + "给" + animal.getName() + "吃" + food.getName()); } // //主人给小狗喂食,骨头 // public void feed(Dog dog,Bone bone){ // System.out.println("主人" + name + "给" + dog.getName() + "吃" + bone.getName()); // } // public void feed(Cat cat,Fish fish){ // System.out.println("主人" + name + "给" + cat.getName() + "吃" + fish.getName()); // } }
package com.hspedu.poly_; public class Poly01 { public static void main(String[] args) { Master tom = new Master("汤姆"); Dog dog = new Dog("大黄~"); Bone bone = new Bone("大棒骨~"); tom.feed(dog,bone); System.out.println("=============="); Cat cat = new Cat("小花猫~"); Fish fish = new Fish("黄花鱼~"); tom.feed(cat,fish); System.out.println("=============="); //添加给小猪喂米饭 Pig pig = new Pig("小白猪"); Rice rice = new Rice("米饭"); tom.feed(pig,rice); //输出结果为 //主人汤姆给大黄~吃大棒骨~ //============== //主人汤姆给小花猫~吃黄花鱼~ //============== //主人汤姆给小白猪吃米饭 } }
Animal.java
package com.hspedu.poly_.detail_; public class Animal { String name = "动物"; int age = 10; public void sleep(){ System.out.println("睡"); } public void run(){ System.out.println("跑"); } public void eat(){ System.out.println("吃"); } private void show(){ System.out.println("hello,你好"); } }
Cat.java
package com.hspedu.poly_.detail_; public class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); } public void catchMouse(){//Cat特有方法 System.out.println("猫抓老鼠"); } }
Dog.java
package com.hspedu.poly_.detail_; public class Dog extends Animal { }
PolyDetail.java
package com.hspedu.poly_.detail_; public class PolyDetail { public static void main(String[] args) { //向上转型:父类的引用指向了子类的对象 //语法:父类类型引用名=new 子类类型(); Animal animal = new Cat(); // Object obj = new Cat();//Object也是Cat的父类的父类,可以使用 System.out.println("ok~~"); //向上转型方法的规则: //1.可以调用父类中的所有成员(需要遵守访问权限) //2.但是不能调用子类的特有的成员(属性和方法) //3.因为在编译阶段,能调用哪些成员,是由编译类型来决定的 //animal.catchMouse();错误 //4.最终运行效果看子类(运行类型)的具体实现,即调用方法时,按照从子类(运行类型)开始查找方法,然后调用,规则和我们前面讲的方法调用规则一致。 animal.eat();//猫吃鱼 animal.run();//跑 //animal.show();//错误,private权限受阻 animal.sleep();//睡 //多态的向下转型: //调用Cat的catchMouse方法 //1.语法:子类类型 引用名 = (子类类型) 父类引用 //cat的编译类型Cat,运行类型是Cat Cat cat = (Cat) animal; cat.catchMouse();//猫抓老鼠 //2.要求父类的引用必须指向的是当前目标类型的对象 //Dog dog = (Dog) animal;//错误,类异常 } }
PolyDetail02.java
package com.hspedu.poly_.detail_; public class PolyDetail02 { public static void main(String[] args) { //属性没有重写之说,属性的值看编译类型 Base base = new Sub();//向上转型 System.out.println(base.count);//10(直接看编译类型) Sub sub = new Sub(); System.out.println(sub.count);//20 } } class Base { int count = 10; } class Sub extends Base{ int count = 20; }
PolyDetail03.java
package com.hspedu.poly_.detail_; public class PolyDetail03 { public static void main(String[] args) { BB bb = new BB(); System.out.println(bb instanceof BB);//true System.out.println(bb instanceof AA);//true //aa的编译类型是AA,运行类型是BB AA aa = new BB(); System.out.println(aa instanceof AA);//true System.out.println(aa instanceof BB);//true //结论:判断对象的运行类型是否为XX类型或者XX类型的子类型 Object obj = new Object(); System.out.println((obj instanceof AA));//false String str = "hello"; //System.out.println(str instanceof AA);//没有任何关系 System.out.println(str instanceof Object);//true } } class AA{ } class BB extends AA{ }
PolyExercise01.java
package com.hspedu.poly_.exercise_; public class PolyExercise01 { public static void main(String[] args) { double d = 13.4;//ok long l = (long)d;//ok System.out.println(l);//13 int in = 5;//ok //boolean b = (boolean)in;错误,boolean->int Object obj = "hello";//ok,向上转型 String objStr = (String)obj;//ok,向下转型 System.out.println(objStr);//hello Object objPri = new Integer(5);//ok,向上转型 String str = (String)objPri;//错误class ClassCastException指向Integer的父类引用,转成String Integer sr1 = (Integer)objPri;//ok,向下转型 } }
PolyExercise02.java
package com.hspedu.poly_.exercise_; public class PolyExercise02 { 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 } } 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); } }
DynamicBinding.java
package com.hspedu.poly_.dynamic_; public class DynamicBinding { public static void main(String[] args) { //a的编译类型A,运行类型B A a = new B();//向上转型 System.out.println(a.sum());//30 System.out.println(a.sum1());//20 } } class A{ public int i = 10; //动态绑定机制: //1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定 public int sum(){ return getl() + 10; } //2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用 public int sum1(){ return i + 10; } public int getl(){//父类getI return i; } } class B extends A{ public int i = 20; // public int sum(){ // return i + 20; // } public int getl(){//子类getI() return i; } // public int sum1(){ // return i + 10; // } }
Person.java
package com.hspedu.poly_.polyarr_; public class Person { private String name; private int age; public Person(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 String say(){ return name + "\t" + age; } }
Student.java
package com.hspedu.poly_.polyarr_; public class Student extends Person{ private double score; public Student(String name, int age, double score) { super(name, age); this.score = score; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } //特有方法 public void study(){ System.out.println("学生" + getName() + "正在学java课程 "); } //重写父类的say() public String say() { return "学生" + super.say() + " score=" + score; } }
Teacher.java
package com.hspedu.poly_.polyarr_; public class Teacher extends Person{ private double salary; public Teacher(String name, int age, double salary) { super(name, age); this.salary = salary; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } //特有方法 public void teach(){ System.out.println("老师" + getName() + "正在讲java课程 "); } //重写父类的say() public String say() { return "老师" + super.say() + " salary=" + salary; } }
PolyArray.java
package com.hspedu.poly_.polyarr_; public class PolyArray { public static void main(String[] args) { //应用实例:现有一个继承结构如下:要求创建1个Peron对象 //2个Student 对象和2个Teacher对象,统一放在数组中,并调用每个对象say()方法。 Person[] persons = new Person[5]; persons[0] = new Person("jack",20); persons[1] = new Student("mary",18,99.8); persons[2] = new Student("Smith",19,66.6); persons[3] = new Teacher("Scott",30,20000); persons[4] = new Teacher("King",50,25000); //循环遍历多态数组,调用say()方法 for (int i = 0; i < persons.length; i++) { //persons[i]编译类型是Person,运行类型是根据实际情况由JVM来判断 System.out.println(persons[i].say());//动态绑定机制 //使用类型判断和向下转型 if(persons[i] instanceof Student){//判断persons[i]的运行类型是不是Student Student student = (Student)persons[i]; student.study(); //((Student)persons[i]).study(); }else if(persons[i] instanceof Teacher){ Teacher teacher = (Teacher)persons[i]; teacher.teach(); //((Teacher)persons[i]).teach(); }else if(persons[i] instanceof Person){ }else{ System.out.println("你的类型有误,请自己检查"); } } } }
Employee.java
package com.hspedu.poly_.polyparameter_; public class Employee { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } //得到年工资的方法 public double getAnnual(){ return 12 * salary; } }
Worker.java
package com.hspedu.poly_.polyparameter_; public class Worker extends Employee{ public Worker(String name, double salary) { super(name, salary); } public void work(){ System.out.println("普通员工" + getName() + " is working"); } //重写获取年薪的方法 public double getAnnual() {//因为普通员工没有其他收入,直接调用父类方法 return super.getSalary(); } }
Manager.java
package com.hspedu.poly_.polyparameter_; public class Manager extends Employee{ private double bonus; public Manager(String name, double salary, double bonus) { super(name, salary); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } public void manage(){ System.out.println("经理" + getName() + " is managing"); } //重写获取年薪的方法 public double getAnnual() { return super.getAnnual() + bonus; } }
PolyParameter.java
package com.hspedu.poly_.polyparameter_; public class PolyParameter { public static void main(String[] args) { Worker tom = new Worker("tom", 2500); Manager milan = new Manager("milan", 5000, 200000); PolyParameter polyParameter = new PolyParameter(); polyParameter.showEmpAnnual(tom);//2500.0 polyParameter.showEmpAnnual(milan);//260000.0 System.out.println("======="); polyParameter.testWork(tom);//普通员工tom is working polyParameter.testWork(milan);//经理milan is managing } //实现获取任何员工对象的年工资,并在main方法中调用该方法[e.getAnnual()] public void showEmpAnnual(Employee e){ System.out.println(e.getAnnual());//动态绑定机制 } //添加一个方法,testWork,如果是普通与昂,则调用work方法,如果是经理,则调用manage方法 public void testWork(Employee e){ if(e instanceof Worker){ ((Worker) e).work(); }else if(e instanceof Manager){ ((Manager) e).manage(); }else{ System.out.println("不做处理"); } } }
Equals01.java
package com.hspedu.object_; public class Equals01 { public static void main(String[] args) { A a = new A(); A b = a; A c = b; System.out.println(a == c);//true System.out.println(b == c);//true B bObj = a; System.out.println(bObj == c);//true } } class A extends B{ } class B{ }
Equals01.java
package com.hspedu.object_; public class Equals01 { public static void main(String[] args) { A a = new A(); A b = a; A c = b; System.out.println(a == c);//true System.out.println(b == c);//true B bObj = a; System.out.println(bObj == c);//true int num1 = 10; double num2 = 10.0; System.out.println(num1 == num2);//true //equals方法,源码怎么查看 //把光标放在equals上,直接输入ctrl+b //1.JDK源码String 类的equals方法 /* //把Object的equals方法重写了,变成了比较两个字符串值是否相同 public boolean equals(Object anObject) { if (this == anObject) {//如果是同一个对象 return true;//返回true } if (anObject instanceof String) {//判断类型 String anotherString = (String)anObject;//向下转型 int n = value.length; if (n == anotherString.value.length) {//如果长度相同 char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) {//然后一个个比较字符 if (v1[i] != v2[i]) return false; i++; } return true; } } return false;//如果比较的不是字符串,直接返回false }*/ String str1 = new String("hspedu"); String str2 = new String("hspedu"); System.out.println(str1 == str2);//false System.out.println(str1.equals(str2));//true //2.JDK源码Object类的equals方法 /* //即Object的equals方法默认就是比较对象地址是否相同 //也就是判断两个对象是不是同一个对象 public boolean equals(Object obj) { return (this == obj); } */ //3.JDK源码Integer类的equals方法 //也重写的Object的equals方法,变成了判断两个值是否相同 /* public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } * */ Integer integer1 = new Integer(1000); Integer integer2 = new Integer(1000); System.out.println(integer1 == integer2);//false System.out.println(integer1.equals(integer2));//true } } class A extends B{ } class B{ }
EqualsExercise01.java
package com.hspedu.object_; public class EqualsExercise01 { public static void main(String[] args) { Person person1 = new Person("jack", 10, '男'); Person person2 = new Person("jack", 10, '男'); System.out.println(person1.equals(person2));//假,因为没有重写,只比较person1和person2是否是同一个对象,重写之后,比较两个Person对象的各个属性值,返回true } } //判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回true,反之false class Person{//extends Object private String name; private int age; private char gender; //重写Object的equals方法 public boolean equals(Object obj) { //判断如果比较的两个对象是同一个对象则直接返回true if(this == obj){ return true; } //类型判断 if(obj instanceof Person){ //类型转换,向下转型,因为需要得到obj的各个属性 Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender; } //如果类型不是Person,则直接返回false return false; } public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; } 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 char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } }
HashCode.java
package com.hspedu.object_; public class HashCode { public static void main(String[] args) { AA aa1 = new AA(); AA aa2 = new AA(); AA aa3 = aa1; System.out.println("aa1.hashCode=" + aa1.hashCode()); System.out.println("aa2.hashCode=" +aa2.hashCode()); System.out.println("aa3.hashCode=" +aa3.hashCode()); } } class AA{ }
ToString.java
package com.hspedu.object_; public class ToString { public static void main(String[] args) { //Object的 toString()源码 //1.getClass().getName()类的全类名(包名+类名) //2.Interger.toHexString(HashCode())将对象的hashCode值转成16进制字符串 // public String toString() { // return getClass().getName() + "@" + Integer.toHexString(hashCode()); // } Monster monster = new Monster("小妖怪", "巡山", 1000); System.out.println(monster.toString() + " hachCode=" + monster.hashCode()); //com.hspedu.object_.Monster@1540e19d hachCode=356573597 //如下重写toString方法,输出结果为:Monster{name='小妖怪', job='巡山', salary=1000.0} hachCode=356573597 //当直接输出一个对象时,toString方法会被默认调用 System.out.println(monster);//Monster{name='小妖怪', job='巡山', salary=1000.0} } } class Monster{ private String name; private String job; private double salary; public Monster(String name, String job, double salary) { this.name = name; this.job = job; this.salary = salary; } //重写toString方法,输出对象的属性 @Override public String toString() {//重写后,一般是把对象的属性输出,也可以自己定制 return "Monster{" + "name='" + name + '\'' + ", job='" + job + '\'' + ", salary=" + salary + '}'; } }
Finalize.java
package com.hspedu.object_; //演示 Finalize的用法 public class Finalize { public static void main(String[] args) { Car bmw = new Car("宝马"); bmw = null;//这时Car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象,在销毁对象前,会调用该对象的Finalize方法,可以在finalize中,写业务逻辑代码(比如释放资源:数据库连接,或者打开的文件...),吐过不重写finalize,那么就会调用Object类的finalize,即默认处理,如果重写了finalize,就可以实现自己的逻辑 //bmw.finalize(); System.gc();//主动调用垃圾回收器 System.out.println("程序退出了..."); } } class Car{ private String name; public Car(String name) { this.name = name; } //重写finalize @Override protected void finalize() throws Throwable { System.out.println("我们销毁汽车" + name); System.out.println("释放了某些资源..."); } }
Debug01.java
package com.hspedu.debug_; public class Debug01 { public static void main(String[] args) { //演示逐行执行代码 int sum = 0; for(int i = 0;i < 5;i++){ sum += i; System.out.println("i=" + i); System.out.println("sum=" + i); } System.out.println("退出for..."); } }
Debug02.java
package com.hspedu.debug_; public class Debug02 { public static void main(String[] args) { int[] arr = {1,10,-1}; for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } System.out.println("退出 for..."); } }
Debug03.java
package com.hspedu.debug_; import java.util.Arrays; public class Debug03 { public static void main(String[] args) { //debug源码 int[] arr = {8,-1,199,70,10}; //程序,追入sort的源码,Arrays.sort方法底层实现debug Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } }
Debug04.java
package com.hspedu.debug_; import java.util.Arrays; //演示执行到下一个断点,同时支持动态的下断点 public class Debug04 { public static void main(String[] args) { //debug源码 int[] arr = {8,-1,199,70,10}; //程序,追入sort的源码,Arrays.sort方法底层实现debug Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); System.out.println("hello100"); System.out.println("hello200"); System.out.println("hello300"); System.out.println("hello400"); System.out.println("hello500"); System.out.println("hello600"); System.out.println("hello700"); } }
DebugExercise.java
package com.hspedu.debug_; //演示debug对象创建的过程,加深对调试的理解 public class DebugExercise { public static void main(String[] args) { //创建对象的流程 //1.加载Person信息 //2.初始化->默认初始化->显示初始化->构造器初始化 //3.返回对象的地址 Person jack = new Person("jack", 20); System.out.println(jack); } } class Person{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
DebugExercise.java
package com.hspedu.Debud_; public class DebugExercise { public static void main(String[] args) { //a的编译类型A,运行类型B A a = new B();//向上转型 System.out.println(a.sum());//30 System.out.println(a.sum1());//20 } } class A{ public int i = 10; //动态绑定机制: //1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定 public int sum(){ return getl() + 10; } //2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用 public int sum1(){ return i + 10; } public int getl(){//父类getI return i; } } class B extends A{ public int i = 20; // public int sum(){ // return i + 20; // } public int getl(){//子类getI() return i; } // public int sum1(){ // return i + 10; // } }
SmallChangeAys.java(面向过程版本)
package com.hspedu.smallchange; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; import java.util.logging.SimpleFormatter; public class SmallChangeAys { //化繁为简 //1.先完成显示菜单,并可以选择菜单,给出对应提示 //2.完成零钱通明细 //3.完成收益入账 //4.消费 //5.退出 //6.用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或n //7.在收益入账和消费时,判断金额是否合理,并给出相应的提示 public static void main(String[] args) { //定义相关的变量 boolean loop = true; Scanner scanner = new Scanner(System.in); String key = ""; //2.完成零钱通明细 //解决方法有三种: //(1)可以把收益入账和消费,保存到数组 //(2)可以使用对象 //(3)简单的话可以使用String拼接 String detail = "---------------零钱通明细------------------"; //3.完成收益入账 //定义新的变量(完成功能驱动程序猿增加新的变化和代码) double money = 0; double balance = 0; Date date = null;//date是java.util.Date类型,表示日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化的对象 //4.消费 //定义新变量,保存消费的原因 String note = ""; do{ System.out.println("\n=======零钱通菜单======="); System.out.println("\t\t\t\t1 零钱通明细"); System.out.println("\t\t\t\t2 收益入账"); System.out.println("\t\t\t\t3 消费"); System.out.println("\t\t\t\t4 退 出"); System.out.print("请选择(1-4):"); key = scanner.next(); //使用switch分支 switch(key){ case "1" : System.out.println(detail); break; case "2" : System.out.print("收益入账金额:"); money = scanner.nextDouble(); //money的范围应该校验 //7.在收益入账时,判断金额是否合理,并给出相应的提示 //思路:找出不正确的金额条件,给出提示,直接break if(money <= 0){ System.out.println("收益入账金额需要大于0"); break; } balance += money; //拼接收益入账信息到detail date = new Date();//获取当前日期 detail += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance; break; case "3" : System.out.print("消费金额:"); money = scanner.nextDouble(); //money的范围应该校验 //7.在消费时,判断金额是否合理,并给出相应的提示 //思路:找出不正确的金额条件,给出提示,直接break //过关斩将校验法 if(money <= 0 || money > balance){ System.out.println("您的消费金额应该在 0 ~ " + balance); break; } System.out.print("消费说明:"); note = scanner.next(); balance -= money; //拼接消费信息到detail date = new Date();//获取当前日期 detail += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance; break; case "4" : //5.退出 //6.用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或n //(1)定义一个变量choice,接收用户的输入 //(2)使用while+break,来处理接收到的输入是y或者n //(3)退出while后,判断choice是y还是n,就可以决定是否退出 //(4)一般代码完成一个小功能,尽量不要混在一起 String choice = ""; while(true){//要求用户必须输入y/n,否则就一直循坏 System.out.println("你确定要退出吗?y/n"); choice = scanner.next(); if("y".equals(choice) || "n".equals(choice)){ break; } /* * if("y".equal(choice)){ * loop = false; * break; * }else if("n".equals(choice)){ * break; * } */ } //当用户退出while,进行判断 if(choice.equals("y")){ loop = false; } break; default: System.out.println("选择有误,请重新选择"); } }while(loop); System.out.println("------退出了零钱通项目-------"); } }
SmallChangeAysOOP.java(面向对象版本)
package com.hspedu.smallchange.oop; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; /* * 该类是完成零钱通的各个功能的类 * 使用OOP(面向对象编程) * 将各个功能对应一个方法 * */ public class SmallChangeSysOOP { //1.定义相关的变量 boolean loop = true; Scanner scanner = new Scanner(System.in); String key = ""; //2.完成零钱通明细 //解决方法有三种: //(1)可以把收益入账和消费,保存到数组 //(2)可以使用对象 //(3)简单的话可以使用String拼接 String detail = "---------------零钱通明细------------------"; //3.完成收益入账 //定义新的变量(完成功能驱动程序猿增加新的变化和代码) double money = 0; double balance = 0; Date date = null;//date是java.util.Date类型,表示日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化的对象 //4.消费 //定义新变量,保存消费的原因 String note = ""; //1.先完成显示菜单,并可以选择 public void mainMenu(){ do{ System.out.println("\n=======OOP零钱通菜单======="); System.out.println("\t\t\t\t1 零钱通明细"); System.out.println("\t\t\t\t2 收益入账"); System.out.println("\t\t\t\t3 消费"); System.out.println("\t\t\t\t4 退 出"); System.out.print("请选择(1-4):"); key = scanner.next(); //使用switch分支 switch(key){ case "1" : this.detail(); break; case "2" : this.income(); break; case "3" : this.pay(); break; case "4" : this.exit(); break; default: System.out.println("选择有误,请重新选择"); } }while(loop); } //2.完成零钱通明细 public void detail(){ System.out.println(detail); } //3.完成收益入账 public void income(){ System.out.print("收益入账金额:"); money = scanner.nextDouble(); //money的范围应该校验 //7.在收益入账时,判断金额是否合理,并给出相应的提示 //思路:找出不正确的金额条件,给出提示,直接return if(money <= 0){ System.out.println("收益入账金额需要大于0"); return;//退出方法不再执行后面的代码。 } balance += money; //拼接收益入账信息到detail date = new Date();//获取当前日期 detail += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance; } //4.完成消费 public void pay(){ System.out.print("消费金额:"); money = scanner.nextDouble(); //money的范围应该校验 //7.在消费时,判断金额是否合理,并给出相应的提示 //思路:找出不正确的金额条件,给出提示,直接return //过关斩将校验法 if(money <= 0 || money > balance){ System.out.println("您的消费金额应该在 0 ~ " + balance); return; } System.out.print("消费说明:"); note = scanner.next(); balance -= money; //拼接消费信息到detail date = new Date();//获取当前日期 detail += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance; } //5.退出 public void exit(){ //5.退出 //6.用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或n //(1)定义一个变量choice,接收用户的输入 //(2)使用while+break,来处理接收到的输入是y或者n //(3)退出while后,判断choice是y还是n,就可以决定是否退出 //(4)一般代码完成一个小功能,尽量不要混在一起 String choice = ""; while(true){//要求用户必须输入y/n,否则就一直循坏 System.out.println("你确定要退出吗?y/n"); choice = scanner.next(); if("y".equals(choice) || "n".equals(choice)){ break; } /* * if("y".equal(choice)){ * loop = false; * break; * }else if("n".equals(choice)){ * break; * } */ } //当用户退出while,进行判断 if(choice.equals("y")){ loop = false; } } }
SmallChangeSysApp.java
package com.hspedu.smallchange.oop; /* * 这里直接调用SmallChangeSysOOP 对象,显示主菜单即可 * */ public class SmallChangeSysApp { public static void main(String[] args) { new SmallChangeSysOOP().mainMenu(); } }
Person.java
package com.hspedu.homework.homework01; public class Person { private String name; private int age; private String job; public Person(String name, int age, String job) { this.name = name; this.age = age; this.job = job; } 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 String getJob() { return job; } public void setJob(String job) { this.job = job; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", job='" + job + '\'' + '}'; } }
Homework01.java
package com.hspedu.homework.homework01; public class Homework01 { public static void main(String[] args) { Person[] persons = new Person[3]; persons[0] = new Person("jack", 18, "docter"); persons[1] = new Person("tom", 33, "sporter"); persons[2] = new Person("mary", 25, "tercher"); //输出当前对象的对象数组 for(int i = 0;i < persons.length;i++){ System.out.println(persons[i]); } //冒泡排序 Person tmp = null; for(int i = 0;i < persons.length - 1;i++){//外层循环 for(int j = 0;j < persons.length -1 -i;j++){//内层循环 //1.并按照age从大到小进行排序,如果前面的age小于后面就交换 //2.并按照age从小到大进行排序,如果前面的age小于后面就交换(if条件里的<更改为>即可) //3.要求按照名字的长度从小到大排序,比较条件为persons[i].getName().length() > persons[i+1].getName().length() if(persons[j].getAge() < persons[j+1].getAge()){ tmp = persons[j]; persons[j] = persons[j+1]; persons[j+1] = tmp; } } } System.out.println("==============="); //输出排序后对象的对象数组 for(int i = 0;i < persons.length;i++){ System.out.println(persons[i]); } } }
homework.java
package com.hspedu.homework.homework03; public class Homework03 { public static void main(String[] args) { Teacher Professor = new Professor("mary",22,"教授",5100.0,1.3); Professor.introduce(); } }
Teacher.java
package com.hspedu.homework.homework03; public class Teacher { private String name; private int age; private String post; private double salary; //增加一个工资级别 private double grade; public Teacher(String name, int age, String post, double salary, double grade) { this.name = name; this.age = age; this.post = post; this.salary = salary; this.grade = grade; } 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 String getPost() { return post; } public void setPost(String post) { this.post = post; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } public void introduce(){ System.out.println("老师姓名是" + name + ",年龄" + age + ",职称" + post + ",工资是" + salary * grade); } }
Professor.java
package com.hspedu.homework.homework03; public class Professor extends Teacher{ public Professor(String name, int age, String post, double salary, double grade) { super(name, age, post, salary, grade); } public void introduce(){ System.out.println("这是教授的信息"); super.introduce(); } }
AssProfess.java
package com.hspedu.homework.homework03; public class AssProfessor extends Teacher{ public AssProfessor(String name, int age, String post, double salary, double grade) { super(name, age, post, salary, grade); } public void introduce(){ System.out.println("这是副教授的信息"); super.introduce(); } }
Lecturer.java
package com.hspedu.homework.homework03; public class Lecturer extends Teacher{ public Lecturer(String name, int age, String post, double salary, double grade) { super(name, age, post, salary, grade); } public void introduce(){ System.out.println("这是讲师的信息"); super.introduce(); } }
Worker.java
package com.hspedu.homework.homework04; public class Worker { private String name; private double salary; private int days; private double grade; public Worker(String name, double salary, int days, double grade) { this.name = name; this.salary = salary; this.days = days; this.grade = grade; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } public void getSal(){ System.out.println("姓名" + name + ",工资=" + salary * days *grade); } }
Genworker.java
package com.hspedu.homework.homework04; public class GenWorker extends Worker{ public GenWorker(String name, double salary, int days, double grade) { super(name, salary, days, grade); } //重写父类的getSal方法 public void getSal(){ //因为经理的计算方式和worker一样,所以直接调用父类 System.out.print("普通员工"); super.getSal(); } }
Manager.java
package com.hspedu.homework.homework04; public class Manager extends Worker{ //特有属性:奖金 private double bonus; //创建Manager对象时,奖金是多少并不是确定的,因此在构造器中,不给bonus public Manager(String name, double salary, int days, double grade) { super(name, salary, days, grade); } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } //重写父类的getSal方法 public void getSal(){ //因为经理的计算方式和worker不一样,所以重写 System.out.println("经理" + getName() + ",工资=" + (bonus + getDays() * getSalary() * getGrade())); } }
Homework04.java
package com.hspedu.homework.homework04; public class Homework04 { public static void main(String[] args) { Manager jack = new Manager("jack", 100, 20, 1.2); //设置奖金 jack.setBonus(3000); jack.getSal(); GenWorker daben = new GenWorker("daben", 50, 30, 1.0); daben.getSal(); } }
Employee.java
package com.hspedu.homework.homework05; public class Employee { //属性 //分析有一个带薪对的月份13,15,12 private String name; private double salary; private int salMonth = 12; public Employee(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public int getSalMonth() { return salMonth; } public void setSalMonth(int salMonth) { this.salMonth = salMonth; } //方法 //打印全年工资 public void printSal(){ System.out.println(name + "年工资=" + (salary * salMonth)); } }
Worker.java
package com.hspedu.homework.homework05; public class Worker extends Employee{ public Worker(String name, double salary) { super(name, salary); } public void printSal(){ System.out.print("工人:"); super.printSal();//使用了父类的printSal方法 } }
Peasant.java
package com.hspedu.homework.homework05; public class Peasant extends Employee{ public Peasant(String name, double salary) { super(name, salary); } public void printSal(){ System.out.print("农民:"); super.printSal(); } }
Waiter.java
package com.hspedu.homework.homework05; public class Waiter extends Employee{ public Waiter(String name, double salary) { super(name, salary); } public void printSal(){ System.out.print("服务员:"); super.printSal(); } }
Teacher.java
package com.hspedu.homework.homework05; public class Teacher extends Employee{ private double ClassSal; private int days; public Teacher(String name, double salary) { super(name, salary); } public double getClassSal() { return ClassSal; } public void setClassSal(double classSal) { ClassSal = classSal; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public void printSal(){ System.out.print("老师:"); System.out.println(getName() + "工资=" + (getSalary() * getSalMonth() + ClassSal * days)); } }
Scientist.java
package com.hspedu.homework.homework05; public class Scientist extends Employee{ private double bone; public Scientist(String name, double salary) { super(name, salary); } public double getBone() { return bone; } public void setBone(double bone) { this.bone = bone; } public void printSal(){ System.out.print("科学家:"); System.out.println(getName() + "工资=" + (getSalary() * getSalMonth() + bone)); } }
Homework05.java
package com.hspedu.homework.homework05; public class Homework05 { public static void main(String[] args) { //农民: Peasant peasant = new Peasant("马杰克", 3000); peasant.setSalMonth(10); peasant.printSal(); //服务员: Waiter waiter = new Waiter("其可", 6000); waiter.printSal(); //工人: Worker worker = new Worker("刘昊然", 9000); worker.printSal(); //IT老师: Teacher teacher = new Teacher("郭勇", 75000); teacher.setDays(360); teacher.setClassSal(1000); teacher.printSal(); //科学家: Scientist scientist = new Scientist("邓佳佳", 30000); scientist.setBone(2000000); scientist.printSal(); } }
package com.hspedu.homework.homework07; public class Homework07 { } class Test{ String name = "Rose"; Test(){ System.out.println("Test"); } Test(String name){ this.name = name;//把父类的name=Rose修改name=john } } class Demo extends Test{ String name = "Jack"; Demo(){ super(); System.out.println("Demo"); } Demo(String s){ super(s); } public void test(){ System.out.println(super.name); System.out.println(this.name); } public static void main (String[] args){ new Demo().test();//匿名对象 new Demo("john").test();//匿名对象 } /* Test Demo Rose Jack john Jack * */ }
BankAccount.java
package com.hspedu.homework.homework08; class BankAccount { private double balance; public BankAccount(double initialBalance) { this.balance = initialBalance; } //存款 public void deposit(double amount) { balance += amount; } //取款 public void withdraw(double amount) { balance -= amount; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
SavingsAccount.java
package com.hspedu.homework.homework08; public class SavingsAccount extends BankAccount{ //扩展前一个练习的BankAccount类 //新类SavingsAccount每个月都有利息产生(earnMonthlyInterest方法被调用) //并且有每月三次免手续费的存款或者取款。在earnMonthlyInterest方法中重置交易计数 //新增加属性 private int count = 3; private double rate = 0.01;//利率 public void earnMonthlyInterest(){//每个月初,统计上个月的利息,同时将count = 3 count = 3; super.deposit(getBalance() * rate); } public SavingsAccount(double initialBalance) { super(initialBalance); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public double getRate() { return rate; } public void setRate(double rate) { this.rate = rate; } @Override public void deposit(double amount) { //判断是否还可以免手续费 if(count > 0){ super.deposit(amount); }else{ super.deposit(amount - 1); } count--;//减去一次 } @Override public void withdraw(double amount) { if(count > 0){ super.withdraw(amount); }else{ super.withdraw(amount + 1); } count--; } }
CheckingAccount.java
package com.hspedu.homework.homework08; public class CheckingAccount extends BankAccount{ public CheckingAccount(double initialBalance) { super(initialBalance); } @Override public void deposit(double amount) {//存款 super.deposit(amount - 1);//巧妙使用父类的deposit //1块钱转入银行的账号 } @Override public void withdraw(double amount) {//存款 super.withdraw(amount + 1); //1块钱转入银行的账号 } }
Homework08.java
package com.hspedu.homework.homework08; public class Homework08 { public static void main(String[] args) { // CheckingAccount checkingAccount = new CheckingAccount(1000); // checkingAccount.deposit(10); // System.out.println(checkingAccount.getBalance());//1009.0 // checkingAccount.withdraw(9); // System.out.println(checkingAccount.getBalance());//999.0 //测试SavingAccount SavingsAccount savingsAccount = new SavingsAccount(1000); savingsAccount.deposit(100);//免手续费 savingsAccount.deposit(100);//免手续费 savingsAccount.deposit(100);//免手续费 System.out.println(savingsAccount.getBalance());//1300.0 savingsAccount.deposit(100); System.out.println(savingsAccount.getBalance());//1399.0 //月初,定时器自动调用一下 earnMonthlyInterest savingsAccount.earnMonthlyInterest(); System.out.println(savingsAccount.getBalance());//1399+13.99=1412.99 savingsAccount.withdraw(100);//免手续费 System.out.println(savingsAccount.getBalance());//1412.99-100=1312.99 savingsAccount.withdraw(100);//免手续费 savingsAccount.withdraw(100);//免手续费 System.out.println(savingsAccount.getBalance());//1412.99-200=1112.99 savingsAccount.deposit(100);//扣手续费 System.out.println(savingsAccount.getBalance());//1112.99+100-1=1211.99 } }
Homework09.java
package com.hspedu.homework; public class Homework09 { public static void main(String[] args) { LabelPoint haha = new LabelPoint("haha", 232, 323.3); } } class Point{ private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } } class LabelPoint extends Point{ private String label; public LabelPoint(String label,double x, double y) { super(x, y); this.label = label; } }
Homework10.java
package com.hspedu.homework.homework10; public class Homework10 { public static void main(String[] args) { Doctor doctor1 = new Doctor("jack", 20, "牙科医生", '男', 20000); Doctor doctor2 = new Doctor("jack", 22, "牙科医生", '男', 20000); System.out.println(doctor1.equals(doctor2)); } }
Doctor.java
package com.hspedu.homework.homework10; public class Doctor { private String name; private int age; private String job; private char gender; private double sal; public Doctor(String name, int age, String job, char gender, double sal) { this.name = name; this.age = age; this.job = job; this.gender = gender; this.sal = sal; } 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 String getJob() { return job; } public void setJob(String job) { this.job = job; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public boolean equals(Object obj){ //判断两个比较对象是否相同 if(this == obj){ return true; } //判断object是否是Doctor类型或者是其子类 if(!(obj instanceof Doctor)){ return false; } //向下转型,因为obj的运行类型是Doctor或者其子类型 Doctor doctor = (Doctor)obj; return this.name.equals(doctor.name) && this.age == doctor.age && this.gender == doctor.gender && this.job.equals(doctor.job) && this.sal == doctor.sal; } }
Person.java
package com.hspedu.homework.homework13; public class Person { private String name; private int age; private char sex; public Person(String name, int age, char sex) { this.name = name; this.age = age; this.sex = sex; } 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 char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public String play(){ return name + "爱玩"; } public String basic() { return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + '}'; } }
Teacher.java
package com.hspedu.homework.homework13; import java.sql.SQLOutput; public class Teacher extends Person{ private int work_age; public Teacher(String name, int age, char sex, int work_age) { super(name, age, sex); this.work_age = work_age; } public int getWork_age() { return work_age; } public void setWork_age(int work_age) { this.work_age = work_age; } public void teach(){ System.out.println(getName() + "承诺,我会认真教学。"); } @Override public String play() { return super.play() + "象棋"; } public void printInfo() { System.out.println("老师的信息如下:"); System.out.println(super.basic()); System.out.println("工龄:" + work_age); teach(); System.out.println(play()); } @Override public String toString() { return "Teacher{" + "work_age=" + work_age + '}' + super.toString(); } }
Student.java
package com.hspedu.homework.homework13; public class Student extends Person{ private String stu_id; public Student(String name, int age, char sex, String stu_id) { super(name, age, sex); this.stu_id = stu_id; } public void study(){ System.out.println(getName() + "承诺,我会好好学习。"); } public String getStu_id() { return stu_id; } public void setStu_id(String stu_id) { this.stu_id = stu_id; } @Override public String play() { return super.play() + "足球"; } public void printInfo() { System.out.println("学生的信息如下:"); System.out.println(super.basic()); System.out.println("学号:" + getStu_id()); study(); System.out.println(play()); } @Override public String toString() { return "Student{" + "stu_id='" + stu_id + '\'' + '}' + super.toString(); } }
Homework13.java
package com.hspedu.homework.homework13; public class Homework13 { public static void main(String[] args) { // Teacher teacher = new Teacher("张飞",30,'男',5); // teacher.printInfo(); // Student student = new Student("小明", 15, '男', "00023102"); // System.out.println("----------"); // student.printInfo(); //定义多态数组,里面保存2个学生和2个教师,要求按照年龄从高到低排序 Person[] persons = new Person[4]; persons[0] = new Student("小明",10,'男',"00023102"); persons[1] = new Student("小钱",20,'女',"00023881"); persons[2] = new Teacher("老孙",36,'男',10); persons[3] = new Teacher("老李",26,'女',18); //创建对象 Homework13 homework13 = new Homework13(); homework13.bubbleSort(persons); //输出排序后的数组 System.out.println("------排序后的数组---------"); for (int i = 0; i < persons.length; i++) { System.out.println(persons[i]); } //遍历数组调用test方法 System.out.println("==============="); for (int i = 0; i < persons.length; i++) { homework13.test(persons[i]); } } //方法排序后的数组 public void bubbleSort(Person[] persons){ Person tmp = null; for(int i = 0;i < persons.length - 1;i++){ for(int j = 0;j < persons.length - 1 - i ;j++){ //判断条件,注意这里的条件可以根据需要变化 if(persons[j].getAge() < persons[j+1].getAge()){ tmp = persons[j]; persons[j] = persons[j+1]; persons[j+1] = tmp; } } } } //定义方法,形参为Person类型,功能:调用学生的study或教师的teach方法 public void test(Person p){ if(p instanceof Student){//p的 运行类型如果是Student ((Student) p).study(); }else if(p instanceof Teacher){ ((Teacher) p).teach(); }else{ System.out.println("do nothing"); } } }
我是A类 hahah我是B类的有参构造 我是C类的有参构造 我是c类的无参构造
Homework15.java
package com.hspedu.homework; public class Homework15 { public static void main(String[] args) { AAA obj =new BBB(); //向上转型 AAA b1 = obj; System.out.println("obj的运行类型=" + obj.getClass());//BBB obj = new CCC();//向上转型 System.out.println("obj的运行类型=" + obj.getClass());//CCC obj = b1; System.out.println("obj的运行类型=" + obj.getClass());//BBB } } class AAA{ } class BBB extends AAA{ } class CCC extends BBB { }