Java学习日志Day8_封装__this关键字_构造方法

一、封装:

  1. private关键字的特点:
    被private修饰的成员变量/成员方法,都只能在本类中访问;
    外界类不能直接访问,但是可以通过公共方法间接访问
举例1class Code{

	//成员变量
	int num = 20 ;
	
	//私有成员变量
	private int num2 = 30 ;
	
	//定义一个method方法:公共的
	public void method(){
		System.out.println(num) ;
		System.out.println(num2) ;
	}
	
	//私有的成员方法
	private void function(){
		System.out.println("function code...") ;
	}
	
	public void show(){
		System.out.println("show code...");
		function() ;
	}
	
}

//测试类
class privateDemo{
	public static void main(String[] args){
		//要访问Code类中num和num2
		Code code = new Code() ;
		System.out.println(code.num) ;
		//System.out.println(code.num2) ;//num2 在 Code 中是 private 访问控制
		code.method() ;
		System.out.println("--------------") ;
		//code.function() ;// function() 在 Code 中是 private 访问控制
		code.show() ;
	}
}
举例2/*
	需求:
		将昨天手机类:品牌(brand),价格(price),颜色(color),手机内存(memory)
		行为:打电话,发短信
		
		将属性全部私有化,提供对外的公共访问方法,测试!
*/
//定义一个手机类
class Phone{
	//属性私有化
	private String brand ;//品牌
	private int price ; //价格
	private String color ;//颜色
	private int memory ; //手机内存
	
	//成员方法
	//setXXX(xxx xx)
	//给品牌赋值
	public void setBrand(String b){
		brand = b ;
		
	}
	
	//给价格赋值
	public void setPrice(int p){
		price = p ;
	}
	
	//给颜色赋值
	public void setColor(String c){
		color = c ;
	}
	
	//给手机内存赋值
	public void setMemory(int m){
		memory = m ;
	}
	
	//获取品牌
	public String getBrand(){
		return brand ;
	}
	//获取价格
	public int getPrice(){
		return price ;
	}
	//获取颜色
	public String getColor(){
		return color ;
	}
	//获取手机内存
	public int getMemory(){
		return memory ;
	}
	
	//打电话,发短信
	public void callPhone(){
		System.out.println("手机可以打电话") ;
	}
	
	public void sendMessage(){
		System.out.println("手机可以发短信...") ;
	}
}

//手机类的测试类
class PhoneTest{

	public static void main(String[] args){
		//测试
		//创建一个手机类对象
		Phone p = new Phone() ;
		p.setBrand("华为 mate30") ;
		p.setPrice(4999) ;
		p.setColor("天空灰") ;
		p.setMemory(32) ;
		
		//获取内容
		System.out.println("手机的品牌是"+p.getBrand()+
		",价格式:"+p.getPrice()+",机身颜色是:"+p.getColor()+",它的内存大小为:"+p.getMemory()) ;
		p.callPhone();
		p.sendMessage() ;
	}

}
举例3/*
	需求:
		学生事物,有姓名和年龄两个属性
		行为:学习
		
	定义一个学生类,描述学生的基本想信息	
	
	
		按照上面的需求:给学生的年龄赋值一个负数,依然可以输出 ,属于非法数据!
		如何改进这个程序?
			提供一个功能setAge(int num):判断学生的年龄
					如果年龄<0或者年龄>150,都是属于非法数据,提示一下!
					如果年龄在正常范围内:将值赋值给age
					
			setAge(int num):是定义在Student类中还是定义在测试类中?
				测试类目的:主要测试学生类的功能,不应该出现其他功能
				将setAge(int num)定义在学生类中
				
				定义这个功能,可以使用,也可以不使用!
				
					当前的这个学生类的属性任何情况都是可以访问,给年龄一个负数,这个写法不安全
					
	Java提供了一个关键字:private 
封装:
		将一个事物的属性,私有化(对外进行隐藏),外界不能直接访问(保证了数据安全性),需要提供对外的
公共访问来访问成员变量!		

		private:
				私有的,外界无法访问的,只能在本类中访问
		
*/
class Student{
	String name ; //姓名
	private int age ; // 年龄
	
	//学习
	public void study(){
		System.out.println("学习JavaSE...") ;
	}
	
	//判断学生的年龄
	public void setAge(int num){
		if(num < 0 || num > 150){
			System.out.println("学生的年龄非法!") ;
		}else{
			 age = num ; 
		}
	}
	//公共方法
	public void show(){
		System.out.println(name+"---"+age) ;
	}
	
	
}

//学生类的测试类
class StudentDemo{
	public static void main(String[] args){
		//创建一个具体事物
		//类名 对象名 = new 类名() ;
		Student s = new Student() ;
		//给成员变量赋值
		//s.name = "高圆圆" ;
		//s.age = 30 ;
		//System.out.println(s.name+"---"+s.age) ;
		//System.out.println("-------------------------") ;
		
		//继续赋值
		//s.name = "赵又廷" ;
		//s.age = -32 ;
		//System.out.println(s.name+"--- "+s.age) ;
		
		//s.name = "赵又廷" ;
		//s.setAge(-32) ;
		//s.age = -32 ;
		//
		
		s.name = "高圆圆" ;
		//s.age = 41 ;
		s.show() ;
	}
}
举例4/*
	将学生类进行改造
		将name,age属性私有化
		只能在本类访问,外界要访问,需要通过公共方法访问
		  赋值/获取值  setxxx()getxxx() (成员方法)
*/

