数据库运维
记录DBA学习成长历程

Java面向对象编程(基础)


Object01.java

public class Object01 {

	public static void main(String[] args) {

		//一.单独变量解决问题,不利于数据管理
		//第1只猫信息
		// String cat1Name = "小白";
		// int cat1Age = 3;
		// String cat1Color = "白色";

		// //第2只猫信息
		// String cat2Name = "小花";
		// int cat2Age = 100;
		// String cat2Color = "花色";

		// //二.数组
		// //1.数据类型体现不出来
		// //2.只能通过下标获取信息,造成变量名字和内容的对应关系不明确
		// //3.不能体现猫的行为
		// String[] cat1 = {"小白","3","白色"};
		// String[] cat1 = {"小花","3","花色"};
		
		//三.使用面向对象得到方式来解决养猫问题
		//使用OOP面向对象解决
		//实例化一只猫
		//1.new Cat() 创建一只猫
		//2.Cat cat1 = new Cat();把创建的猫赋值给cat1
		//3.cat1就是一个对象
		Cat cat1 = new Cat();
		cat1.name = "小白";
		cat1.age = 3;
		cat1.color = "白色";
		cat1.weight = 10;
		//创建第二只猫,并赋值给cat2
		//cat2也是一个对象
		Cat cat2 = new Cat();
		cat2.name = "小花";
		cat2.age = 100;
		cat2.color = "花色";
		cat2.weight = 20;

		//怎么访问对象的属性
		System.out.println("第一只猫的信息" + cat1.name
		 + " " + cat1.age + " " + cat1.color + " " + cat1.weight);

		System.out.println("第一只猫的信息" + cat2.name
		 + " " + cat2.age + " " + cat2.color + " " + cat2.weight);

	}
}


//定义一个猫类 Cat ->自定义数据类型
class Cat {
	//属性(成员变量)
	String name;
	int age;
	String color;
	double weight;
	//行为
}


Object02.java

public class Object02 {

	public static void main(String[] args) {

	}
}

class Car {
	String name;//属性,成员变量,字段field
	double price;
	String color;
	String[] master;//属性可以是基本数据类型,也可以是引用类型(数组,对象)
}


PropertiesDetail.java

public class PropertiesDetail {

	public static void main(String[] args) {

		//创建Person对象
		//p1是对象名(对象引用)
		//new Person() 创建的对象空间(数据)才是真正的对象
		Person p1 = new Person();
		//对象的属性默认值,遵守数组规则:
		System.out.println("\n当前这个人的信息");
		System.out.println("age=" + p1.age + " name=" + p1.name
		 + " sal=" + p1.sal + " isPass=" + p1.isPass);
	}
}

class Person {
	//四个属性
	int age;
	String name;
	double sal;
	boolean isPass;
}
//当前这个人的信息:age=0 name=null sal=0.0 isPass=false


Object03.java

public class Object03 {

	public static void main(String[] args) {

		Person p1 = new Person();
		p1.name = "小明";
		p1.age = 10;
		Person p2 = p1;//把p1赋给p2,让p2指向p1
		System.out.println(p2.age);
	}
}

class Person {
	String name;
	int age;
}
//结果为
//10


Method01.java

import java.util.Scanner;
public class Method01 {

	public static void main(String[] args) {
		//方法使用
		//1.方法写好不调用,不会输出
		//2.先创建对象,然后调用方法即可
		//
		Person p1 = new Person();
		p1.speak();//调用speak方法
		p1.cal01();//调用cal01方法
		p1.cal02(5);//调用cal02方法,同时给n=5
		p1.cal02(10);//调用cal02方法,同时给n=10
		//调用getSum方法,同时num1=10,num2=20
		//把方法getSum返回的值,赋给变量returnSum
		int returnSum = p1.getSum(80,20);
		System.out.println("getSum方法返回的值=" + returnSum);
	}
}

class Person {
	
	String name;
	int age;
	//方法(成员方法)
	//添加speak成员方法,输出“我是一个好人”
	//1.public 表示方法是公开的
	//2.void 表示方法没有返回值
	//3.speak() speak是方法名,()形参列表
	//4.{}表示方法体,要执行的代码
	//5.System.out.println("我是一个好人");表示方法就是要输出一句话
	public void speak() {
		System.out.println("我是一个好人");
	}

	//添加cal01成员方法,可以计算从1+..+1000的结果
	public void cal01() {
		//循环完成
		int sum = 0;
		for(int i = 1;i <= 1000;i++){
			sum +=i;
		}
		System.out.println("cal01的sum=" + sum);
	}

	//添加cal02成员方法,该方法可以接收一个数n,计算1+..+n的结果
	//1.(int n)形参列表,表示当前有一个形参n,可以接收用户的输入
	public void cal02(int n) {

		// Scanner myScanner = new Scanner(System.in);
		// System.out.println("计算1+..+n,请输入n等于?");
		// int n = myScanner.nextInt();
		int sum = 0;
		for(int i = 1;i <= n;i++){
			sum += i;
		}
		System.out.println("cal02的sum=" + sum);
	}

	//添加getSum成员方法,可以计算两个数的和
	//1.public 表示方法是公开的
	//2.int 表示方法执行后,返回一个int值
	//3.getSum 方法名
	//4.(int num1,int num2)形参列表,2个形参,可以接收用户传入的两个数
	//5.return sum;表示把sum的值返回
	public int getSum(int num1, int num2) {
		int sum = num1 + num2;
		return sum;
	}
}


Method02.java

public class Method02 {

	public static void main(String[] args) {

		//请遍历一个数组,输出数组的各个元素值
		int[][] map = {{0,0,0},{1,1,1},{1,1,3}};

		//使用方法完成输出,创建MyTools对象
		MyTools tool = new MyTools();

		//遍历map数组
		//传统的解决方法就是直接遍历
		// for(int i = 0;i < map.length;i++){
		// 	for(int j =0;j < map[i].length;j++){
		// 		System.out.print(map[i][j] + " ");
		// 	}
		// 	System.out.println();
		// }
		// 使用方法 
		tool.printArr(map);
		//要求再次遍历map数组
		tool.printArr(map);
	}
}

