java基础5(黑马)
一、面向对象基础
1.面相对象编程快速入门
计算机是用来处理数据的。
单个变量
数组变量
对象数据
Student类:
package cn.chang.object;
public class Student {
String name;
double chinese_score;
double math_score;
public void printTotalScore() {
System.out.println(name + "的总成绩是: " + (chinese_score + math_score));
}
public void printAverageScore() { System.out.println(name + "的平均成绩是: " + (chinese_score + math_score) / 2.0); }
}
测试类:
package cn.chang.object;
public class Test {
public static void main(String[] args) {
// 目标:面向对象编程快速入门
// 创建一个学生对象,封装波妞的数据
Student s1 = new Student();
s1.name = "播妞";
s1.chinese_score = 100;
s1.math_score = 100;
s1.printTotalScore();
s1.printAverageScore();
Student s2 = new Student();
s2.name = "播仔";
s2.chinese_score = 59;
s2.math_score = 59;
s2.printTotalScore();
s2.printAverageScore();
}
}
开发一个一个的对象,把数据交给对象,再调用对象的方法来完成对数据的处理。
2.深刻理解面向对象
1)面向对象编程的好处?
世界万物皆对象。
汽车的数据找汽车对象处理。
手机的数据找手机对象处理。
学生的数据找学生对象处理。
符合人类的思维习惯,编程更简单,更直观。
2)程序中的对象到底是个啥?
对象本质上是一种特殊的数据结构。
对象就是一个表。
对象是用类new出来的,有了类就可以创建对象。
类名 对象名 = new 类名();
3)对象是怎么出来的?
class也是类,也称为对象的设计图(或者对象的模板)。
面向对象编程(OOP):
把现实世界中的事物全部看成一个一个的对象来解决问题的。Java的核心思想:万物皆对象
类(设计图):相同事物的共同特征的描述。
对象:对象是类的具体实例。对象和实例是一回事
3.定义类
定义类的一些注意事项:
1)类名首字母建议大写、有意义、满足驼峰,不要用关键字,合法的标识符;
2)一个java文件中可以定义多个类,但是只能一个类是public修饰的,而且public修饰的类名必须成为java的文件名,否则报错。
类中具体怎么写呢?
一般名词定义为属性(成员变量)。修饰符、数据类型、变量名称 = 初始值。
private String name;
private double score;
成员变量不建议初始化,存在默认值,默认值的规则:0、0.0、null、false。
一般动词定义成方法(行为):修饰符、返回值、方法名(形参)
创建对象:类名 对象名 = new 构造器();
对象的使用:
对象名.成员变量
对象名.成员方法
二、对象在计算机中的执行原理
栈存放的是基本类型变量和方法,堆内存存的是引用数据类型和new的对象。
package cn.chang.object;
public class Test {
public static void main(String[] args) {
// 目标:面向对象编程快速入门
// 创建一个学生对象,封装波妞的数据
Student s1 = new Student();
s1.name = "播妞";
s1.chinese_score = 100;
s1.math_score = 100;
s1.printTotalScore();
s1.printAverageScore();
Student s2 = new Student();
s2.name = "播仔";
s2.chinese_score = 59;
s2.math_score = 59;
s2.printTotalScore();
s2.printAverageScore();
System.out.println(s1);
System.out.println(s2);
}
}
Student s1 = new Student();
每次new Student(), 就是在堆内存中开辟一块内存区域代表一个学生对象。
在栈内存中的s1变量记住的是学生对象的地址。
如何识别引用型的变量:
Student s1 = new Student();
s1变量中存储的是对象的地址,因此变量s1也称为引用类型的变量。
也就是说s1变量中存储的是堆内存中的对象的地址,那么就是引用型变量。
类和对象的一些注意事项:
如果某个对象没有任何变量指向它了,需要注意什么?
注意:当堆内存中的对象没有被任何变量引用(指向)时,那么就判定为内存中的“垃圾”。
java存在自动垃圾回收机制,会自动清除掉垃圾对象,程序员不用操心。
GC在我们的系统中太频繁导致服务运行卡顿。
三、this关键字
this就是一个变量,可以用在方法中,来拿到当前对象。
package cn.chang.thisdemo;
public class Student {
public void printThis() {
System.out.println(this);
}
}
package cn.chang.thisdemo;
public class Test {
public static void main(String[] args) {
// 目标:掌握this的应用场景
Student s1 = new Student();
System.out.println(s1);
s1.printThis();
System.out.println("-------");
Student s2 = new Student();
System.out.println(s2);
s2.printThis();
}
}
可以看出:this就是实例对象在堆内存中的地址,跟s1中保存的对象地址是一样的。也就是这个this是拿到的当前对象的地址。
this就是哪个对象调用,就指向谁。
this在开发中有什么应用场景呢?
this主要用来解决:变量名称冲突的问题。
注:this关键字在实际开发中常用来解决对象的成员变量与方法内部变量的名称一样时,导致访问冲突问题的。
四、构造器
构造器:
构造器是类的特殊方法,名字跟类名字一样,并且不能写返回值。
构造器可以重载。
构造器分无参数构造器和有参数构造器。
构造器有什么特点:
创建对象的时候,对象会去调用构造器。
Student s1 = new Student();
Student.java:
package cn.ensource.constructor;
public class Student {
String name;
double score;
// 构造器重载
// 无参数构造器
public Student() {
System.out.println("无参数构造器被执行了。");
}
// 有参数构造器
public Student(String name, double score) {
System.out.println("有参数构造器被执行了。");
this.name = name;
this.score = score;
}
}
Test.java:
package cn.ensource.constructor;
public class Test {
public static void main(String[] args) {
// 目标:认识构造器、并掌握构造器的特点、应用场景、注意事项
Student s1 = new Student();
Student s2 = new Student("播仔", 99);
System.out.println(s2.name);
System.out.println(s2.score);
}
}
构造器的应用场景:
1)创建对象的时候,同时完成对对象成员变量(属性)的初始化赋值。
构造器的注意事项:
1)类设计的时候,如果不写构造器,Java是会为类自动生成一个无参构造器;
2)一旦定义了有参构造器,java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了。
五、封装
面向对象的三大特性:封装、继承、多态。
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
封装的设计规范:
合理隐藏、合理暴露。
六、常用的APl
API(全称:Application Programming Interface:应用程序编程接口)
就是Java自己写好的程序,给程序员调用,方便完成一些功能的。
1.包Package
什么是包?
包是用来分门别类的管理各种不同程序的,类似文件夹,建包有利于程序的管理和维护。
建包的语法规则:
package cn.chang.javabean;
public class Car() {
}
在自己的程序中调用其他包下的程序的注意事项:
2.字符串String
String是什么?可以做什么?
ava.lang.String代表字符串,可以用来创建封装字符串数据,并对其进行处理。
1)创建对象;
2)封装字符串数据;
3)调用字符串方法;
String创建对象封装字符串数据的方法:
方式一:
Java程序中的所有字符串都为此对象:
String name = "abc";
String SchoolName = "上海复旦大学";
方式二:
调用String类的构造器初始化字符串对象。
new String()创建字符串对象,并调用构造器初始化字符串。
构造器 | 说明 |
public string() | 创建一个空白字符串对象,不含有任何内容 |
public string(string original) | 根据传入的字符串内容,来创建字符串对象 |
public string(char[] chars) | 根据字符数组的内容,来创建字符串对象 |
public string(byte[] bytes) | 根据字节数组的内容,来创建学符串对象 |
2.String类创建对象封装字符串数据的方式有几种?
方式一: 直接使用双引号
方式二:new string类,调用构造器初始化字符串对象。
通过构造函数创建
通过new创建的字符串对象,每一次new都会申请一个空间,虽然内容相同,但是地址值不同。
直接赋值方式创建:
以“”双引号给出的字符串,只要字符串序列相同顺序和大小相同,无论程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护。
String使用时的注意事项:
1)String对象的内容不可改变,被称为不可变字符串对象。
2)1.只要是以“...”方式写出的字符串对象,会存储到字符串常量池中,且相同内容的字符串只存一份。
2.但是通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。这个时候虽然内容相同,但是地址不同。
3.集合ArrayList
什么是集合呢?
集合是一种容器,用来装数据的,类似数组。
有数组,为什么还要来学集合呢?
数组定义完成并启动后,长度就固定了。
而集合是大小可变,开发中用的最多的。
集合的特点:大小可变,类型可以不固定,功能更加强大,适合做元素个数不能确定,同时存在增删改查的操作场景。
集合的种类非常多:
ArrayList该如何学习呢?——会提供创建容器对象的方式和增删改查
泛型:集合都是支持泛型的,约束集合在编译阶段只能操作某种数据类型。
注意:集合和泛型都不支持基本数据类型,只能支持引用数据类型。
注意:以后定义集合都应该支持泛型。
我们的集合就是要推荐什么都存,推荐这么写:
ArrayList<Object> list = new ArrayList();
ArrayList<E>:是用的最多的、最常见的一种集合。
代码:
package cn.ensource.arraylist;
import java.util.ArrayList;
/**
* 目标:要求同学们掌握如何创建ArrayList集合的对象,并熟悉ArrayList提供的常用方法
*/
public class ArrayListDemo1 {
public static void main(String[] args) {
// 1. 创建ArrayList集合对象
ArrayList list = new ArrayList();
list.add("黑马");
list.add(1);
list.add(99.5);
list.add("黑马");
list.add("Java");
System.out.println(list);
}
}
ArrayList的常用方法示例:
package cn.ensource.arraylist;
import java.util.ArrayList;
/**
* 目标:要求同学们掌握如何创建ArrayList集合的对象,并熟悉ArrayList提供的常用方法
*/
public class ArrayListDemo1 {
public static void main(String[] args) {
// 1. 创建ArrayList集合对象
// ArrayList<String> list = new ArrayList<String>();
// 从jdk1.7开始支持的写法:
ArrayList<String> list = new ArrayList<>();
list.add("黑马");
// list.add(1);
// list.add(99.5);
list.add("黑马");
list.add("Java");
System.out.println(list);
// 2. 往集合中的某个索引位置处添加一个数据
list.add(1, "MySQL");
System.out.println(list);
// 3. 获取某个索引位置的元素值
String rs = list.get(1);
System.out.println(rs);
// 4. 返回集合的元素个数
System.out.println(list.size());
// 5. 删除指定索引处的元素,返回被删除的元素
String rs2 = list.remove(1);
System.out.println(rs2);
System.out.println(list);
// 6. 删除指定的元素,返回删除是否成功
Boolean rs3 = list.remove("Java");
System.out.println(rs3);
System.out.println(list);
// 添加一个数据
list.add(1, "HTML");
System.out.println(list);
// 7. 如果删除黑马,则删除第一次出现的黑马被删除
System.out.println(list.remove("黑马")); // true 删除成功
System.out.println(list); // 第二个黑马没有被删除
// 8. set方法,把某个索引的值进行替换
list.set(0, "CentOS"); // 将HTML替换成CentOS
String rs5 = list.set(1, "黑马程序员");
System.out.println(rs5); // 打印被修改的元素
System.out.println(list);
}
}