//定义一个学生类
class Student{
	//成员变量:name,age 私有化
	private String name ;
	private int age ;
	
	
	//提供对外的公共访问方法: 去掉static
	//给学生姓名赋值
	public void setName(String n){ //"高圆圆"
		name = n ;
	}
	//给学生年龄赋值
	public void setAge(int a){ // 30
	
		age = a ;
	}
	
	//获取学生的姓名
	public String getName(){
		return name ;
	}
	
	//获取学生的年龄
	public int getAge(){
		return age ;
	}
	
	//成员方法:学习
	public void study(){
		System.out.println("学习JavaSE_面向对象部分") ;
	}
}

//测试类
class StudentTest{
	public static void main(String[] args){
		//创建一个学生类对象
		Student s = new Student() ;
		System.out.println(s.getName()+"---"+s.getAge()) ;
		
		//s.name = "高圆圆" ;
		//s.age = 30 ;
		//公共访问:setXXX()赋值
		s.setName("高圆圆") ;
		s.setAge(30) ;
		//公共访问方法:setXXX()获取值
		System.out.println(s.getName()+"---"+s.getAge()) ;
	}
}

二、this关键字:代表了当前类的对象的地址值的引用!

this关键字图解

举例:
/*
	
	需求:定义学生类
			姓名,和年龄两个属性,属性私有化,提供公共访问方法赋值/获取值
			吃,睡,学习,玩游戏

	按照上面写完之后,
		set方法赋值的时候,局部变量n,a:不能满足 ("标识符的规则":见名知意)
		
		将n,a---->name,age
		
		给学生姓名赋值:
			public void setName(String name) ;

				name = name ;
			}
			
			局部变量和成员变量都叫name,如何区分呢? 这个时候Java提供了一个关键字:this
	局部变量隐藏了成员变量,使用this关键字来区分

this:代表了当前类的对象的地址值的引用!	
			
*/

class Student{
	private String name ;
	private int age ;
	
	//setXXX(xxx)方法
	//public void setName(String n){
	public void setName(String name){
		//name = n ; 
		//name = name ;
		this.name = name ;  //区分了成员变量和局部变量
	}
	/*
	public void setAge(int a){
		age = a ;
	}
	*/
	public void setAge(int age){
		//age = age ;
		this.age = age ;
	}
	
	//getXXX()
	public String getName(){
		return name ;
	}
	
	public int getAge(){
		return age ;
	}
	
	//eat
	public void eat(){
		System.out.println("学习饿了,就需要吃饭...") ;
	}
	
	public void sleep(){
		System.out.println("学习困了,就需要休息") ;
	}
	
	public void study(){
		System.out.println("学习JavaEE...") ;
	}
}

//测试类
class StudentTest{
	public static void main(String[] args){
		//创建学生类对象
		Student s = new Student() ;
		s.setName("高圆圆") ;
		s.setAge(30) ;
		System.out.println(s.getName()+"---"+s.getAge()) ;
		s.eat() ; 
		s.sleep() ;
		s.study() ;
	}
}

三、构造方法:

  1. 构造方法是一个方法,特殊的方法
    1)方法名和类名一致!
    2)没有具体返回值类型
    3)连void都没有
  2. 格式:
    权限修饰符(public:目前使用居多) + 类名(xx){}
//老师类
class Teacher{
	
	//定义构造方法:无参的构造方法
	public Teacher(){
		System.out.println("这是Teacher类的无参构造方法...");
	}
	
	//teach
	public void teach(){
		System.out.println("老师讲解JavaEE...") ;
	}
}

//测试类
class ConstructorDemo{
	public static void main(String[] args){
		
		//创建Teacher类对象
		Teacher t = new Teacher() ;
		t.teach() ;
	}
}
  1. 构造方法的分类:
    无参构造方法
    有参构造方法
    构造方法作用:
    就是为了 给类中的成员变量进行数据的初始化!(构造方法初始化!)

    构造方法是可以重载的;

  2. 注意事项:
    当前我们定义一个类的时候,没有提供任何构造方法,那么系统会默认无参构造方法;
    但是,如果我们提供一个有参构造方法,系统不会在提供无参构造方法!(建议永远给出无参构造方法)
    一个类的组成:
    1). 成员变量
    2).加入构造方法
    无参
    有参构造方法
    3).成员方法

//学生类
class Student{
	//属性私有化
	private String name ;//姓名
	private int age ;//年龄
	
	//无参构造方法
	public Student(){
		System.out.println("这是Student类的无参构造方法") ;
	}
	