//把输出的功能,写到一个类的方法中,然后调用该方法即可
class MyTools {
	//方法接收一个二维数组
	public void printArr(int[][] map) {
		System.out.println("========");
		//对传入的map数组进行遍历输出
		for(int i = 0;i < map.length;i++){
			for(int j =0;j < map[i].length;j++){
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
	} 
}


MethodDetail.java

public class MethodDetail {

	public static void main(String[] args) {

		AA a = new AA();
		int[] res = a.getSumAndSub(1,4);
		System.out.println("和=" + res[0]);
		System.out.println("差=" + res[1]);
	}
}

		//细节:调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
		// byte b1 = 1;
		// byte b2 = 2;
		// a.getSumAndSub(b1,b2);//byte -> int
		// a.getSumAndSub(1.1,1.8);//double -> int(x)

		//细节:实参和形参的类型要一致或兼容、个数、顺序必须一致
		
		// a.getSumAndSub(100);//x 个数不一致
		//a.f3("tom",10);//ok
		// a.f3(100,"jack");//实际参数和形式参数顺序不对

class AA {

	public void f3(String str,int n){

	}

	// //方法不能嵌套定义
	//  public void f4(){
	// 	public void f5(){

	// 	}
	// }


	//1.一个方法最多有一个返回值[思考如何返回多个结果,返回数组]
	public int[] getSumAndSub(int n1,int n2) {

		int[] resArr = new int[2];//创建一个数组
		resArr[0] = n1 + n2;
		resArr[1] = n1 - n2;
		return resArr;
	}
	// 2.返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
	//看getSumAndSub
	//3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值;
	//而且要求返回值类型必须和return的值类型一致或兼容
	public double f1() {
		double d1 = 1.1 * 3;
		return d1;
		// return 1.1;
		//int n = 100;
		//return n;//int -> double,正确 
	}
	//4.如果方法是void,则方法体中可以没有return语句,或者只写return;
	public void f2() {
		System.out.println("hello");
	}
}  


MethodDetail02.java

public class MethodDetail02 {

	public static void main(String[] args) {

		A a = new A();
		a.sayOk();
		a.m1();
	} 
}

class A {

	//1.同一个类中的方法调用:直接调用即可
	public void print(int n) {
		System.out.println("print()方法被调用 n=" + n);
	}
	public void sayOk() {//sayOk调用 print(直接调用即可)
		print(10);
		System.out.println("继续执行sayOk()");
	}

	//2.跨类中的方法A类调用B类方法:需要通过对象名调用

	public void m1() {
		//先创建B对象,然后再调用方法即可
		System.out.println("============");
		System.out.println("m1()方法被调用");
		B b = new B();
		b.hi();
		System.out.println("m1()方法继续执行");
	}
}


class B {

	public void hi() {
		System.out.println("B类中的hi()被执行");
	}
}


MethodExercise01.java

public class MethodExercise01 {
	public static void main(String[] args) {

		AA a = new AA();
		if(a.isOdd(9)){
			System.out.println("是奇数");
		}else{
			System.out.println("是偶数");
		}
		a.print(4,6,'#');
	}
}
class AA {
	//1.编写类AA,有一个方法:
	//判断一个数是奇数odd还是偶数,返回boolean
	//思路:
	//1.方法的返回类型 boolean
	//2.方法的名称 isOdd
	//3.方法的形参 (int num)
	//4.方法体,判断
	public boolean isOdd(int num) {
		// ============
		// if(num % 2 != 0){
		// 	return true;
		// }else{
		// 	return false;
		// }
		// ============
		// return num % 2 != 0 ? true ; false;
		// ============
		return num % 2 != 0;
	}
	//2.根据行、列、字符打印对应行数和列数的字符
	//比如:行:4,列:4,字符#,则打印相应的效果
	//思路:
	//1.方法的返回类型 void
	//2.方法的名称 print
	//3.方法的形参 (int row,int col,char c)
	//4.方法体,循环
	public void print(int row,int col,char c) {

		for(int i = 1;i <= row;i++){
			for(int j = 1;j <= col;j++){
				System.out.print(c);
			}
			System.out.println();
		}
	}
}


MethodParameter01.java

public class MethodParameter01 {

	public static void main(String[] args) {

		//创建AA对象名字为obj
		AA obj = new AA();
		int a = 10;
		int b = 20;
		obj.swap(a,b);//调用swap方法
		System.out.println("\nmain方法里\na=" + a + "\tb=" + b);
		//a=10 b=20
	}
}

class AA {
	public void swap(int a,int b) {
		System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);
		//a=10 b=20
		//完成了a 和 b的交换
		int tmp = a;
		a = b;
		b = tmp;
		System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);
		//a=20 b=10
	}
}


MethodParameter02.java

public class MethodParameter02 {

	public static void main(String[] args) {

		B b = new B();
		int[] arr = {1,2,3};
		b.test100(arr);//调用方法
		//遍历数组
		System.out.println("main的arr数组");
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();//200 2 3
		System.out.println("================");

		Person p = new Person();
		p.name = "jack";
		p.age = 10;
		b.test200(p);
                // 测试题如果test200执行的是p.age = 10000;
		// System.out.println("main的p.age =" + p.age);//10000
		// System.out.println("================");
		// 测试题如果test200执行的是p=null
		// System.out.println("main的p.age =" + p.age);//10
		// 测试题如果test200执行的是p = new person()...结果是
		System.out.println("main的p.age =" + p.age);//10

	}
}

class Person {
	String name;
	int age;
}

class B {
	
	public void test200(Person p) {
		// p.age = 10000;//修改对象属性
		// p = null;
		p = new Person();
		p.name = "tom";
		p.age = 99;
	}

	//B类中 编写一个方法test100
	//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
	public void test100(int[] arr){
		arr[0] = 200;
		//遍历数据
		System.out.println("test100 的arr数组");
		for(int i = 0 ;i < arr.length;i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();//200 2 3
	}

}


MethodExercise02.java

public class MethodExercise02 {

