5、java面向对象编程----类和对象

JAVA是一种面向对象语言。支持的基本概念:①多态;②继承;③封装;④抽象;⑤类;⑥对象;⑦实例;⑧方法;⑨重载。


一、类和对象的概念

1、对象:

        一切可以被描述的事物或实体。对象是类的一个实例,有状态(属性)和行为(方法)。

  • 属性:特征。
  • 方法:动作,行为。

2、类:

      它是描述一类对象的属性特征和行为方法的集合。抽象的概念。可以看成是创建对象的模板。

3、类和对象的区别:

  • ①类是从对象中抽象出来的,类是对象的抽象;①①对象是类的具体表现。
  • ②类是模板,规定了所有对象共同的属性和方法;②②对象是通过模板(类)创建出来的 具体的一个实体。
  • ③类是引用数据类型;③③对象是个 堆中的引用变量。

4、java类语法

  • //完整的类定义
    package 包名;
    class 类名 extends 父类
    implements 接口名
    {
    成员属性;
    构造方法;
    成员方法;
    }
  • //简单的类定义
    public class 类名{
        //定义属性部分
        属性1的类型属性1;
        属性2的类型属性2;
            ......
        属性n的类型属性n;
    
        //定义方法部分
        方法1;
        方法2;
        ......
        方法m;
    }
    
    //案例
    public class Dog{
        String bread;
        int age;
    
        void barking(){
        }
        
        void hungry(){
        }
        
        void sleeping(){
        }
    }

一个类可以包含以下类型变量:

  • 局部变量:在方法、结构方法或者语句块中定义的变量。变量声明和初始化都是在方法中,方法结束后,变量就自动销毁。
  • 成员变量:定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中的方法、结构方法、和特定类的语句块访问。成员变量系统会自动初始化。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。

二、类和对象的使用

1、定义属性(成员属性)

  • public class 类名{
        //定义属性部分
        属性1的类型属性1;
        属性2的类型属性2;
        ......
        属性n的类型属性n;
    }

2、构造方法

  • 构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
  • 每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
  • 在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
  • 很多时候都是使用 Java编译器为该类提供的默认构造方法。代码中就不用自己再写啦。
  • public class Puppy{
        public Puppy(){
        }
     
        public Puppy(String name){
            // 这个构造器仅有一个参数:name
        }
    }

3、定义方法(成员方法)

  • //访问修饰符 返回值类型 方法名称([参数1,参数2,...]){方法体;}
    public void pig(){...;}
    public int pigAge(){...;}
    public String pigName(...){...;}
    
    public String getComputer() {
    	//带返回值声明的类型和返回值的类型必须一致
    	//只能返回一个值,但可以返回数组,也只能返回一个数组
    	return "购买一台联想笔记本电脑";
    	}
    
    //详细使用方法,参考后面的综合案例

4、创建对象

对象是根据类创建的。创建对象是为了实例化(使用)类。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字new来创建一个对象。
  • 初始化:使用new创建对象时,会调用构造方法初始化对象。
  • public class Pig{
       public Pig(String name){
          //这个构造器仅有一个参数:name
          System.out.println("小猪的名字是 : " + name ); 
       }
       public static void main(String[] args){
          // 下面的语句将创建一个Pig对象
          Pig myPig = new Pig( "tommy" );
       }
    }

案例一:1.1、创建一个人类的类:定义属性

  • /**人类*/
    public class Person {
    	//定义属性:成员变量,实例成员变量
    	String name;
    	int age;
    }

