- 面向对象概述
- java中的类与对象
- 类的封装
- 方法的重载和递归
- 构造方法
- this关键字
- static关键字(静态)
面向对象概述
面向过程:强调的是过程。也就是说完成功能的每一个步骤都需要自己来做
做菜:自己种菜自己做菜
面向对象:强调的是对象。由对象去帮我们完成具体的功能。
做菜:找一个厨师帮你做。
面向对象的好处:
1.将复杂的事情简单化
2.更符合人们的思想习惯
3.将程序员由执行者变成了指挥者
一、类的定义
public class Person {//public:权限修饰符 class:声明类的关键字 Person:类名
//一个类主要由以下两部分组成:
//1、成员变量:这一个类的一些描述信息(属性等)
String name; //描述:人的姓名
int age; //描述:人的年龄
//2、成员方法:这一个方法可以做一些事情(行为)
/*
* 方法的定义:
* 权限修饰符 返回值类型 方法名(数据类型 参数名1,数据类型 参数名2....){
* 方法体;
* return 返回值;
* }
* */
//定义两个属于“Person”的方法,吃饭&睡觉
//吃饭:有参数的方法的定义
public void eat(String food) {
System.out.println(name+ "正在吃"+ food);
}
//睡觉:无参数的 方法的 定义
public void sleep() {
System.out.println(name +"正在睡觉");
}
}
知识点清查:
1.在面向对象的思想中,最核心的就是对象,为了在程序中创建对象,首先就需要定义一个类;
2.类中的方法叫成员方法,成员方法又分为实例方法与类方法;
3.类中的属性叫成员属性,成员属性又分为实例属性与类属性;
4.类用于描述多个对象的共同特征,它是对象的模板;
5.对象是类的具体化,一个类可以对应多个对象;
6.类是对象的抽象描述,对象则是该类事务的个体。
7.类是对某一类事物的抽象描述,而对象则是该类事物的个体。
8.对象是类的实例化。
9.类用于描述多个对象的共同特征,它是对象的模板。
二、对象的创建与使用
package com.itheima01;
/*
* 类的使用:
* 1.如何:创建对象;
* 类名 对象名=new 类名( );
*
* 2.如何:使用成员;
* 使用成员变量:对象名.变量名
* 使用成员方法:对象名.方法名
*
* 3.对象的内存图解
*
* 4.成员变量的默认初始化值
* 整数类型:0
* 浮点类型:0.0
* 字符类型:空白字符‘\u0000’
* 布尔类型:false
* 引用数据类型: null
* 5.局部变量和 成员变量区别与注意事项
*
* 6.堆内存垃圾的形成和解决
*
* */
public class Demo02 {
public static void main(String[] args) {
//创建Person对象:
Person p =new Person();
//使用成员:
System.out.println(p.name);//运行结果为:null
System.out.println(p.age);//运行结果为:0
//为成员变量赋值
p.name="张三";
p.age=23;
//再次输出成员变量
System.out.println(p.name);//张三
System.out.println(p.age);//23
System.out.println("==============================");
//使用成员方法
//这里就会调用到之前在Person类中定义的两个方法
p.eat("米饭");//张三正在吃米饭<----System.out.println(name+ "正在吃"+ food);
p.sleep();//张三正在睡觉<----System.out.println(name +"正在睡觉");
}
}
5.局部变量和成员变量:
访问的特点:java遵守的是就近原则。“谁离的近就优先使用谁!”
成员变量和局部变量的区别:
(1)定义位置:
成员变量:定义在类中的方法外
局部变量:定义在类中的方法内部或者方法声明上(如这里的String food就是声明在方法上的局部变量)
(2)内存中的位置:
成员变量:在堆内存中
局部变量:在栈内存中
(3)生命周期的区别:
成员变量:随着对象的创建而创建,随着对象的消失而消失
局部变量:随着方法的调用而创建,随着方法的消失而消失
(4)默认初始化值的区别:
成员变量:有默认的初始化值
局部变量:没有默认的初始化值,使用局部变量之前,必须要给局部变量赋值。
知识点清查:
1.下面的代码的输出结果为?
package net.csdn;
class Person{
void say() {
System.out.println("hello");
}
}
class Example01 {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person();
p2.say();
p1.say();
p2=null;
p2.say();
}
}
2.创建对象时用new关键字;
3.阅读代码看输出结果:
package net.csdn;
public class Example02 {
public static void main(String[] args) {
String s1=new String("abc");
String s2=s1.intern();
String s3="abc";
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s1==s3);
}
}
解析:
package net.csdn;
public class Example02 {
public static void main(String[] args) {
String s1=new String("abc");//创建一个String类型的对象s1并赋值为abc
//相当于:
//String s1=new String();
//s1="abc";
System.out.println("intern()="+s1.intern());//String类的intern() 方法返回字符串对象的规范化表示形式。*01(故此处输出abc)
String s2=s1.intern();//abc赋值给变量s2
String s3="abc";
System.out.println("s1="+s1);
System.out.println("s2="+s2);
System.out.println("s3="+s3);
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s1==s3);
System.out.println("===========================================");
//*01
//Java intern() 方法
/*
* intern() 方法返回字符串对象的规范化表示形式。
*
* 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为
* true。
*
* 语法 public String intern() 参数 无
*
* 返回值 一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
*/
//实例:
String Str1 = new String("www.runoob.com");
String Str2 = new String("WWW.RUNOOB.COM");
System.out.print("规范表示:" );
System.out.println(Str1.intern());
System.out.print("规范表示:" );
System.out.println(Str2.intern());
}
}
运行结果:(此处有疑问)
三、访问修饰符
- 在java中,针对类、成员方法和属性提供了四种访问级别,分别是private、default、protected、和public.
四种访问控制级别说明: - private(当前类访问级别):如果类的成员被private访问控制符来修饰,则这个成员只能被该类的其他成员访问,其他类无法直接访问。类的良好封装就是通过private关键字来实现的。
- default(包访问级别):如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或者类的成员只能被本包中的其他类访问。
- protected(子类访问级别):如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。
- public(公共访问级别):这是一个最宽松的访问控制级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。
知识点清查:
- protected(子类访问级别):如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。
- 如果类的成员被(private)访问控制符来修饰,则这个成员只能被该类的其它成员访问,其它类无法直接访问。
四、类的封装
2.接下来提供一个公共的访问方法,这个方法能对传入的值进行判断
Person类:
package com.itheima01;
/*封装
* 什么是封装?
* 封装就是将对象中实现的细节隐藏。不被外界所直接访问
* 封装的好处?
* 可以提高代码的安全性
* */
public class Demo03 {
public static void main(String[] args) {
//创建对象
Person p=new Person();
//调用方法为成员变量赋值
p.setName("张三");//用公共访问方法为私有的成员变量name进行赋值:name="张三"
p.setAge(23);//用公共访问方法为私有的成员变量age进行赋值:age=23
//调用方法获取值(这属于:调用有返回值类型的方法)
String name=p.getName();//接收调用方法返回的name
int age=p.getAge();//接收调用方法返回的age
System.out.println("姓名是:"+name+",年龄是:"+age);
}
}
运行结果:
知识点清查:
- 为了能让外界访问私有属性,需要提供一些使用public关键字修饰的公有方法;
- java提供了四种访问级别,由小到大依次是private>default>protected>public。
- private关键字用于将类中的属性私有化;
五、方法的重载
程序需要针对每一种求和的情况都定义一个方法,
如果每个方法的名称都不相同。
在调用的时候就很难分清哪种情况应该调用哪个方法,
为了解决这个问题,
java允许在一个程序中定义多个名称相同,
但是参数的类型或者个数不同的方法,
这就是方法的重载。
需要注意的是:
方法的重载哦与返回值类型无关,
它只是需要满足两个条件,
一是方法名相同,
二是参数个数或参数类型不同。
(一)、无“方法重载”的情况下求整数的和
package com.itheima02;
public class Demo01 {
public static void main(String[] args) {
//在主方法中调用下面定义的静态方法。
int sum=getSum(10,20);//返回的sum在这里应有一个变量来接收
System.out.println("sum="+sum);//运行结果:sum=30
//在主方法中调用定义的静态方法:int getsumB
int sum2=getSumB(10,20,30);
System.out.println("sum2="+sum2);//运行结果:sum=60
}
//定义一个求两个整数的和的方法
/*
* 定义方法时的两个明确:
* 两个明确:
* 明确参数列表:int num1 ,int num2
* 明确返回值类型:int
*
* */
//主方法main是一个静态的方法
//如果要在主方法里面调用其它方法
//那么这些方法也应该是静态方法(用static关键字修饰)
public static int getSum(int num1,int num2) {
int sum=num1+num2;
return sum;
}
//需求2:定义一个求三个整数的方法
/*两个明确:
* 1.明确参数列表:int num1,int num2,int num3
* 2.明确返回值类型:int
* */
public static int getSumB(int num1,int num2,int num3) {
int sum=num1+num2+num3;
return sum;
}
}
注意:public static void main(String args[]){}.为什么必须要加上static呢?
这是因为:
static静态方法是存储在静态存储区内的,可以通过类.方法名直接进行调用,不需要进行实例化。
假设不使用static,那么main()方法在调用时必须先对其实例化,
而main()做为程序的主入口显然不可能先对其实例化,所以使用static修饰,可以更方便的直接用类.main()对其调用。
而需要像上面代码中的调用一样:
在主方法main()调用其它定义的方法,那么就需要用static关键字来修饰这个方法。
(二)、方法的重载
package com.itheima02;
/*
* 方法的重载:
* 什么是方法的重载?
* 1.方法名相同
* 2.方的参数列表不同(参数的个数不同,参数的数据类型不同)
* 3.与返回值无关。
* */
public class Demo001 {
public static void main(String[] args) {
}
//两个明确:1.明确参数列表,2.明确返回值类型。
//定义一个求两个整数的方法:
public static int getSum(int num1,int num2) {
int sum=num1+num2;
return sum;
}
//定义一个求两个小数的方法:
public static double getSum(double d1,double d2) {
double sum=d1+d2;
return sum;
}
//注意:若主方法需要调用定义在主方法中的方法
// 则这些方法都需要使用static关键字来修饰
}
五、方法的递归
package com.itheima02;
/*
* 方法的递归:
* 指的就是方法本身自己调用自己
* 注意事项:
* 1.递归的次数不宜过多
* 2.递归一定要有出口(一定要有一个结束的条件)
* */
public class Demo02 {
public static void main(String[] args) {
//需求:5~1之间的数字之和
/*
* 5+4+3+2+1
* 5+(4~1)
* 4+(3~1)
* 3+(2~1)
* 2+1
* */
int sum=getSum(5);
System.out.println(sum);
}
public static int getSum(int num) {
if(num==1) {
return 1;
}
return num+getSum(num-1);
}
}
方法递归的内存图解:
六、构造方法的定义
package com.itheima03;
public class Person {
//Person是一个类:
//一个类应该有如下属性:
//1、成员变量
//用标准的写法定义成员变量
private String name;
private int age;
//给这两个私有的成员变量提供一个对应的get、set方法,才能间接的访问到成员变量;
//2、get/set方法
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
//普通的成员方法
public void speak() {
System.out.println("我的姓名是:"+name+",我的年龄是:"+age);
}
}
package com.itheima03;
public class Demo01 {
public static void main(String[] args) {
//要使用一个自定义类,首先应该创建对象
Person p=new Person();
/* 为成员变量赋值 */
p.setName("张三");
p.setAge(23);
p.speak();
}
}
Person()调用的就是构造方法;
package com.itheima03;
public class Person {
//Person是一个类:
//一个类应该有如下属性:
//1、成员变量
//用标准的写法定义成员变量
private String name;
private int age;
//无参(空参)的构造方法
public Person() {
System.out.println("构造方法被执行了");//在创建对象时就会访问到这个构造方法
}
//给这两个私有的成员变量提供一个对应的get、set方法,才能间接的访问到成员变量;
//2、get/set方法
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
//普通的成员方法
public void speak() {
System.out.println("我的姓名是:"+name+",我的年龄是:"+age);
}
}
package com.itheima03;
/*
* 构造方法的定义格式:
* 定义格式:
* 权限修饰符 方法名(){
* 方法体;
* }
* 1.方法名和类名要保持一致
* 2.构造方法没有返回值类型,连void都不能写
* 3.构造方法中不能写return语句
*
*
*
* 构造方法的注意事项:
* 1.如果我们自己没有写任何的构造方法。系统会默认提供一个五参数的构造方法。
* 供我们创建对象使用
*
* */
public class Demo01 {
public static void main(String[] args) {
//要使用一个自定义类,首先应该创建对象
Person p=new Person();
/* 为成员变量赋值 */
p.setName("张三");
p.setAge(23);
p.speak();
}
}
七、构造方法的重载
package com.itheima03;
public class Person {
//Person是一个类:
//一个类应该有如下属性:
//1、成员变量
//用标准的写法定义成员变量
private String name;
private int age;
//无参(空参)的构造方法
public Person() {
System.out.println("空参构造方法被执行了");//在创建对象时就会访问到这个构造方法
}
public Person(String n,int a) {//有参数的构造方法,在创建对象时也必须有参数
System.out.println("有参构造方法执行了");
name =n;
age=a;
}
//给这两个私有的成员变量提供一个对应的get、set方法,才能间接的访问到成员变量;
//2、get/set方法
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
//普通的成员方法
public void speak() {
System.out.println("我的姓名是:"+name+",我的年龄是:"+age);
}
}
package com.itheima03;
public class Person {
//Person是一个类:
//一个类应该有如下属性:
//1、成员变量
//用标准的写法定义成员变量
private String name;
private int age;
//无参(空参)的构造方法
public Person() {
System.out.println("空参构造方法被执行了");//在创建对象时就会访问到这个构造方法
}
public Person(String n,int a) {//有参数的构造方法,在创建对象时也必须有参数
System.out.println("有参构造方法执行了");
name =n;
age=a;
}
//给这两个私有的成员变量提供一个对应的get、set方法,才能间接的访问到成员变量;
//2、get/set方法
public void setName(String s) {
name=s;
}
public String getName() {
return name;
}
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
//普通的成员方法
public void speak() {
System.out.println("我的姓名是:"+name+",我的年龄是:"+age);
}
}
七、this关键字
this关键字的作用:可以区分局部变量和成员变量同名的问题。
package com.itheima03;
public class Person {
//Person是一个类:
//一个类应该有如下属性:
//1、成员变量
//用标准的写法定义成员变量
private String name;
private int age;
//无参(空参)的构造方法
public Person() {
System.out.println("空参构造方法被执行了");//在创建对象时就会访问到这个构造方法
}
public Person(String name,int age) {//有参数的构造方法,在创建对象时也必须有参数
System.out.println("有参构造方法执行了");
this.name =name;//等号左边的是成员变量
this.age=age;//等号左边的是成员变量
}
//给这两个私有的成员变量提供一个对应的get、set方法,才能间接的访问到成员变量;
//2、get/set方法
public void setName(String name) {
this.name=name;//等号左边的是成员变量
}
public String getName() {
return name;
}
public void setAge(int a) {
this.age=age;//等号左边的是成员变量
}
public int getAge() {
return age;
}
//普通的成员方法
public void speak() {
System.out.println("我的姓名是:"+name+",我的年龄是:"+age);
}
}
package com.itheima03;
/*
* 构造方法的定义格式:
* 定义格式:
* 权限修饰符 方法名(){
* 方法体;
* }
* 1.方法名和类名要保持一致
* 2.构造方法没有返回值类型,连void都不能写
* 3.构造方法中不能写return语句
*
*
*
* 构造方法的注意事项:
* 1.如果我们自己没有写任何的构造方法。系统会默认提供一个无参数的构造方法。
* 供我们创建对象使用
* 2.如果我们自己写了一个构造方法,那么系统就不再提供空参的构造方法了
*
* */
//this关键字的作用:可以区分局部变量和成员变量同名的问题。
public class Demo01 {
public static void main(String[] args) {
//要使用一个自定义类,首先应该创建对象
//Person p=new Person();
Person p=new Person("李四", 24);
/* 为成员变量赋值 */
// p.setName("张三");
// p.setAge(23);
p.speak();
}
}
2.this 关键字代表的是当前对象的引用。谁来调用我,我就代表谁