	public static void main(String[] args) {

		Person p = new Person();
		p.name = "milan";
		p.age = 100;

		MyTools tools = new MyTools();
		Person p2 = tools.copyPerson(p);

		// p和p2是Person对象,但是是两个独立的对象,属性相同
		System.out.println("p的属性 age=" + p.age + " name=" + p.name);
		System.out.println("p2的属性 age=" + p2.age + " name=" + p2.name);
		//通过同对象比较看看,是否为同一个对象
		System.out.println(p == p2);
	}
}

class Person {

	String name;
	int age;
}

class MyTools {

	//编写一个方法copyPerson,可以复制一个Person对象,
	//返回复制的对象。克隆对象,注意要求得到新对象和原来
	//的对象是两个独立的对象,只是他们的属性相同
	//
	//编写方法的思路
	//1.方法的返回类型 Person
	//2.方法的对象copyPerson
	//3.方法的形参(Person p)
	//4.方法体,创建一个新对象,并复制属性返回即可
	//
	public Person copyPerson(Person p) {
		//创建一个新的对象
		Person p2 = new Person();
		p2.name = p.name;//把原来对象的名字赋值给p2.age
		p2.age = p.age;//把原来对象的年龄赋值给p2.age
		return p2;
	}
}


recursion01.java

public class recursion01 {

	public static void main(String[] args) {

		T t1 = new T();
		t1.test(4);//结果 n=2 n=3 n=4
		int res = t1.factorial(5);
		System.out.println("res=" + res);//结果为120

	}
}

class T {

	public void test(int n) {
		if(n > 2){
			test(n-1);
		}//else{
		//	System.out.println("n=" + n);
		//}//如果有else,则结果n=2,不输出后面的
		System.out.println("n=" + n);
	}

	public int factorial(int n) {
		if(n == 1) {
			return 1;
		}else{
			return factorial(n-1) * n;
		}
	}
}


RecursionExercise01.java

public class RecursionExercise01 {

	public static void main(String[] args) {

		T t1 = new T();
		int n = 8;
		int res = t1.fibonacci(n);
		if(res != -1){
			System.out.println("当n="+ n +"对应的斐波那契数=" + res);
		}
		System.out.println("=========");
		int day = 1;
		int peachNum = t1.peach(day);
		if(peachNum != -1){
			System.out.println("第"+ day +"天有" + peachNum + "个桃子");
		}		
	}
}

class T {
		/*
		请使用递归方式求出斐波那契数1,1,2,3,5,8,13...
		给你一个整数n,求出它的值是多少
		思路分析
		1.当n=1,斐波那契数是1
		2.当n=2,斐波那契数是1
		3.当n >= 3,斐波那契数是前两个数的和
		4.这就是一个递归的思路
		 */	
		public int fibonacci(int n){
			if(n >= 1){
				if(n == 1 || n == 2){
					return 1;
				}else{
					return fibonacci(n-1) + fibonacci(n-2);
				}				
			}else{
				System.out.println("输入的数需要n>=1的整数");
				return -1;
			}
		}

		/*
		猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!
		以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时
		(还没吃),发现只有一个桃子了,问:最初共多少个桃子?
		思路分析(逆推)
		1.第10天,还剩一个桃子
		2.第9天,有(day10 + 1) * 2 = 4
		3.第8天,有(day9 + 1) * 2 = 10
		4.规律:前一天的桃子=(后一天的桃子+1) * 2
		 */
		public int peach(int days) {
			if(days == 10){
				return 1;
			}else if(days >= 1 && days <= 9){
				return (peach(days + 1) + 1) * 2;
			}else{
				System.out.println("天数在1~10天,输入的不对");
				return -1;
			}
		}
}


MiGong.java

public class MiGong {