案例一:1.2、创建一个运行Person类的类

  • /**运行类,用对象调用类*/
    public class TestPerson {
    
    	public static void main(String[] args) {
    		int n;
    		
    		//创建对象1
    		Person zhangsan = new Person();
    		//输出zhangsan在栈中的地址
    		System.out.println(zhangsan);
    		//给对象的属性赋值
    		zhangsan.name = "zhangsan";
    		zhangsan.age = 27;
    		//调用属性
    		System.out.println(zhangsan.name );
    		System.out.println(zhangsan.age );
    		
    		//创建对象2,对象间是相互独立的,存在不同的地址中,存储地址不相同
    		Person wanger = new Person();
    		//输出wanger在栈中的存储地址
    		System.out.println(wanger);
    		//给对象的属性赋值
    		wanger.name = "wanger";
    		wanger.age = 28;
    		//调用属性
    		System.out.println(wanger.name );
    		System.out.println(wanger.age );
    		
    		//将对象赋值给另一个对象,即两相同地址的栈指向同一个堆,存储地址相同
    		Person mazi = wanger; //把wanger这个对象赋值给mazi
    		System.out.println(mazi);
    		System.out.println(mazi.name);
    		System.out.println(mazi.age);
    	}
    }

5、访问实例变量和方法

通过已创建的对象来访问(调用)成员变量和成员方法

方法调用注意事项:

①在不同类中调用方法,用对象名调用;

②在同一个类中,自定义方法之间是可以互相调用的,使用this调用,当然this可以省略;

③在同一个类中,自定义的static方法,也需要创建对象,用对象名调用其它方法;

  • public class Pig{
       int pigAge;
       public Pig(String name){
          // 这个构造器仅有一个参数:name
          System.out.println("小猪的名字是 : " + name ); 
       }
     
       public void setAge( int age ){
           pigAge = age;
       }
     
       public int getAge( ){
           System.out.println("小猪的年龄为 : " + pigAge ); 
           return pigAge;
       }
     
       public static void main(String[] args){
          /* 创建对象 */
          Pig myPig = new Pig( "tommy" );
          /* 通过方法来设定age */
          myPig.setAge( 2 );
          /* 调用另一个方法获取age */
          myPig.getAge( );
          /*你也可以像下面这样访问成员变量 */
          System.out.println("变量值 : " + myPig.pigAge ); 
       }
    }

6、源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个public类,但可以有多个非public类,非public类不能同名。
  • 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Pig,那么源文件应该命名为Pig.java。
  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
  • 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
  • import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

7、综合案例


7.1、不带参数、有返回值的方法使用案例

例1:

  • package test2;
    /**定义一个类*/
    public class Person {
    	//定义属性:成员变量,实例成员变量
    	String name;
    	int age;
    	/*方法的作用:①代码重用;②方便维护;③封装。*/
    	//定义方法1
    	public void behavior() {
    		System.out.println("*********购物********");
    	}
    	//定义方法2
    	public void show() {
    		//this:当前类,本类对象,可以调用本类的成员(属性,方法)
    //		String demoName = this.name;   
    //		int demoAge = this.age;
    		String demoName =name;
    		int demoAge = age;
    		System.out.println( "demoName:"+  demoName +",demoAge:"+demoAge);
    	}
    	//定义方法3
    	public String getComputer() {
    		//声明的类型和返回值的类型必须一致
    		//只能返回一个值,但可以返回数组,也只能返回一个数组
    		return "购买一台联想笔记本电脑";
    		}
    	//定义方法4
    	public String[] getComputerList() {
    		//声明的类型和返回值的类型必须一致
    		//只能返回一个值,但可以返回数组,也只能返回一个数组
    		String[] strs = {"华硕","联想","戴尔"};
    		return strs;	
    	}
    }
  • package test2;
    /**定义一个运行类*/
    import java.util.Arrays;
    
    public class TestPerson {
    
    	public static void main(String[] args) {
    		//创建对象
    		Person  he = new Person();
    		//实例化(调用)属性
    		 he.name = "xiaoMing";
    		 he.age = 27;
    //		 System.out.println("name:"+he.name);
    //		 System.out.println("age:"+he.age);
    		 //调用不带返回值的方法
    		 he.show();
    		 he.behavior(); 
    		 //调用带返回值的方法
    		 String computer = he.getComputer();
    		 System.out.println(computer);
    		 System.out.println(Arrays.toString(he.getComputerList()));
    		 Arrays.sort(he.getComputerList());//数组排序
    		//二分法查找,返回下标,不存在是返回负数
    		 int i=Arrays.binarySearch(he.getComputerList(), "联想");
    		 if (i >= 0) {
    			 System.out.println("有联想");
    		 }else {
    			 System.out.println("无联想");
    		 }
    	}
    }
  • //运行结果
    demoName:xiaoMing,demoAge:27
    *********购物********
    购买一台联想笔记本电脑
    [华硕, 联想, 戴尔]
    有联想
    

