一、面向对象
- 封装
- 继承
- 多态
- 类是对一类事物的描述,是抽象的、概念上的定义。重点就是类的设计(比如我们人类,是有哪些特征等等)
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
类就好比如是:人类
对象:实实在在的我
如下:创建PersonTest类,其中有属性有方法:
package com.object; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 12:42 */ public class Person { public static void main(String[] args) { PersonTest p1 = new PersonTest(); p1.name = "ppl"; p1.age = 18; p1.isMale = true; p1.eat(); p1.sleep(); p1.talk(); } } class PersonTest { // 属性 String name; int age; boolean isMale; // 方法 public void eat() { System.out.println("人吃什么?答:人间烟火"); } public void sleep() { System.out.println("人需要睡觉休息,专家建议每天睡眠至少8小时"); } public void talk() { System.out.println("人可以说话,但我说的是中文"); } }
3、类属性(成员变量)与局部变量
也意味着作用域不一样。
特别需要注意:局部变量在调用前是没有初始值,所以一定要在调用前初始化值,除了形参以调用时传入;
package com.object; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 12:15 */ public class ObjectTest { public static void main(String[] args) { User user = new User(); user.name = "泡泡龙"; user.age = 18; user.eat("米饭"); } } class User { // 类的变量 String name; int age; public void eat(String food) { System.out.println("姓名:" + name + " 吃的是什么? 答案:" + food); System.out.println("年龄只有:" + age); String IsMale = "true"; // 方法的变量(局部变量) System.out.println("我是局部变量:" + IsMale); } }
4、类的方法声明
- pubilc String xx:定义了返回值为String类型,就一定要有String返回值;
- pubilc String xx(String xxx){}:形参xxx,可以多个形参,逗号分开,调用该方法时传入;
- 方法中也可以调用类的属性;
- return既是结束这个方法执行,并返回值;(结束后面不可再执行,因已结束方法);
- 在类中的方法A它可以调用方法B等等,特殊的递归,方法A调用方法A;(慎用递归)
- 方法中,不能再定义方法;(Python里面是可以的,常用装饰器便如此)
package com.object; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 16:20 */ public class ClassM { public static void main(String[] args) { ClassTest m = new ClassTest(); m.eat("米饭"); System.out.println(m.name); System.out.println(m.getName()); System.out.println(m.returnName()); // 引用类型 ClassTest[] st = new ClassTest[3]; st[0] = new ClassTest(); System.out.println("111" + st[0].name); } } class ClassTest { // 类属性 String name = "泡泡龙"; // 形参:food,可以多个逗号分开 public void eat(String food) { System.out.println("吃的是:" + food); } // 有返回值:return,需指定返回的类型,比如:String // 但是命名指定了返回值的类型,就一定要有:return返回值 public String getName() { eat("面条"); // 方法内部调用方法 return name; } // 判断语句,需要在各个分支都要return public String returnName() { if ("泡泡".contains(name)) { return name; } else if ("泡泡龙".contains(name)) { return "1"; } else { return "-1"; } } }
输出:
吃的是:米饭
泡泡龙
吃的是:面条
泡泡龙
1
111泡泡龙
5、匿名实例化对象
在实例化中,没有赋值给一个变量,即为匿名实例化;
特征:只能调用一次(再调用就是新的调用,内存解析会重新执行)new ClassName().方法名;
package com.object; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 17:47 */ public class Instance { public static void main(String[] args) { // 正常实例化 PersonT p = new PersonT(); p.GetAge(); // 匿名实例化 new PersonT().GetAge(); } } class PersonT { int age = 8; public void GetAge() { System.out.println(age); } }
6、方法重载
同一个类,相同的方法名,参数不同包括形参个数,不同参数的类型。跟起它都没有关系,比如返回值,修饰符等。
简单来说处理不同数据类型的时候,可以定义不同类型,同名称的方法,方便我们任何类型进行调用。
package com.object1220; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 19:47 */ public class OverLoad { // 方法重载,定义两个同名的方法:print public String print(String str) { return str; } public int print(int num) { return num; } } class OverLoadTest { public static void main(String[] args) { OverLoad o = new OverLoad(); System.out.println(o.print("字符串")); System.out.println(o.print(666)); } }
7、可变个数形参方法
格式:public void 方法名(数据类型... 变量名){}
- 也是可以形成方法重载,但也得遵循重载原来的规则;
- 传参时可以传入多个,通过变量名下标获取或者遍历获取所以传入的参数;
- 只能命名一个数据类型的可变个数形参;
package com.object1220; /* @USER PPL-泡泡龙 or 广深小龙 @date 2020-12-20 20:18 */ public class Args { // 可变个数形参 public void eat(String... food) { // 遍历可变形参 String strs = ""; for (int i = 0; i < food.length; i++) { strs += food[i] + " "; } System.out.println(strs); } public void eat(String food) { System.out.println("重载:" + food); } public void eat(int count) { System.out.println("重载,每天吃几次?:" + count); } public static void main(String[] args) { Args a = new Args(); a.eat("1", "2", "3", "PPL"); a.eat("米饭"); a.eat(3); } }
输出:
1 2 3 PPL
重载:米饭
重载,每天吃几次?:3
二、递归
递归方法:一个方法内调用它自身(方法调方法),递归有它的一个深度,不然就和死循环没什么区别;
1、例子:计算1-100之间所有自然数之和;用递归实现;
package com.object1223;
/*
@USER PPL-泡泡龙 or 广深小龙
@date 2020-12-23 22:13
*/
public class Recursion {
public static void main(String[] args) {
/*
1、递归方法:一个方法内调用它自身(方法调方法)
*/
Recursion rec = new Recursion();
System.out.println(rec.getNumber(100));
}
// 计算1-100之间所有自然数之和;
public int getNumber(int i) {
if (i == 1) {
return 1;
} else {
return i + getNumber(i - 1);
}
}
}
就比如斐波那契也是利用递归,递归是一种算法,一种解决问题的思路;
2、其它面试题
题一:
/*
* 定义一个int型的数组:{10, 3, 234, 234, 12, 123, 34, 86};
* 让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的新值。遍历新的数组。
*/
package com.interview;
/*
@USER PPL-泡泡龙 or 广深小龙
@date 2020-12-21 21:36
*/
import java.util.Arrays;
public class Interview1 {
public static void main(String[] args) {
int[] arr = {10, 3, 234, 234, 12, 123, 34, 86};
// for (int i = 0; i < arr.length; i++) { // 错误写法
// 方法一:倒着来可以的
for (int i = arr.length - 1; i >= 0; i--) {
arr[i] = arr[i] / arr[0];
}
System.out.println(Arrays.toString(arr));
// 方法二:用变量来先赋值下标为0的数值
int[] arr2 = {10, 3, 234, 234, 12, 123, 34, 86};
int temp = arr2[0];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr2[i] / temp;
}
System.out.println(Arrays.toString(arr2));
}
}
题二: // 需要在method调用后仅打印出a=100,b=200;(method是你要写的处理逻辑)
package com.interview;
/*
@USER PPL-泡泡龙 or 广深小龙
@date 2020-12-21 21:51
*/
public class Interview2 {
public static void main(String[] args) {
int a = 10;
int b = 10;
// 需要在method调用后仅打印出a=100,b=200;
method(a, b);
System.out.println("a=" + a);
System.out.println("b=" + b);
}
public static void method(int a, int b) {
a = a * 10;
b = b * 20;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.exit(0);
}
}
题三:看以下程序,说出程序运行后输出的内容,ps:char类型是直接输出内容;
package com.interview;
/*
@USER PPL-泡泡龙 or 广深小龙
@date 2020-12-21 22:00
*/
public class Interview3 {
public static void main(String[] args) {
int[] arr = new int[10];
System.out.println(arr); // 输出地址值
char[] arr1 = new char[2];
System.out.println(arr1); // 为啥是空?
char[] arr2 = {'a', 'b'};
System.out.println(arr2); // 输出的是 a b
}
}
感谢尚硅谷在B站开源教学视频提供学习,欢迎来大家QQ交流群一起学习:482713805