	public static void main(String[] args) {

		//思路
		//1.先创建一个迷宫,用二维数组表示int[][] map = new int[8][7];
		//2.先规定map数组的元素值:0表示可以走,1表示障碍物
		int[][] map = new int[8][7];
		//3.将最上面的一行和最下面的一行全部设置为1
		for(int i = 0;i < 7;i++){
			map[0][i] = 1;
			map[7][i] = 1;
		} 
		// 4.将最右面的一列和最左边的一列,全部设置为1
		for(int i = 0;i < 8;i++){
			map[i][0] = 1;
			map[i][6] = 1;
		}
		map[3][1] = 1;
		map[3][2] = 1;
		// ==测试回溯==
		// map[2][2] = 1;
		// 
		//输出当前的地图
		System.out.println("==当前地图==");
		for(int i = 0;i < map.length;i++){
			for(int j = 0;j < map[i].length;j++){
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}

		//使用findWay给老鼠找路
		T t1 = new T();
		t1.findWay(map,1,1);
		System.out.println("\n==使用findWay找路的情况如下==");
		for(int i = 0;i < map.length;i++){
			for(int j = 0;j < map[i].length;j++){
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
		//使用findWay2给老鼠找路
		// T t1 = new T();
		// t1.findWay2(map,1,1);
		// System.out.println("\n==使用findWay2找路的情况如下==");
		// for(int i = 0;i < map.length;i++){
		//  for(int j = 0;j < map[i].length;j++){ 
                //      System.out.print(map[i][j] + " "); 
                // } 
                // System.out.println(); 
                // } 
         } 
} 
class T { 
//使用递归回溯的思想解决老鼠出迷宫 
//1.findway方法是专门找出迷宫的路径 
//2.如果找到,就返回true,否则就返回false 
//3.map就是二维数组,即表示迷宫 
//4.i,j就是老鼠的位置,初始化的位置为map[1][1] 
//5.递归找路,所以规定map数组各个值的含义 
// 0表示可以走,1表示障碍物,2表示可以走,3表示走过但是走不通 
//6.当map[6][5] = 2,就说明找到通路,就可以结束,否则就继续找。
 //7.先确定老鼠找路的策略,下->右->上->左
	public boolean findWay(int[][] map,int i,int j){

		if(map[6][5] == 2){//说明已经找到
			return true;
		}else{
			if(map[i][j] == 0){//当前这个位置0,说明可以走}
				//假定可以走通
				map[i][j] = 2;
				//使用找路策略来确定该位置是否真的可以走通
				//下->右->上->左
				if(findWay(map,i + 1,j)){//先走下
					return true;
				}else if(findWay(map,i,j + 1)){//右
					return true;
				}else if(findWay(map,i-1,j)){//上
					return true;
				}else if(findWay(map,i,j - 1)){//左
					return true;
				}else{
					map[i][j] = 3;
					return false;
				}
			}else{//map[i][j] = 1,2,3
				return false;
			}
		}
	}
	//修改找路策略,看看路径是否变化
	//上右下左
	public boolean findWay2(int[][] map,int i,int j){

		if(map[6][5] == 2){//说明已经找到
			return true;
		}else{
			if(map[i][j] == 0){//当前这个位置0,说明可以走}
				//假定可以走通
				map[i][j] = 2;
				//使用找路策略来确定该位置是否真的可以走通
				//下->右->上->左
				if(findWay2(map,i-1,j)){//先走上
					return true;
				}else if(findWay2(map,i,j + 1)){//右
					return true;
				}else if(findWay2(map,i + 1,j)){//下
					return true;
				}else if(findWay2(map,i,j - 1)){//左
					return true;
				}else{
					map[i][j] = 3;
					return false;
				}
			}else{//map[i][j] = 1,2,3
				return false;
			}
		}
	}
}

// ==当前地图==
// 1 1 1 1 1 1 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 1 1 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 1 1 1 1 1 1

// ==使用findWay找路的情况如下==
// 1 1 1 1 1 1 1
// 1 2 0 0 0 0 1
// 1 2 2 2 0 0 1
// 1 1 1 2 0 0 1
// 1 0 0 2 0 0 1
// 1 0 0 2 0 0 1
// 1 0 0 2 2 2 1
// 1 1 1 1 1 1 1
// 
// ==回溯==
// 1 1 1 1 1 1 1
// 1 2 2 2 0 0 1
// 1 3 1 2 0 0 1
// 1 1 1 2 0 0 1
// 1 0 0 2 0 0 1
// 1 0 0 2 0 0 1
// 1 0 0 2 2 2 1
// 1 1 1 1 1 1 1
// 
// ==使用findWay2找路的情况如下==
// 1 1 1 1 1 1 1
// 1 2 2 2 2 2 1
// 1 0 0 0 0 2 1
// 1 1 1 0 0 2 1
// 1 0 0 0 0 2 1
// 1 0 0 0 0 2 1
// 1 0 0 0 0 2 1
// 1 1 1 1 1 1 1


HanoiTower.java

public class HanoiTower {

	public static void main(String[] args) {

		Tower tower = new Tower();
		tower.move(5,'A','B','C');
	}
}

class Tower {

	//方法
	//num表示要移动的个数,a,b,c分别表示A塔,B塔,C塔
	public void move(int num,char a,char b,char c) {
		//如果只有一个盘 num=1
		if(num == 1) {
			System.out.println(a + "-" + c);
		}else{
			//如果有多个盘,可以看成两个,最下面和上面的所有盘(num-1)
			//1.先移动上面的所有的盘到b,借助c
			move(num - 1,a,c,b);
			//2.把最下面的盘移动到c
			System.out.println(a + "-" + c);
			//3.再把b塔的所有盘,移动到c,借助a塔
			move(num - 1,b,a,c);
		}
	}
}


OverLoad01.java

public class OverLoad01 {

	public static void main(String[] args) {
		//重载的介绍
		// System.out.println(100);
		// System.out.println("hello,world");
		// System.out.println('h');
		// System.out.println(1.1);
		// System.out.println(true);
		MyCalculator overload = new MyCalculator();
		System.out.println(overload.calculate(1,2));
		System.out.println(overload.calculate(1,2.1));
		System.out.println(overload.calculate(1.1,2));
	}
}

class MyCalculator {
	//下面四个calculate方法构成了重载
	//两个整数的和
	public int calculate(int n1,int n2){
		System.out.println("calculate(int n1,int n2)被调用");
		return n1 + n2;
	}
	//	没有构成方法重构,方法重复定义
	//  public void calculate(int n1,int n2){
	// 		System.out.println("calculate(int n1,int n2)被调用");
	// 		int res = n1 + n2;
	// }
	//	没有构成方法重构,方法重复定义
	//  public void calculate(int a1,int a2){
	// 		System.out.println("calculate(int a1,int a2)被调用");
	// 		int res = a1 + a2;
	// }
	public double calculate(int n1,double n2){
		System.out.println("calculate(int n1,double n2)被调用");
		return n1 + n2;
	}
	public double calculate(double n1,int n2){
		System.out.println("calculate(double n1,int n2)被调用");
		return n1 + n2;
	}
	public int calculate(int n1,int n2,int n3){
		System.out.println("calculate(int n1,int n2,int n3)被调用");
		return n1 + n2 + n3;
	}
}


OverLoadExercise.java

public class OverLoadExercise {

	public static void main(String[] args){

		Methods m1 = new Methods();
		System.out.println(m1.m(2));
		System.out.println(m1.m(2,3));
		System.out.println(m1.m("hello"));
		System.out.println("=====");
		System.out.println(m1.max(10,22));
		System.out.println(m1.max(11.8,22.5));
		System.out.println(m1.max(11.8,72.5,69.0));
	}
}

class Methods {

	public int m(int n){
		System.out.println("一个int参数");
		return n * n;
	}
	// public void m(int n){
	// 	System.out.println("一个int参数");
	// 	System.out.println("相乘=" + (n1 * n2));
	// }
	public int m(int n1,int n2){
		System.out.println("两个int参数");
		return n1 * n2;
	}
	public String m(String n){
		System.out.println("一个字符串参数");
		return n;
	}
	//==============================================
	public int max(int n1,int n2){
		return n1 > n2 ? n1 : n2;
	}
	public double max(double n1,double n2){
		return n1 > n2 ? n1 : n2;
	}
	public double max(double n1,double n2,double n3){
		// double max1 = n1 > n2 ? n1 : n2;
		// double max2 = max1 > n3 ? max1 : n3;
		// return max2;
		return (n1 > n2 ? n1 : n2) > n3 ? (n1 > n2 ? n1 : n2) : n3;
	}
	//下面方法和上面方法构成重载,优先级是,调用什么就先使用哪个方法。
	public double max(double n1,double n2,int n3){
		// double max1 = n1 > n2 ? n1 : n2;
		// double max2 = max1 > n3 ? max1 : n3;
		// return max2;
		return (n1 > n2 ? n1 : n2) > n3 ? (n1 > n2 ? n1 : n2) : n3;
	}
}


VarParameter01.java

public class VarParameter01 {

	public static  void main(String[] args) {

		HspMthod m = new HspMthod();
		System.out.println(m.sum(21,3,5));
	}
}

class HspMthod {
	//可以计算2个数的和,3个数的和,4,5...的和
	// public int sum(int n1,int n2) {
	// 	return n1 + n2;
	// }
	// public int sum(int n1,int n2,int n3) {
	// 	return n1 + n2 + n3;
	// }
	// public int sum(int n1,int n2,int n3,int n4) {
	// 	return n1 + n2 + n4;
	// }
	//...
	//上面的三个方法名称相同,功能相同,参数个数不同->使用可变参数优化
	//1.int...表示接收的是可变参数,类型是int,可以接受多个int
	//2.使用可变参数时,可以当做数组来使用,即nums可以当做数组
	//3.遍历nums求和
	public int sum(int... nums) {
		System.out.println("接收的参数个数=" + nums.length);
		int res = 0;
		for(int i = 0;i < nums.length;i++){
			res += nums[i];
		}
		return res;
	}
}


VarParameterDetail.java

public class  VarParameterDetail {

	public static void main(String[] args) {

		//细节:可变参数的实参可以是数组
		int[] arr = {1,2,3};
		T t1 = new T();
		t1.f1(arr);
	}
}

class T {

	public void f1(int... nums) {
		System.out.println("长度=" + nums.length);
	}

	//细节:可变参数可以和普通类型的参数一起放在形参列表
	//但必须保证可变参数在最后
	public void f2(String str,double... nums) {

	}
	// 细节:一个形参列表中只能出现一个可变参数
	// public void f3(int... nums1,double... nums2) {

	// }	
}


VarParameterExercise.java

public class VarParameterExercise {

	public static void main(String[] args) {

		HspMethod h1 = new HspMethod();
		System.out.println(h1.showScore("xiaom",90.1,80.2));
		System.out.println(h1.showScore("terry",10,30.3,69,77));
	}
}

class HspMethod {	
	// 分析
	// 1.方法名showScore
	// 2.形参(String,double...)
	// 3.返回String
	public String showScore(String name,double... score){
		double sum = 0;
		for(int i =0;i < score.length;i++){
			sum += score[i];			
		}
		return name + score.length + "门课成绩总分为" + sum;
	}
}


VarScope.java

public class VarScope {

	public static void main(String[] args){

	}
}

class cat{
	//全局变量:也就是属性,作用域为整个类体,Cat类:cry eat等方法使用属性
	//属性在定义时,可以直接赋值
	int age = 10;//指定的值是10

	//全局变量(属性)可以不赋值,直接使用,因为有默认值
	double weight;//有默认值0.0
	public void hi() {
	//局部变量必须赋值后,才能使用,因为没有默认值
		// int num;//错误
		// System.out.println("num=" + num);
	}
	//
	public void cry(){
		//1.局部变量一般是指在成员方法中定义的变量
		//2.n和name就是局部变量
		//3.n和name作用域在cry方法中
		int n = 10;
		String name = "jack";
		System.out.println("在cry中使用属性 age=" + age);
	}
	public void eat() {
		System.out.println("在eat中使用属性 age=" + age);
		// System.out.println("在eat中不可以使用属性cry的变量 name=" + name);
	}
}


VarScopeDetail.java

public class VarScopeDetail {

	public static void main(String[] args) {

		//
		Person p1 = new Person();
		//细节3:属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁
		//局部变量,声明周期较短,伴随着它的代码块的执行而创建
		//伴随着代码块的结束而销毁。即在一次方法调用过程中
		p1.say();
		/*结果:king
			当执行say方法时,say方法的局部变量比如name,会创建,当
			say方法执行完毕后,name局部变量就销毁了,但是属性(全局变量)
			仍然可以使用
		*/
		T t1 = new T();
		t1.test();//jack//第一种跨类访问对象属性的方式

		t1.test2(p1);//jack//第二种跨类访问对象属性的方式
	}
}

class T {
	public void test(){
		//细节4:全局变量/属性:可以被本类使用,或其他类的使用(通过对象调用)
		Person p1 = new Person();
		System.out.println(p1.name);
	}

	public void test2(Person p) {
		System.out.println(p.name);
	}
}


class Person {
	//细节5:属性可以加修饰符(public protected private..)
	//局部变量就不可以
	private int age = 20;

	String name = "jack";

	public void say(){
		//细节1:属性和局部变量可以重名,访问时遵循就近原则
		String name = "king";
		System.out.println("say() name=" + name);
	}
	public void hi(){
		//细节2:在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名.
		String address = "北京";
		// String address = "上海";//错误,重复定义变量
		String name = "hsp";//可以定义

	}
}


Constructor01.java

public class Constructor01 {

	public static void main(String[] args) {
		//当我们new一个对象时,直接通过构造器指定名字和年龄
		Person p1 = new Person("smith",80);
		System.out.println("p1的信息如下");
		System.out.println("p1对象name=" + p1.name);//smith
		System.out.println("p1对象age=" + p1.age);//80
	}
}

//在创建人类的对象时,直接指定这个对象的年龄和姓名
//
class Person {
	String name;
	int age;
	//构造器
	//1.构造器没有返回值,也不能写void
	//2.构造器的名称和类名Person一样
	//3.(String pName,int pAge)是构造器形参列表,规则和成员方法一样
	public Person(String pName,int pAge) {
		System.out.println("构造器被调用~,完成对象属性的初始化");
		name = pName;
		age = pAge;
	}
}


ConstructorDetail.java

public class ConstructorDetail {

	public static void main(String[] args){
		Person p1 = new Person("king",40);//第一个构造器
		Person p2 = new Person("tom");//第二个构造器
		// p1.Person("king",40);错误
		Dog d1 = new Dog();//()调用默认构造器
	}
}

class Person{
	String name;
	int age;
	//第一个构造器
	public Person(String pName,int pAge){
		name = pName;
		age = pAge;
	} 
	//第二个构造器,只指定人名,不需要指定年龄
	public Person(String pName) {
		name = pName;
	}
}

class Dog {
	//6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器
	//又称为(默认构造器),使用javap反编译查看
	/*
		默认构造器
		Dog() {
	
		}

	 */
	//7.一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使
	//用默认的无参构造器了,除非显式的定义一下,即DOg(){}
	public Dog(String dName){
		//...
	}
	Dog() {//显式的定义一下 无参构造器

	}
}


ConstructorExercise.java

public class ConstructorExercise {

	public static void main(String[] args) {

		Person p1 = new Person();//无参构造器
		//下面结果为name=null age=18
		System.out.println("p1的信息 name=" + p1.name + " age= " + p1.age);
		Person p2 = new Person("scott",50);
		System.out.println("p1的信息 name=" + p2.name + " age= " + p2.age);			
	}
}

class Person {
	
	String name;//默认值null
	int age;//默认0

	public Person() {
		age = 18;
	}
	public Person(String pName,int pAge) {
		name = pName;
		age = pAge;
	}
}


This01.java

public class This01 {

	public static void  main(String[] args)  {
		Dog d1 = new Dog("大壮",3);
		d1.info();
	}
}

class Dog{//类
	//属性
	String name;
	int age;
	//构造器
	// public Dog(String dName,int aAge){
	// 	name = dName;
	// 	age = aAge;
	// }
	//如果构造器的形参,能够直接写成属性名,就更好
	//根据变量的作用域原则,构造器name就是局部变量,而不是属性了
	//根据变量的作用域原则,构造器age就是局部变量,而不是属性了
	//引出this关键字解决
	public Dog(String name,int age){
		name = name;
		age = age;
	}	
	//成员方法
	public void info() {//输出属性信息
		System.out.println(name + "\t" + age + "\t");
	}
}



This01.java

public class This01 {

	public static void  main(String[] args)  {
		Dog dog1 = new Dog("大壮",3);
		System.out.println("dog1的hash code=" + dog1.hashCode());
		dog1.info();
		Dog dog2 = new Dog("大黄",3);
		System.out.println("dog2的hash code=" + dog2.hashCode());
		dog2.info();		
	}
}

class Dog{//类
	//属性
	String name;
	int age;
	//构造器
	// public Dog(String dName,int aAge){
	// 	name = dName;
	// 	age = aAge;
	// }
	//如果构造器的形参,能够直接写成属性名,就更好
	//根据变量的作用域原则,构造器name就是局部变量,而不是属性了
	//根据变量的作用域原则,构造器age就是局部变量,而不是属性了
	//引出this关键字解决
	public Dog(String name,int age){
		//this.name就是当前对象得到name
		this.name = name;
		//this.age就是当前对象得到age
		this.age = age;
		System.out.println("this.hashCode=" +this.hashCode());
	}	
	//成员方法
	public void info() {//输出属性信息
		System.out.println(name + "\t" + age + "\t");
	}
}

// 结果:
// this.hashCode=366712642
// dog1的hash code=366712642
// 大壮    3
// this.hashCode=1829164700
// dog2的hash code=1829164700
// 大黄    3


ThisDetail.java

public class ThisDetail {
	public static void main(String[] args) {

		// T t1 = new T();
		// t1.f2();
		T t2 = new T();	
		t2.f3();
	}
}

class T {

	String name = "jack";
	int age = 100;
	//细节4:访问构造器语法:this(参数列表);
	//注意只能在构造器中使用(即只能在构造器中访问另外一个构造器)
	//
	//访问构造器语法:有this(参数列表);必须放在第一条语句
	public T(){
		//这里访问T(String name,int age)构造器
		this("jack",100);
		System.out.println("T()构造器");
	}
	public T(String name,int age){
		System.out.println("T(String name,int age)构造器");
	}

	//细节1:this关键字可以用来访问本类的属性、方法、构造器
	public void f3() {
		//传统方式,就近原则,局部变量会影响
		String name = "Smith";
		System.out.println("name=" + name + " age = " + age);//smith 100
		// 也可以通过this来访问属性
		System.out.println("name=" + this.name + " age = " + this.age);//jack 100


	}
	//细节3:访问成员方法的语法:this.方法名(参数列表);
	public void f1(){
		System.out.println("f1()方法..");
	}
	public void f2(){
		System.out.println("f2()方法..");
		//调用本类的f1
		//第一种方式
		f1();
		//第二种方式
		this.f1();
	}

}


TestPerson.java

public class TestPerson {

	public static void main(String[] args) {
		Person p1 = new Person("mary",20);
		Person p2 = new Person("mary",20);

		System.out.println("p1和p2比较的结果=" + p1.compareTo(p2));
	}
}

class Person{
	String name;
	int age;
	//构造器
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	//compareTo比较方法
	public boolean compareTo(Person p){
		// if(this.name.equals(p.name) && this.age == p.age){
		// 	return true;
		// }else{
		// 	return false;
		// }
		return this.name.equals(p.name) && this.age == p.age;
	}

}


Homework01.java

public class Homework01 {

	public static void main(String[] args) {
		A01 a1 = new A01();
		double[] arr = {1.3,23.3,342.12,642.2,323};
		Double res = a1.max(arr);
		if(res != null){
			System.out.println("arr的最大值=" + res);			
		}else{
			System.out.println("arr输入有误,数组不能为null,或者{}");
		}
	}
}
// 思路分析
// 1.类名A01
// 2.方法名max
// 3.形参(double[])
// 4.返回值double
// 先完成正常业务,然后再考虑代码健壮性
class A01 {
	//double改为Double包装类,不然不能return null
	public Double max(double[] arr){
		//先判断arr是否为空,然后再判断length是否>0
		if(arr != null && arr.length > 0){
			//考虑代码健壮性,保证arr至少有一个元素
			double max = arr[0];//假定第一个元素就是最大值
			for(int i =1;i < arr.length;i++){
				if(max < arr[i]){
					max = arr[i];
				}
			}
			return max;	//double值
		}else{
			return null;
		}
	}
}
Homework02.java
public class Homework02 {
	public static void main(String[] args){

		String[] strs = {"jack","tom","mary"};
		A02 a02 = new A02();
		int index = a02.find("tom",strs);
		System.out.println("查找的index=" + index);
	}
}
//编写类A02,定义方法find,实现查找某字符串是否在字符串数组中,
//并返回索引,如果找不到,返回-1
//分析
//1.类名 A02
//2.方法名 find
//3.返回值 int
//4.形参(String,String[])
//5.补充代码对的健壮性
class A02 {

	public int find(String findstr,String[] strs){
		//直接遍历字符串数组,如果找到,则返回索引
		for(int i = 0;i < strs.length;i++){
			if(findstr.equals(strs[i])){
				return i;
			}
		}
		//如果找不到,返回-1
		return -1;
	}
}
Homework03.java
public class Homework03 {

	public static void main(String[] args){

		Book b1 = new Book("红楼梦",20);
		b1.info();
		b1.updatePrice();
		b1.info();
	}
}
//编写类Book,定义方法updatePrice,实现更改某本书的价格,具体:
//如果价格>150,则更改为150,如果价格>100,更改为100,否则不变
//分析
//1.类名 Book
//2.属性price,name
//3.方法名 updatePrice
//4.返回值 void
//5.形参()
//6.提供一个构造器
class Book {

	double price;
	String name;

	public Book(String name,double price){
		this.name = name;
		this.price = price;
	}
	public void updatePrice() {
		//如果方法中没有price局部变量,this.price等价price
		if(price > 150){
			price = 120;
		}else if(price > 100){
			price = 100;
		}
	}
	//显示书籍情况
	public void info(){
		System.out.println("书名" + this.name + "价格=" + this.price);
	}
}


Homework04.java

public class Homework04 {

	public static void main(String[] args) {
		int[] oldArr = {10,23,23,222,44,2};
		A03 a03 = new A03();
		int[] newArr = a03.copyArr(oldArr); 
		//遍历newArr,验证
		System.out.println("==返回的新数组==");
		for(int i = 0;i < newArr.length;i++){
			System.out.print(newArr[i] + " ");
		}
	}
}
//编写类A03,实现数组的复制功能copyArr,输入旧数组,
//返回一个新数组,元素和旧数组一样
//分析
//1.类名 A03
//2.方法名copyArr
//3.返回值int
//5.形参(int[] oldArr)
class A03{

	public int[] copyArr(int[] oldArr){
		//在堆中,创建一个长度为oldArr.length数组
		int[] newArr = new int[oldArr.length];
		//遍历oldArr,将元素拷贝到newArr
		for(int i = 0;i < oldArr.length;i++){
			newArr[i] = oldArr[i];
		}
		return newArr;
	}
}
Homework05.java
public class Homework05 {

	public static void main(String[] args) {

		Circle c1 = new Circle(3);
		System.out.println("周长等于" + c1.len());
		System.out.println("面积等于" + c1.area());
	}
}
//定义一个圆类Circle,定义属性:半径,提供显示圆周长,圆面积功能的方法
class Circle {
	double radius;

	public Circle(double radius) {
		this.radius = radius;
	}

	public double len(){//周长
		return radius * 2 * Math.PI;

	}
	public double area(){//面积
		return radius * radius * Math.PI;
	}
}
Homework06.java
public class Homework06{

	public static void main(String[] args){

		Cale cale = new Cale(2,1);
		System.out.println("和=" + cale.sum());
		System.out.println("差=" + cale.minus());
		System.out.println("乘=" + cale.mul());
		Double divRes = cale.div();
		if(divRes != null){
			System.out.println("除=" + divRes);
		}
		
	}
}

/*
创建一个Cale计算类,在其中定义2个变量表示两个操作数,
定义四个方法实现求和、差、乘、商(要求除数为0的话,要提示)
并创建两个对象,分别测试
 */

class Cale {
	double num1;
	double num2;
	public Cale(double num1,double num2){
		this.num1 = num1;
		this.num2 = num2;
	}
	//和
	public double sum(){
		return num1 +num2;
	}
	//差
	public double minus(){
		return num1 -num2;
	}
	//乘
	public double mul(){
		return num1 * num2;
	}
	//除
	public Double div(){
		if(num2 != 0){
			return num1 / num2;
		}else{
			System.out.println("num2 不能为0");
			return null;
		}
	}
}


Homework07.java

public class Homework07 {
	public static void main(String[] args){

		Dog d1 = new Dog("lucy","blue",23);
		d1.show();
	}
}

class Dog {
	String name;
	String color;
	int age;

	public Dog(String name,String color,int age){
		this.name = name;
		this.color = color;
		this.age = age;
	}

	public void show() {
		System.out.println(name);
		System.out.println(color);
		System.out.println(age);
	}
}
Test.java
public class Test { //公有类
	int count = 9;//属性

	public void count1(){//Test类的成员方法
		count = 10;
		System.out.println("count1=" + count);
	}

	public void count2() {//Test类的成员方法
		System.out.println("count1=" + count++);
	}

	//这是Test类的main方法,任何一个类,都可由main
	public static void main(String args[]) {

		// 1.new Test()是匿名对象,在堆里,只能用一次
		// 2.new Test().count1();创建好匿名对象后,就调用了count1()
		new Test().count1();//10
		Test t1 = new Test();
		t1.count2();//9
		t1.count2();//10
	}
}


Homework09.java

public class Homework09 {

	public static void main(String[] args) {

		Music music = new Music("笑傲江湖",300);
		music.play();
		System.out.println(music.getInfo());
	}
}
/*
定义Music类,里面有音乐名name,音乐时长times属性,并有播放play功能
和返回本身属性信息的功能方法getInfo
 */
class Music{
	String name;
	int times;
	public Music(String name,int times){
		this.name = name;
		this.times = times;
	}
	//播放功能
	public void play() {
		System.out.println("音乐" + name + "正在播放中...时长" + times);

	}
	//返回本身属性的方法
	public String getInfo(){
		return "音乐" + name + "播放时长为" + times;
	}
}
Homework10.java
public class Homework10 {

	public static void main(String[] args){

	}
}

class Demo{
	int i = 100;
	public void m(){
		int j = i++;
		System.out.println("i=" + i);
		System.out.println("j=" + j);
	}
}
class Test{
	public static void main(String[] args){
		Demo d1 = new Demo();
		Demo d2 = d1;
		d2.m();//i = 101  j = 100
		System.out.println(d1.i);//101
		System.out.println(d2.i);//101
	}
}


Homework12.java

public class Homework12 {

	public static void main(String[] args) {

	}
}
/*
创建一个Employee类,属性有(名字,性别,年龄,职位,薪水),
提供3个构造方法,可以初始化
1.(名字,性别,年龄,职位,薪水)
2.(名字,性别,年龄)
3.(职位,薪水),要充分复用构造器
 */
class Employee {
	String name;
	char gender;
	int age;
	String job;
	double sal;

	//因为要求可以复用构造器,先写属性少的构造器
	//职位,薪水
	public Employee(String job,double sal){
		this.job = job;
		this.sal = sal;
	}
	//名字.性别,年龄
	public Employee(String name,char gender,int age){
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	//名字.性别,年龄,职位,薪水
	public Employee(String name,char gender,int age,String job,double sal){
		this(name,gender,age);
		this.job = job;
		this.sal = sal;		
	}
}


Homework13.java

public  class Homework13 {
	public static void main(String[] args) {
		Circle c = new Circle();
		PassObject op = new PassObject();
		op.printAreas(c,5);
	}
}

class Circle {//类

	double radius;//半径

	// public Circle(){

	// }

	// public Circle(radius){
	// 	this.radius = radius;
	// }

	public double findArea(){
		return radius * radius * Math.PI;		
	}

	//添加方法setRadius,修改对象的半径值
	public void setRadius(double radius){
		this.radius = radius;
	}

}

class PassObject {
	public void printAreas(Circle c,int  times){
		System.out.println("radius\tarea");
		for(int i = 1;i <= times;i++){
			c.setRadius(i);//修改对象的半径值
			System.out.println((double)i + "\t" +c.findArea());
		}
	}
}


MoraGame.java

import java.util.Random;
import java.util.Scanner;
public class MoraGame {

	public static void main(String[] args) {
		//创建一个玩家对象
		Tom t = new Tom();
		//用来记录输赢的次数
		int isWinCount = 0;
		
		//创建一个二维数组,用来接收局数,To出拳情况以及电脑出拳情况
		int[][] arr1 = new int[3][3];
		int j = 0;

		//创建一个一维数组,用来接收输赢情况
		String[] arr2 = new String[3];

		Scanner scanner = new Scanner(System.in);
		for(int i = 0;i < 3;i++){//比赛 3次
			//获取玩家出的拳
			System.out.println("请输入你要出的拳(0拳头,1剪刀,2布)");
			int num = scanner.nextInt();
			t.setTomGuessNum(num);
			int tomGuess = t.getTomGuessNum();
			arr1[i][j + 1] = tomGuess;

			//获取电脑的出拳
			int comGuess = t.computerNum();
			arr1[i][j + 2] = tomGuess;

			//将玩家猜的拳与电脑做比较
			String isWin = t.vsComputer();
			arr2[i] = isWin;
			arr1[i][j] = t.count;

			//对每一局情况输出
			System.out.println("===============");
			System.out.println("局数\t玩家的出拳\t电脑的出拳\t输赢情况");
			System.out.println(t.count +"\t" + tomGuess + "\t\t" + comGuess + "\t\t");
			System.out.println("===============");
			System.out.println("\n\n");
			isWinCount = t.winCount(isWin);
		}
		//对游戏的最终结果进行输出
		System.out.println("局数\t玩家的出拳\t电脑的出拳\t\t输赢情况");
		for(int a = 0;a < arr1.length;a++){
			for(int b = 0;b < arr1[a].length;b++){ 
                            System.out.print(arr1[a][b] + "\t\t\t");
                        } 
                        System.out.print(arr2[a]); 
                        System.out.println(); 
                } 
                System.out.println("你赢了" + isWinCount + "次"); 
           } 
 } 
//有个人Tom设计他的成员变量.成员方法,可以电脑猜拳 
//电脑每次都会随机生成0,1,2 
//0表示石头,1表示剪刀,2表示布 
//并要可以显示Tom的输赢次数(清单) 
class Tom { //核心代码 
     //玩家出拳的类型 
     int tomGuessNum;//0,1,2 
     //电脑出拳的类型 
     int comGuessNum;//0,1,2 
     //玩家赢得次数 
     int winCountNum; 
     //比赛的次数 
     int count = 1;//一共比赛3次 

     public void showInfo() { 
     } 

     //电脑随机生成猜拳数字的方法 
     public int computerNum() { 
          Random r = new Random(); 
          comGuessNum = r.nextInt(3);//返回0-2的随机数 
          return comGuessNum; 
     } 
     //设置玩家猜拳的数字的方法 
        public void setTomGuessNum(int tomGuessNum) { 
               if(tomGuessNum > 2 || tomGuessNum < 0){
			//抛出一个异常
			throw new IllegalArgumentException("数字输入 有误");
		}
		this.tomGuessNum = tomGuessNum;
	}

	public int getTomGuessNum() {
		return tomGuessNum;
	}

	//比较猜拳的结果
	public String vsComputer() {
		if(tomGuessNum == 0 && comGuessNum == 1){
			return "你赢了";
		}else if (tomGuessNum == 1 && comGuessNum ==2){
			return "你赢了";
		}else if(tomGuessNum ==2 && comGuessNum == 0){
			return "你赢了";
		}else if(tomGuessNum == comGuessNum){
			return "平手";
		}else{
			return "你输了";
		}
	}
 //记录玩家赢得次数
    public int winCount(String s) {
        count++;
        if(s.equals("你赢了")) {
          winCountNum++;
        }
        return winCountNum;
        }
    }
赞(3)
MySQL学习笔记 » Java面向对象编程(基础)