一、类 和对象
1.什么是对象?
对象是用来描述客观事物的一个实体,世界万物皆为对象,是一个实实在在存在的东西。在我们生活中,上课坐的凳子是对象,课桌也是对象,你也是一个对象等等。
2.类:
①定义:
很多很多的对象具有相同的属性和方法,我们就把他们归为一类;类只是一个概念,并不是实实在在存在东西。类本身不携带任何数据,当没有为类创建任何对象时,类本身不存在于内存空间中。
例如:人类、教师类、学生类、狗类、猫类等。
②类的属性:
对象所拥有的静态特征在类中表示时称为类的属性,例如所有人类都有姓名、年龄、体重、身高等,所有狗类都有毛发颜色、品种、年龄等、所有车类都有车牌号、品牌、颜色等
③类的方法:
对象执行的操作(动态特征)称为类的方法,例如所有人类都会吃喝拉撒睡,所有狗类都会叫、会跑,所有汽车类都会鸣笛、会刹车加速减速。
3.类和对象的关系:
类是对象的抽象化;对象是类的实例化。
通俗一点来说,我们假设类就是模具(有点矛盾,因为类是不存在的),模具(类)只有通过具体的材料才可以做出东西出来,做出来的东西就是一个对象或者多个对象,因此对象是由类产生的。类是多个对象进行综合抽象的结果,是实体对象的概念模型。类不能直接使用,对象是可以直接使用的。
4.如何定义类
①定义类名(关键字class);
public class 类名{
// 属性 (变量) ;
//行为 (方法) ;
}
②编写类的属性;
其实就是在一个类中,定义一个变量,直接数据类型+变量名即可。
③编写类的方法。
访问修饰符 返回值类型 方法名(){
//方法体
}
a.访问修饰符:访问修饰符限制了访问该方法的范围,如我们最熟悉的public公共的,公开的。
b.返回值类型:是方法执行后返回结果的类型,这个类型时基本类型或者是引用类型,也可以没有返回值,此时用void(空的)来描述。
c.方法名:自己和别人可以看得懂的名字(命名规范),其命名应该符合标识符的命名规则。
注意:在Java中,定义类的属性和方法使用驼峰命名法(第一个单词的首字母小写,后面每个单词的首字母大写如:showCenter),定义类使用帕斯卡命名法(每个单词的首字母都大写)。
例如:定义一个人类
public class Person { //类名首字母大写
String name ; //名字
int age ; //年龄
public void show() { // 没有static
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
}
类定义完成之后,肯定无法直接使用。我们前面也说过对象才可以直接使用,因此就要根据定义的模板创建对象了。
5.如何创建和使用对象
语法: 声明并实例化对象
类名 对象名 =new 类名();
//例如
School str =new Schoole();
关键字new的主要功能就是分配内存空间。
在Java中,要引用对象的属性和方法,需要使用“ . ”操作符。
语法:
对象名.属性 //引用对象的属性
对象名.方法名() //引用对象的方法
//例如
str.name="张三";
str.age=18;
str.show();
例如:
public class Dog{
String name; //名字
int age; //年龄
String variety; //品种
public void show(){
System.out.println("名字:"+name+" "+",年龄"+age+"岁");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog(); //创建对象
dog.name="小黑";
dog.age=3;
dog.show();
}
}
输出结果:名字:小黑,年龄:3岁
例二:
public class Dog{
String name; //名字
int age; //年龄
String variety; //品种
public void show(){
System.out.println("名字:"+name+" "+",年龄"+age+"岁");
}
}
public class Test{
public static void main(String[] args){
Dog dog = null; //声明对象
//dog =new Dog();
dog.name="小黑";
dog.age=3;
dog.show();
}
}
例二在测试类中只声明了对象,并没有实例化一个对象,因此运行时会报错,这个错误信息表示的是“NullPointerException(空指向异常)”,这种异常只要是应用数据类型都有可能出现。
6.面向对象的优点:
①与人类的思维习惯一致;
②信息隐藏;
③提高了程序的可重用性。
注意: 在刚刚学习类和对象的时候,可以对应题目把题中的属性和方法列出来,这样会减少出错的概率。
7.封装
定义:封装就是把一个事物包装起来,并尽可能隐藏内部细节。
对象具有封装性。对象的属性和方法被共同封装在类中,相辅相成,不可分割。
扩展: 面向对象的三大特性是指:封装、继承和多态。
二、类的无参方法
1.类的方法
①定义:
类的方法就是一个功能模板,其作用是"执行某个操作或做一件事情",类的每个方法都实现了一个功能,如果类没有赋予的动作,那么对象不具备这个行为。
②类的方法的组成:
<1>方法的名称;
<2>方法的返回值类型;
<3>方法的主体。
③步骤:
第一步:定义方法名和返回值类型
第二步:在{}中编写方法的主体部分
注意:方法执行后可能会返回一个结果,该结果的类型称为返回值类型,使用return语句返回值。
//例如
public int show(){
//方法体
return 0;
}
返回值是int类型的,这时必须使用return返回一个整数。因此我们可以知道当返回值是什么类型的就应该返回什么类型,否则就会编译报错。当返回值类型为void时候,不用使用return。
!!! return后面的数据类型要跟返回值类型兼容
方法的接收值要根方法的返回值类型兼容
2.return的作用:
<1> 跳出方法。意思是“我已经完成了,要离开这个方法”。
<2>给出结果。例如我们小时候玩的电动狮子,当我们按动按钮时电动狮子就会跑,这个“跑”就是方法返回的一个结果。
3.方法的调用
注意:有返回值的方法可以直接调用!!
语法: 对象名.方法名();
难点:① 在同一个类中,如果没有static修饰可以直接调用方法,使用方法名();也可以使用对象名.方法名();如果是static方法,只能使对象名.方法名();进行调用,并且在static方法中不能直接调用非static方法,但是可以通过new对象调用。
//static方法
public class Demo{
String name;
public static void show(){
System.out.println("姓名:"+name);
}
}
public static void main(String[] args){
show(); //直接调用
}
//非static方法
public class Demo{
String name;
public void show(){
System.out.println("姓名:"+name);
}
}
public static void main(String[] args){
Demo demo =new Demo(); //创建对象
demo.show(); //调用方法
}
② 在不同的类中:对象名.方法名();
注意: a. 方法不能返回多个值;
public class Demo{
public double show(){
double weight =95.5;
double height =1.69;
return weight,height; //返回多个值
}
}
b.多个方法不能相互嵌套定义;
public class Demo{
public String show(){
return "我是一名学生";
public double showInfo(){
double weight =95.5;
return weight; //方法嵌套
}
}
}
c.不能在方法外直接写程序逻辑代码;
d.方法的返回值类型位void,方法中不能有return语句。
4.变量的作用域
1.成员变量:在类中定义的变量称为类的成员变量;如果其他类的方法要访问它,必须先创建对象,再通过操作符“ . ”来引用。
2.局部变量:在方法中定义的变量称为局部变量;具有局限性,只能在方法中使用。在同一个方法中,不允许有同名的局部变量,但是在不同的方法中可以有同名的局部变量。
注意:成员变量和局部变量的作用域不同,局部变量有一定的范围;初始值不同,Java不会给局部变量赋初始值,所以局部变量必须要定义赋值后才能使用!!!
public class Demo{
变量1类型 变量1;//类的属性(成员变量)
public 方法1(){
变量2类型 变量2;//方法1(局部变量)
}
}
5.JavaDoc注释
语法规则:<1>JavaDoc注释以“ /** ”开头,以“ */ ”结尾;
<2>每个注释包含一些描述性的文本及若干个JavaDoc标签;
<3>JavaDoc标签一般以"@"为前缀,标签如下表:
标 签 | 含 义 | 标 签 | 含 义 |
---|---|---|---|
@author | 作者名 | @version | 版本标识 |
@parameter | 参数及其意义 | @since | 最早使用该方法 |
@return | 返回值 | @throws | 异常类及抛出条件 |
三、类的有参方法
1.带参方法
语法:<访问修饰符>返回值类型<方法名>(<参数1,参数2,参数3…参数n>)
参数:当一个动作的完成需要依赖其他事物的,那这个其他事物就需要作为参数。
注意:参数允许有多个,并且参数与参数之间用逗号隔开!!
2.调用带参方法
调用带参方法与调用无参方法的语法相同,但是在调用带参方法时必须传入实际的参数的值。
a、语法:对象名.方法名(参数1,参数2,…,参数n)
在定义方法时把参数称为形参,在调用方法时把参数称为实参,形参是抽象的,而实参是实际存在的。
注意:<1>先实例化对象,再调用方法。
<2>实参的类型、数量、顺序都要与形参一一对应。
b、实参与形参的关系: 当形参是基本数据类型的时候:形参所做修改对实参没有影响
当形参是引用数据类型的时候:形参所做修改对实参是有影响(String除外)
public class Demo{
String [] names =new String[30];//学生姓名数组
public void addName(String name){ //形参
//增加学生的姓名
}
}
import java.util.*;
public class Testadd{
public static void main(String[] args){
Scanner input =new Scanner(System.in);
Demo demo =new Demo();
for(int i = 0;i<5;i++){
System.out.println("请输入学生的姓名:");
String newName =input.next();
demo.addName(newName); //调用方法并传实参
}
}
}
带参方法的参数个数无论多少,在使用时只要注意实参和形参是否一一对应,传递的实参值与形参的数据类型、个数、顺序是否一致!!!
在定义方法时,形参必须是数据类型+变量名,但是在调用方法的时候括号中只需是与形参数据类型相匹配的值即可,无需添加数据类型。
3.深入理解带参方法
参数不仅仅可以是变量,还可以是数组。其实套路都是一样的。
public class Demo{
public double calAvg(int [] scores){ //形参是一个数组
int sum=0;
double avg=0.0;
for (int i = 0; i < scores.length; i++) {
sum+=scores[i]; //累加,总成绩
}
avg=(double)sum/scores.length; //平均成绩
return avg;
}
}
public class TestDemo{
public static void main(String[] args) {
Demo st =new Demo();
int [] scores =new int[5]; //保存比赛成绩
Scanner input =new Scanner(System.in);
System.out.println("请输入五名参赛者的成绩:");
for (int i = 0; i < 5; i++) {
scores[i]=input.nextInt(); //传入实参
}
//输出平均成绩
double avgScore=st.calAvg(scores); //调用方法并接收
System.out.println("平均成绩:"+avgScore);
}
}
4.对象数组
语法:类名称 [ ]对象数组名= new 类名称[长度];
注意:在声明对象数组后 ,必须对每个数组成员进行实例化话 才能直接使用,否则报空指针异常!
在使用对象数组的时候可能需要使用三个类,第一个类是定义属性,第二个类是实例化对象和方法,第三个类是测试类。
public class Student{
String name;
int age;
}
public class studentInfo{
Student [] stu =new Student[5];
public void init(){
stu[0]=new Student();
stu[0].name="张三"; //实例化对象,用数组下标去点定义的变量名然后赋值
stu[0].age =18;
}
public void show(){ //显示格式
System.out.println("姓名"+"\t年龄");
for (int i = 0; i < stu.length; i++) {
if(stu[i]!=null){
System.out.println(stu[i].name+"\t"+stu[i].age)
}
}
}
}
public class Test {
public static void main(String[] args) {
studentInfo info =new studentInfo();
info.init(); //调用方法
info.show();
}
}
运行结果:姓名 年龄
张三 18
可能刚开始不太接受,多模仿尝试多敲几次就好了。
5.包
<1>为什么需要包?
1.易于查找
2.易于管理
3.避免冲突
4.不同内容的文档可以放在不同的袋子中,有相同的名字。
<2>如何声明包?
语法:package 包名;
含义:声明当前类所在的位置。
注意:Java包的名字通常由小写字母组成,不能以圆点开头或结尾,例如“. mypackage”是错误的包名。
<3>如何导入包?
语法:import 包名.类名;或者import 包名.*;
含义:声明在当前类中要使用到的其他类所处的位置。
四、字符串
1.定义:
字符串是一系列字符组成的序列。
2.如何使用字符串?
①定义并初始化字符串;
②使用字符串。
3.字符串的方法
①字符串的长度
语法:字符串.length();
②字符串的比较
语法:字符串1.equals(字符串2);
③忽略字符的大小写
语法:字符串1.equalsIgnoreCase(字符串2);
④字符串的转换
转换字符串中的英文字母为小写:toLowerCase();
转换字符串中的英文字母为大写:toUpperCase();
⑤字符串的连接
语法:语法:字符串1.concat(字符串2);还可以使用拼接符号“ + ”,也能实现字符串的连接。
⑥字符串的拆分
语法:字符串1.split(String separator,int limit);
(1)separator可选项,标识拆分字符串时使用一个或多个字符。如果不选择该选项,则返回包含该字符串所有单个字符上午元素数组。
(2)limit可选项,该值用来限制返回数组中的元素个数。
public class Demo{
public static void main(String[] args) {
String words ="长亭外 古道边 芳草碧连天"; //原歌词
String [] printword =new String [100]; //定义接收数组
System.out.println("***拆分后的歌词格式***");
printword=words.split(" "); //按照空格进行拆分
for (int i = 0; i <printword.length; i++) {
System.out.println(printword[i]); //循坏打印输出
}
}
运行结果:
长亭外
古道边
芳草碧连天
4.字符串的提取和查询
①indexOf()方法
返回出现第一个匹配字符的位置,如果没有找到匹配,则返回-1。
String s="青春无悔";
int index = s.indexOf('春');
运行结果:1
注意:下标从0开始!!!
②lastIndexOf()方法
搜索最后一个出现的字符或字符串的位置。
String s ="青春无悔无悔青春";
int index =s.lastIndexOf("青春");
运行结果:6
注意:返回字符串“青春”的首字符位置。
③substring(int index)方法
用于提取从位置索引开始的字符串部分,调用时括号中写的是提取的字符串的开始位置,方法的返回值就是要提取的字符串。
String s ="青春无悔";
String result = s.substring(1);
运行结果:春无悔
④substring(int beginindex,int endindex)方法
用于提取位置beginindex和位置endindex位置之间的字符串部分。
String s ="好好学习天天向上";
String result =s.substring(2,6);
运行结果:学习天天
注意:开始位置beginindex,字符串的首字符为0来进行处理,但是终止位置endindex,字符串的首字符为1来处理的。
⑤trim()方法
该方法可以忽略字符串前后的空格,注意只能是前后的空格,中间的空格不能忽略。
5.StringBuffer类
1.如何使用StringBuffer类?
①声明StringBuffer对象并初始化
//声明一个空的StringBuffer对象
StringBuffer sb1 =new StringBuffer();
//声明一个字符串
StringBuffer sb2 =new StringBuffer("好好学习");
StringBuffer sb3 =“好好学习”; x
这是错误写法,String类可以这样写但是StringBuffer类不能直接赋值,还得new出一个空间。
②使用StringBuffer对象
调用时使用操作符“ . ”完成
2.StringBuffer类的方法
①字符串1.toString();
将StringBuffer类型的字符串1转化为String类型的对象并返回。
②字符串1.append(字符串2);
StringBuffer类的拼接,但是StringBuffer类的拼接可以将任何类型的值追加到字符串的后面,而String类只能追加String类型的。因为StringBuffer类的拼接更广泛。
③字符串1.insert(位置,参数);
将参数插入字符串1的指定位置后并返回。参数可以是包括String的任何类型。
System.out.print("请输入一串数字:");
String nums = input.next();
StringBuffer str =new StringBuffer(nums);
//从后往前每隔三位添加逗号
for(int i =str.length()-3;i>0;i=i-3){
str.insert(i,',');
}
System.out.print(str);
假如输入12345678,那么运行结果是12,345,678