	//带一个参数的构造方法:String类型的参数
	public Student(String name){
		System.out.println("这是Student类带一个String类型的构有参构造方法...") ;
	}
	
	//带一个int类型构造方法
	public Student(int age){
		System.out.println("这是Student类带一个int类型的构有参构造方法...") ;
	}
	
	//带两个参数的有参构造
	public Student(String name,int age){
		System.out.println("这是Student类的带两个参数的有参构造方法...") ;
	}
		
}
//测试类
class ConstructorDemo2{
	public static void main(String[] args){
		//创建第一个学生类对象
		Student s = new Student() ;
		System.out.println("---------------------") ;
		//s2
		Student s2 = new Student("高圆圆") ;
		System.out.println("---------------------") ;
		//s3
		Student s3 = new Student(41) ;
		System.out.println("---------------------") ;
		Student s4 = new Student("赵又廷",38) ;
		//Student s5 = new Student(38,"赵又廷") ;
	}
}
  1. 一个标准类的写法(正式写法)

    需求:定义学生类
    姓名,和年龄两个属性,属性私有化,提供公共访问方法赋值/获取值
    吃,睡,学习,玩游戏

    定义学生类,加入新的成员:构造方法
    成员变量:属性私有化:name,age
    构造方法:
    无参构造/有参构造方法
    成员方法:setXXX()/getXXX(),吃,睡,学习,玩游戏

    给类的成员变量赋值有几种方式:
    1)setXXX(xxx) :公共方法赋值
    2)类的有参构造方法直接赋值;

    改造手机类:加入新的成员:构造方法(Constructor)

举例1class Student{

	//属性私有化
	private String name ; //姓名
	private int age ; //年龄
	
	//无参构造方法(永远给出)
	public Student(){
		
	}
	
	//有参构造方法
	public Student(String name,int age){//"张佳宁",30
		this.name = name ;
		this.age = age ;
	}
	
	//提供成员方法
	//setXXX()getXXX()
	public void setName(String name){
		this.name = name ;
	}
	public String getName(){
		return name ;  //隐藏 : return this.name ;  将this省略了
	}
	
	public void setAge(int age){
		this.age = age ;
	}
	
	public int getAge(){
		return age ;
	}
	
	//提供其他成员方法
	public String study(String className){
		return "正在学习"+className;
	}
	
	public void playGame(){
		System.out.println("学生可以玩游戏...") ;
	}
}

//测试类
class Test{
	public static void main(String[] args){
		//方式1:无参构造方法+setXXX() +getXXX()
		Student s = new Student() ;
		s.setName("高圆圆") ;
		s.setAge(41) ;
		System.out.println("学生的姓名是"+s.getName()+",年龄是:"+s.getAge()) ;
		String result = s.study("JavaEE") ;
		System.out.println(result) ;
		s.playGame() ;
		
		System.out.println("----------------------------------") ;
		
		//方式2:有参构造方法+getXXX()
		Student s2 = new Student("张佳宁",30) ;
		System.out.println("学生的姓名是"+s2.getName()+",年龄是:"+s2.getAge()) ;
		String result2 = s2.study("Python") ;
		System.out.println(result2) ;
		s2.playGame() ;
	}
}
举例2//定义一个手机类
class Phone{
	//属性私有化
	private String brand ;
	private int price ;
	private String color ;
	private int memory ; 
	
	//无参构造方法
	public Phone(){}
	
	//有参构造方法
	public Phone(String brand,int price,String color,int memory){
		this.brand = brand ;
		this.price = price ;
		this.color = color ;
		this.memory = memory ;
	}
	
	//set方法
	public void setBrand(String brand){
		this.brand = brand ;
	}
	public String getBrand(){
		return brand ;
	}
	
	public void setPrice(int price){
		this.price = price ;
	}
	public int getPrice(){
		return price ;
	}
	
	public void setColor(String color){
		this.color = color ;
	}
	
	public String getColor(){
		return color ;
	}
	
	public void setMemory(int memory){
		this.memory = memory ;
	}
	
	public int getMemory(){
		return memory ;
	}
	
	public void callPhone(String callTo){
		System.out.println("可以给"+callTo+"打电话") ;
	}
	
	public void playGame(String gameName){
		System.out.println("可以玩"+gameName) ;
	}
}

//测试
class Test2{
	public static void main(String[] args){
		//方式1:无参+setxxx()/getxxx()
		Phone p = new Phone() ;
		p.setBrand("apple") ;
		p.setPrice(4599) ;
		p.setColor("土豪金") ;
		p.setMemory(16) ;
		
		System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor()+"---"+p.getMemory())  ;
		p.callPhone("高圆圆") ;
		p.playGame("王者农药") ;
		
		System.out.println("-------------") ;
		
		//方式2:有参构造+getxxx()
		Phone p2 = new Phone("华为",6799,"翡翠绿",32) ;
		System.out.println(p2.getBrand()+"---"+p2.getPrice()+"---"+p2.getColor()+"---"+p2.getMemory())  ;
		p2.callPhone("高圆圆") ;
		p2.playGame("王者农药") ;
		
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

igfff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值