面向对象1
1.Java方法(函数)
概念
方法也叫函数,其实就是具有一定特殊功能的一段代码,将需要的在多个位置重复使用的一组代码,定义在方法内部。
意义:
1.避免重复的代码 2.增强了程序的扩展性能。
定义方法
用法:方法的定义(声明)
public static void main(String[] args)
语法格式:
[修饰符1,修饰符2....] 返回值/void 方法名(参数列表){
......
return
}
示例:
public class Demo1_method {
/*
[修饰符1,修饰符2....] 返回值/void 方法名(参数列表){
......
return
}
*/
//定义方法
//1.定义没有返回值的方法
//方法名:标识符,尽量见名知意,驼峰命名
public static void getSum() {
System.out.println("你好");
int he = 0;
for (int i = 0;i<=15;i++){
he += i;
}
System.out.println(he);
}
//2.定义有返回值的方法
public static int getSum2(){
int he = 0;
for (int i = 0;i<=15;i++){
he += i;
}
return he;
}
//3.定义有返回值有参数的方法
public static int getSum3(int num){
int he = 0;
for (int i = 0;i<=num;i++){
he += i;
}
return he; //1.结束方法的执行。2.将返回值返回给方法的调用处
}
public static void main(String[] args) {
//定义:是具有一段特殊功能的代码
//求:1—10之间的和
int sum = 0;
for(int i=1;i<=10;i++){
sum += i;
}
System.out.println("1-10之间的和:"+ sum);
System.out.println("hello,world!");
System.out.println("hello,world!!!");
//方法的调用
//1.没有返回值的方法: 方法名(); 注意:在同一个类中调用它的静态方法可以直接调用静态方法
getSum();
//注意:如果调用的是其他类中的静态方法 必须是: 类名.静态方法();
Demo1_method.getSum();
System.out.println("-------------");
//2.有返回值的方法: 数据类型 变量 = 方法名();
int result = getSum2();
System.out.println("有返回值的方法:"+result);
//3.有返回值有参数的方法的调用:
int result2 = getSum3(3);
int result3 = getSum3(4);
System.out.println("1到3的和:"+ result2);
System.out.println("1到4的和:"+ result3);
}
}
调用方法
方法的调用(如果一个方法只有定义,那么方法中代码并没有被执行,只是被调用了才会执行方法,只有被调用了才会执行方法中的代码)
通过方法的名字进行调用。
static的方法 :静态方法
类名.方法名(); //本类中类名可以省略。
非static的方法 :非静态方法
创建该类的对象,通过对象调用方法。
类名 对象名 = new 类名();
对象名.方法名();
示例:
public class Demo2_method {
public static void print1(){
for(int i = 0;i < 5;i++){
System.out.println("hello,world!"+i);
}
}
public void print2(){
for(int i = 0;i < 6;i++){
System.out.println("hello,world!"+i);
}
}
public static void main(String[] args) {
//static方法的调用:直接调用方法名
print1();
//如果调用其它类的static方法,需要: 类名.方法名();
Demo2_method.print2();
System.out.println("----------------");
//非static方法调用:1.先创建对象, 2.对象名.方法();
Demo2_method demo2_method = new Demo2_method();
demo2_method.print2();
}
}
public class Demo5_method {
/**
* 方法的调用
*/
public static void test1(){
System.out.println("test1--------------------");
}
public static void test2(){
test1();
System.out.println("test2------------------");
}
public static void test3(){
test1();
System.out.println("test3-----------");
}
public static void main(String[] args) {
test1();
System.out.println("-----------");
test2();
System.out.println("-----------");
test3();
}
}
方法返回值
如果一个方法调用之后,需要返回给调用处结果,那么表示这个方法有返回值,在方法中需要使用return语句把结果返回给调用出。
//方法定义
public static 返回值类型 方法名(){
//......
return 结果;
}
//方法调用处
变量 = 方法名(); //变量 = 结果
如果一个方法,没有返回值,那么写void即可。
return语句:
A:把方法中的返回值,返回给方法的调用处;
B:同时结束了这个方法的执行。
public class Demo3_return {
//如果声明了有返回值就必须使用return
public static int getSum(){
return 3;
}
public static void main(String[] args) {
int sum = getSum();
System.out.println(sum);
}
}
注意点:
1.如果一个方法声明了有返回值(非void),那么方法中一定要使用return语句返回结果。
2.定义方法的时候,声明返回值的类型,一定要和return后实际上返回的数值类型一致。
3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到。
4.如果一个方法声明没有返回值(void),那么方法中也可以使用return语句,用于强制结束方法的执行。
public class Demo4_return {
//return要注意的点
/**
* 1.如果声明了有返回值,那么必须声明有return
* @return
*/
public static double getNum(){
return 5; //兼容的数据类型,会发生隐式类型转换
}
/**
* 2.定义方法的时候,声明的返回值类型,一定要和return后实际上返回值类型一致
* @return
*/
public static long getNum2(){
byte b = 34; //声明一个byte类型的变量
return b;
}
/**
* 3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到。
* @return
*/
public static int getNum3(){
int num = 45;
if(num > 0){
return num;
}else{
System.out.println("num:"+num);
return 0;
}
}
/**
* 4.如果一个方法声明没有返回值(void),那么方法中也可以使用return语句,用于强制结束方法的执行。
*/
public static void getNum4(){
int a = 12;
if (a > 10){ //如果符合条件,那么就会进入分支结构,然后执行return,结束方法的执行
return;
}
System.out.println("hello,a:"+a);
}
public static void main(String[] args) {
double num = getNum();
System.out.println(num);
long num2 = getNum2();
System.out.println(num2);
int num3 = getNum3();
System.out.println(num3);
getNum4();
}
}
方法参数
一个方法中,有些数据的数值不确定,我们定义为参数,由掉用处调用方法的时候,传入具体的数据。
形式参数:形参
定义方式:声明的参数,用于接收调用处传来的数据。
实际参数:实参 调用方法时,实际赋值给形参的数据。
示例:
public class Demo6_method_param {
/**
* 方法的参数(param)
*/
//打印一个直角三角形
public static void printShape(){ //无参数
for(int i = 1; i <= 5; i++){
for(int j = 1; j <=i; j++){
System.out.print("*");
}
//换行
System.out.println();
}
}
//打印一个直角三角形
public static void printShape(int n){ //有参数
for(int i = 1; i <= n; i++){
for(int j = 1; j <=i; j++){
System.out.print("*");
}
//换行
System.out.println();
}
}
public static void main(String[] args) {
printShape();
printShape(10); //实参形参要一一对应,参数的个数,类型,顺序都要一一对应
}
}
实参一定要严格匹配形参,一一对应,包括顺序,个数,类型。
方法分类:
有返回值:
有参有返回值:public static 返回值类型 方法名(形参列表){}
无参有返回值:public static 返回值类型 方法名(){}
无返回值:
有参无返回值:public static void 方法名(形参列表){}
无参无返回值:public static void 方法名()
方法重载
概念:一个方法的多种形式。
同一个类中
方法名相同
参数列表必须不同(顺序,个数,类型)
与static,返回值,其他的修饰符。。。这些无关
示例:
public class Demo7_overload {
// 方法的重载:在同一个类中,方法名相同,参数列表不同(个数,顺序,类型)
public static int getSum(int a,int b){
return a+b;
}
public static int getSum(int a,int b, int c){
return a+b+c;
}
public static double getSum(double a,double b){
return a+b;
}
public static void main(String[] args) {
int getSum1 = getSum(3,5);
System.out.println("getSum1:"+getSum1);
double getSum2 = getSum(3.1,4.4);
System.out.println("getSum2:"+getSum2);
int getSum3 = getSum(1,2,3);
System.out.println("getSum3:"+getSum3);
}
}
递归
方法中调用方法本身,就叫做递归方法。
递归方法一定要有出口的,逐层的像出口靠近。
示例:
public class Demo8_recursion {
//递归
//没有返回值的递归
public static void test1(int n){
System.out.println("test1----------"+ n);
if(n==1){
return; //方法的出口
}
test1(n-1); //递归自己调用自己 但是 递归一定要有出口。
}
//有返回值的递归 (递归方式求1-5的和)
public static int getSum(int n){
if(n==1){
return 1; //方法的出口
}
return getSum(n-1)+n;
}
public static void main(String[] args) {
test1(5);
//调用递归的方式来求1-5的和
int sum = getSum(5);
System.out.println(sum);
}
}
2.封装
面向对象思想概述
面向对象编程(OOP) 是一种编程思想
面向过程:关注过程。 面向对象:关注的是对象
类和对象
什么是类:
类:是一组相关属性和行为得到集合,可以看成是一类事务的模板,现实生活中的,描述一类事物。
属性:该事物的状态信息。
行为:就是该事物能干什么。
什么是对象:
对象:一类事物的一个实例:一只小猫
举例:一只小猫
属性:Tom,5kg,2years,yellow。行为:喵喵叫。
类和对象的关系:
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。
类的定义
构建一个类:
[修饰符] class 类名{
//1.属性字段:Field
成员变量
//2.成员方法:Method
行为功能
//3.构造方法:Contructor
}
示例:
public class Person {
//属性,成员变量
public int age; //姓名
public String name; //年龄
//...
//行为,成员方法
public void eat(){
//局部变量
int age = 20;
System.out.println("吃饭。。。");
}
public void sleep(){
System.out.println("睡觉。。。");
}
}
创建一个对象
类名 对象 = new 类名();
使用对象访问类中的成员:
对象名.成员变量;
对象名.成员方法();
示例:
public class PersonTest {
public static void main(String[] args) {
//创建对象
//类名 对象名 = new 类名();
Person person = new Person();
//访问成员变量成员方法
//设值
person.age = 23;
person.name = "张三";
//取值
System.out.println("person对象的年龄:"+person.age);
System.out.println("person对象的姓名:"+person.name);
//成员方法的调用
person.eat();
person.sleep();
}
}
类中成员变量,和局部变量不同,有默认值。
基本类型:
int,byte,short,long,float,double默认值都是0。
char 的默认值是“空字符”,也就是"\u0000",数值为0;
boolean默认值false
引用类型:默认值都是null,空。
构造函数
构造方法是一种特殊的方法:
1.定义的语法结构不同:
[访问修饰权限] 方法名(参数列表){
}
修饰符:访问权限修饰符
没有返回值类型,也不写void
方法名必须要和类名一致
参数:
没有参数:无参构造
有参数列表:有参构造
2.调用不同:
1.通过new关键字调用
2.new 构造方法();
3.作用不同:专门用于创建对象的
注意点:如果一个类中,没有写构造方法,那么当创建对象的时候,编译器会自动添加一个无参的构造方法,但是类中如果写了构造方法,那么编译器将不再自动添加无参了。
示例:
public class Person {
//属性,成员变量
public int age; //姓名
public String name; //年龄
//...
//行为,成员方法
public void eat(){
//局部变量
int age = 20;
System.out.println("吃饭。。。");
}
//行为,成员方法
public void sleep(){
System.out.println("睡觉。。。");
}
/*
[访问修饰权限] 方法名(参数列表){
}
*/
public Person(){ //默认的无参构造方法
System.out.println("这是无参构造方法");
}
//在创建对象的同时可以直接给成员变量赋值
public Person(String n,int a){ //有参构造方法
System.out.println("这个是有参构造方法");
name = n;
age = a;
}
}
public class PersonTest {
public static void main(String[] args) {
//创建对象
//类名 对象名 = new 类名();
Person person = new Person(); //创建person对象走无参构造方法
//访问成员变量成员方法
//设值
person.age = 23;
person.name = "张三";
//取值
System.out.println("person对象的年龄:"+person.age);
System.out.println("person对象的姓名:"+person.name);
//成员方法的调用
person.eat();
person.sleep();
System.out.println("---------");
Person person2 = new Person("李四",45); //创建person2对象走有参构造方法
System.out.println("person2对象的名字:"+person2.name);
System.out.println("person2对象的年龄:"+person2.age);
}
}
打印结果:
这是无参构造方法
person对象的年龄:23
person对象的姓名:张三
吃饭。。。
睡觉。。。
---------
这个是有参构造方法
person2对象的名字:李四
person2对象的年龄:45
this关键字
this关键字:代表所在类的当前对象的引用,即对象自己的引用
方法被那个对象调用,方法中的this就代表那个对象,即谁在调用,this就代表谁
指代本类的对象,可以访问本类的属性和方法
用途1:当局部变量和成员变量命名冲突的时候,通过this来区分。
this.成员变量
示例:
public Person(String name,int age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
用途2:访问本类的属性和方法。
this.属性;
this.方法();
习惯上直接省略this,直接用属性和方法。
public void print(){
System.out.println("名字:"+ this.name,"性别:"+sex,"年龄:"+age);
}
public void eat(){
this.print();
}
指代构造方法:this();
如果存在多个构造方法,那么this指代的构造方法要靠参数来区分:顺序,个数,类型。
**注意:**this指代构造函数只能放在第一句。
示例:
//默认的无参构造方法
public Person(){
System.out.println("这是默认的构造方法!");
}
//有参的构造方法
public Person(){
this(); //可以调用无参的构造方法
this.name = name;
this.age = age;
}
public Person(String name,int age,String sex){
this(name,age); //有参的构造方法
// System.out.println(name);
// System.out.println(age);
// System.out.println(sex);
// this.name = name;
// this.age = age;
this.sex = sex;
}
面向对象三大特性之封装
面向对象有三个特性:封装,继承,多态
封装性:尽可能隐藏对象的内部实现细节。控制对象的修改以及访问的权限。
1.隐藏了实现的细节;
2.提高了代码的复用性
3.提高了安全性,保护了细节,保护数据的安全。
封装步骤:
在类中,属性的数值不安全,所以要将属性进行封装。
1.使用private修饰符来修饰属性。限于本类中访问。
2.因为对象对属性的操作:赋值和取值。
类中提供两个方法,分别用于给属性赋值和取值。
赋值方法setter:setXXX():比如setAge(),setName()
取值方法getter:getXXX():比如getAge(),getName()
访问修饰符4个
public:公共的
private:私有的,属性,方法 只能在本类中使用
示例:
public class Student { //封装
//第一步:用访问修饰符修饰成员变量,限于本类访问
//三个成员变量
private String stuNo;
private int age;
private char sex;
//第二步:提供设值取值相应的方法
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public int getAge() {
return age;
}
public void setAge(int age) {
//可以在set方法中设置一些条件规则
if(age<0){
System.out.println("要设置的参数不合理,请重新赋值!");
return;
}
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
//成员方法,行为
public void study(){
System.out.println("学习------------");
}
public void play(){
System.out.println("玩游戏------------");
}
//打印自己本身的属性
public void print(){
System.out.println("stuNo:"+stuNo);
System.out.println("age:"+age);
System.out.println("sex:"+sex);
System.out.println("hahahah");
}
}
public class StudentTest {
public static void main(String[] args) {
//1.创建对象
Student student = new Student();
student.setStuNo("001");
student.setAge(18);
student.setSex('男');
student.print();
System.out.println("------------------------");
Student student2 = new Student();
student2.setStuNo("001");
student2.setAge(18);
student2.setSex('女');
student2.print();
}
}