例2:在控制台输入成绩,并计算总分和平均分

  • package test2;
    //创建一个存储计算学科成绩的类
    public class Score {
    	//定义属性,成员变量
    	double excel;
    	double javaSe;
    	double linux;
    	double db;
    	double sumScore;
    	double avgScore;
    	//定义方法1,计算总成绩
    	public double sum() {
    		 this.sumScore = excel + javaSe + linux + db ;
    		return sumScore;		
    	}
    	public double avg() {
    		avgScore = sumScore / 4.0;
    		return avgScore;
    	}
    }
  • package test2;
    import java.util.Scanner;
    //创建一个运行类
    public class TestScore {
    	public static void main(String[] args) {
    		//使用控制台输入
    		Scanner superman = new Scanner(System.in);
    		//创建对象
    		Score student = new Score();
    		//实例化(调用)属性
    		System.out.print("输入excel成绩:" +"\n");
    		student.excel = superman.nextDouble();
    		System.out.print("输入javaSe成绩" + "\n");
    		student.javaSe = superman.nextDouble();
    		System.out.print("输入linux成绩"+"\n");
    		student.linux = superman.nextDouble();
    		System.out.print("输入db成绩" +"\n");
    		student.db = superman.nextDouble();
    		//调用方法
    		System.out.println("总分:"+student.sum());
    		System.out.println("均分:"+student.avg());
    	}
    }
  • //结果
    输入excel成绩:
    80
    输入javaSe成绩
    90
    输入linux成绩
    90
    输入db成绩
    90
    总分:350.0
    均分:87.5

     


7.2、带参数的方法使用案例

package test2;
/*一个源文件中可以有多个类
带参数方法的使用介绍
*/
//定义一个榨汁机类:Juicer,默认炸葡萄汁
class Juicer{
	//属性,成员变量
	String name = "多功能榨汁机";
	//方法1:只榨葡萄汁,装好,看一下就行
	public void juicing01() {
		System.out.println("葡萄汁");
	}
	//方法2:炸出的葡萄汁,用来做葡萄酒
	public  String juicing02() {
		return "葡萄汁";
	}
	//方法3:根据放入的不同食物,榨不同的汁
	//加入形式参数
	public String juicing03(String food) {
		return food+"汁";
	}
	//方法4:混合果汁
	public String juicing04(int i, String food1,int j , String food2) {
		String mixedJuice = i+"个"+food1+"和"+ j + "个" +food2+"做的混合果汁";
		return  mixedJuice;
	}
}
//定义一个运行类:TestJuicer
public class TestJuicer {
	public static void main(String[] args) {
		//创建对象
		Juicer juicer = new Juicer();
		//调用成员变量
		System.out.println(juicer.name);
		//调用方法1
		juicer.juicing01();
		//调用方法2
		String box = juicer.juicing02();
		System.out.println("拿去做葡萄酒的" + box);
		//调用方法3
		//传入实参
		String box01 = juicer.juicing03("苹果");
		System.out.println("苹果榨的" + box01);
		//调用方法4
		//传入多个实参,按照顺序传参,类型保持一致,个数一致
		System.out.println(juicer.juicing04(2, "苹果", 1, "西瓜"));
	}
}

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值