面向对象
万事万物皆对象
在JAVA语言中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
在JAVA语言和前端语言,后端数据库交互时,前后端的结构在JAVA中都体现为类、对象
内存解析的说明
引用类型的变量,只可能存储两类值:null或地址
三、匿名对象的使用
// 匿名对象(不指名对象是谁)
// 特征:匿名对象只能调用一次
// 使用:mall.show(new Phone());
new Phone().sendEmail();
new Phone().playGame();
class Phone {
double price;
public void sendEmail() {System.out.println("发邮件");};
public void playGame() {System.out.println("玩游戏")}
}
1 面向对象学习的三条主线:
- 类及类的成员:属性、方法、构造器;代码块,内部类
- 三大特性: 封装、继承、多态
- 其他关键词
2 面向对象与面向过程(理解)
面向过程:强调功能行为,以函数为最小单位,考虑怎么左
面向过程:具备了功能的对象,以类/对象为最小单位,考虑谁来做
3 完成一个项目(或功能)的思路:
-
根据问题需要,选择问题所针对的 现实世界中的实体 。
-
从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了 概念世界中的类 。
-
把抽象的实体用计算机语言进行描述, 形成计算机世界中类的定义 。即借助某种程序 语言,把类构造成计算机能够识别和处理的数据结构。
-
将 类实例化成计算机世界中的对象 。对象是计算机世界中解决问题的最终工具。
4 面向对象中两个重要的概念:
类和对象
5 面向对象思想落地实现的规则
1.创建类
2.创建类的对象
3.通过对象.属性
或者对象.方法
调用对象的结构
6 对象的创建与对象的内存解析
JVM内存结构,编译完源程序之后,生成一个或多个字节码文件。
我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释并允许。意味着,需要将字节码文件对应的类加载到内存中,设计到内存解析
局部变量存储在虚拟机栈中
堆,New出来的结构(比如数组、对象)加载在对空间中。
对象的属性(非静态) 加载在堆空间中。
方法区:类的加载信息、常量池、静态域
类的成员之二: Method(方法)
理解方法的重载(Overload)
允许存在重名方法,只要形参不同
// 不看返回值,只看方法名和形参的类型int, char, string....
add(int a, int b)
@Overload
add (double a, double b)
可变个数形参的方法
public void show(String ...strs)
/*
...参量名
能和多个形参的点相匹配
当输入0,1,2,3及任意都行,但必须是前面指定的类型,比如string,int
*/
可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
可变个数形参在方法的形参中,必须声明在某尾
方法参数的值传递机制
如果参数是基本数据类型,此时实参赋给形参的是实参的基本数据值
如果参数是引用数据类型,此时实参赋给形参的是实参的储存数据的地址值
练习6
\t是补全当前字符串长度到8的整数倍,最少1个最多8个空格
补多少要看你\t前字符串长度
比如当前字符串长度10,那么\t后长度是16,也就是补6个空格
如果当前字符串长度12,此时\t后长度是16,补4个空格
public class PassObject {
public static void main(String[] args) {
Circle a = new Circle(1.0);
//System.out.print(a.findArea());
System.out.println("Radius\t\tArea");
PassObject po = new PassObject();
po.printAreas(a, 5);
}
//如何从左到右打印
public void printAreas(Circle c, int time) {
for (int i = 1; i <= time; i++) {
c.radius = i;
System.out.println(c.radius + "\t\t" + c.findArea());
}
}
}
面向对象三大特征
封装
隐藏对象内部的复杂性,只对外公开简单的接口
Trie 字典树
在字典树里实现插入
public class TrieNode {
char c;
HashMap<Character, TrieNode> children = new HashMap<>();
int endIndex = -1;
String val;
public TrieNode(char a) {
this.c = a;
}
public TrieNode() {
c = '0';
}
public void insert(String word, int n) {
TrieNode cur = this;
for (int i = 0; i < word.length(); i++) {
char key = word.charAt(i);
cur.children.putIfAbsent(key, new TrieNode(key));
cur = cur.children.get(key);
}
cur.val = word;
cur.endIndex = n;
}
}
720 词典中最长的单词
public class longestWord {
public static void main(String[] args) {
String[] input = new String[] {"a","banana","app","appl","ap","apply","apple"};
longestWord lw = new longestWord();
System.out.print(lw.longestWord(input));
}
public String longestWord(String[] words) {
TrieNode t = new TrieNode();
for (int i = 0; i < words.length; i++) {
t.insert(words[i], i);
}
String res = "";
TrieNode cur;
for (String w : words) {
boolean isWord = false;
if (w.length() > res.length()) {
isWord = true;
} else if (w.length() == res.length() && w.compareTo(res) < 0) {
isWord = true;
}
cur = t;
for (int i = 0; i < w.length(); i++) {
char key = w.charAt(i);
cur = cur.children.get(key);
if (cur.endIndex == -1) {
isWord = false;
break;
}
}
if (isWord == true) {
res = w;
}
}
return res;
}
}