首页 > 编程语言 >java封装、this关键字

java封装、this关键字

时间:2023-08-26 10:02:48浏览次数:39  
标签:封装 String int void System 关键字 println java public

一,封装

1,概述

-指的就是把对象的属性细节隐藏起来,外部通过共有的方式来访问。

2,好处

-提高了代码复用性

-提高了安全性

3,原则

-把不需要对外提供的内容都隐藏起来,根据需求提供对应的共有的访问方式。

package com.momo.demo;

/*

  • 我们在使用这个案例的过程中,发现了问题:
  • 通过对象给成员变量赋值的时候,可以赋值一些非法数据,这不合理
  • 应该是在夫之前,先对数据进行判断,符合要求才能赋值。
  • 需要判断,判断要写在哪里?
  • 经过简单分析判断要写在 Stu类中。
  • 在成员变量位置不能直接判断,因为判断需要一些逻辑语句,
  • 逻辑语句应该在方法中,所以我们应该在Stu类中提供判断方法来验证数据
  • 提供了验证方法后,通过方法赋值,就可以避免非法数据。
  • 但是,我依然可以不使用方法来赋值,依然可以赋值非法数据。
  • 这样我们的方法就起不到作用。
  • 应该是,强制要求必须使用方法来赋值。
  • 如何强制要求必须使用方法赋值?
  • 为了实现这样的效果,java给我们提供了一个关键字 private
  • private:私有的,可以修饰成员变量和成员方法
  • 特点:被private修饰的成员只能在本类中直接访问。

  • 上面所讲的内容就是一个封装思想。
  • 封装:指的就是把对象的属性细节隐藏起来,对外提供共有的访问方式。
  • */

//测试类,作用:创建对象,调用方法,进行测试

public class Demo1 {

public static void main(String[] args) {

Stu stu = new Stu();

stu.name = "钢弹";

// stu.age = 11;

// stu.age = 1111;//数据不合理

//stu.gender = "男";

// stu.gender = "鬼";//不符合现实,不合理

//stu.setAge(1111);

//stu.setGender("仙人");

stu.setAge(22);

stu.setGender("男");

stu.show();

//stu.study();

}

}

class Stu{

String name;

//int age;

//String gender;

private int age;

private String gender;

//判断数据的方法,符合要求的时候在赋值 public void setAge(int a){ if(a>=0&&a<=150){ age = a; }else{ System.out.println("数据不合法。。。"); } } public void setGender(String g){ if(g.equals("男")||g.equals("女")){ gender = g; }else{ System.out.println("数据不合法"); } } public void study(){ System.out.println("学习。。。"); } public void show(){ System.out.println("我叫:"+name+",今年:"+age+"岁,性别:"+gender); }

}

4,private关键字

-是一个权限修饰符

-可以修饰成员变量和成员方法

-被private修饰的内容只能在本类中直接访问

-常见用法:

把成员变量用private修饰

提供对应的get和set方法

-标准的private应用案例

package com.momo.demo;

public class Demo2 {

public static void main(String[] args) {

Aaa a = new Aaa();

System.out.println(a.a);

//System.out.println(a.b); b 在 com.momo.demo.Aaa 中是 private 访问控制

a.show();

// a.fun();在 com.momo.demo.Aaa 中是 private 访问控制

a.method();

}

}

class Aaa{

int a = 5;

private int b = 6;

public void show(){ System.out.println(b); System.out.println("aaa"); } private void fun(){ System.out.println("fun...."); } public void method(){ fun(); }

}

package com.momo.demo;

public class Demo3 {

public static void main(String[] args) {

Student s = new Student();

s.setName("默默");

s.setAge(11);

s.setGender("男");

System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getGender()); }

}

class Student{

private String name;

private int age;

private String gender;

public String getName() { return name; } public void setName(String n) { name = n; } public int getAge() { return age; } public void setAge(int a) { age = a; } public String getGender() { return gender; } public void setGender(String g) { gender = g; }

}

5,this关键字

package com.momo.demo;

/*

  • 我们说过要见名知意,如果做到见名知意后,局部变量名和成员变量名就一样了
  • 但是会导致值付不上,因为当名字一样时,在方法中默认采用就近原则。
  • 为了解决这个问题,java就提供了关键字 this
  • 通过this区分成员变量和局部变量
  • this:表示当前对象的引用,它表示当前调用方法的对象,哪个对象调用这个方法
  • 这个方法中的this就表示那个对象,不是固定的。

  • this的其他用法后面和super一样讲
  • */

public class Demo3 {

public static void main(String[] args) {

Student s = new Student();

s.setName("默默");

s.setAge(11);

s.setGender("男");

System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getGender()); Student s2 = new Student(); s2.setName("默默2"); s2.setAge(112); s2.setGender("男2");

}

}

//标准代码的改进版,加入this

class Student{

private String name;

private int age;

private String gender;

public String getName() { return name; } public void setName(String name) { //String name = "默默"; //name = name; 自己又赋值给了自己 this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }

}

-练习:定义各种类,练习标准代码写法,创建对象测试

6,构造方法

package com.momo.demo;

public class Demo4 {

public static void main(String[] args) {

/*

* 我们说过只有方法才有(),而我们在创建对象的时候,格式中

* 也有一个(),说明创建对象的时候其实调用了一个方法

* 但是我们在定义类的时候没有定义过这样的方法,

* 这个方法哪里来的?是什么?

* 这个方法其实就是构造方法。

* 作用:给对象的数据进行构造初始化的

* 构造方法的格式:

* 方法名和类名相同,

* 没有返回值类型,连void都没有

* 也没有具体的返回值

* 构造方法也可以重载

* 注意事项:

* 如果我们定义类的时候没有定义构造方法,那么系统

* 会自动提供一个无参构造方法

* 如果我们定义类的时候定义了构造方法,系统就不会提供默认的

* 无参构造方法

* */

Tea t = new Tea();

}

}

class Tea{

public Tea(){}

private String name;

private int age;

private String gender;

public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }

}


package com.momo.demo;

public class Demo4 {

public static void main(String[] args) {

/*

* 我们说过只有方法才有(),而我们在创建对象的时候,格式中

* 也有一个(),说明创建对象的时候其实调用了一个方法

* 但是我们在定义类的时候没有定义过这样的方法,

* 这个方法哪里来的?是什么?

* 这个方法其实就是构造方法。

* 作用:给对象的数据进行构造初始化的

* 构造方法的格式:

* 方法名和类名相同,

* 没有返回值类型,连void都没有

* 也没有具体的返回值

* 构造方法也可以重载

* 注意事项:

* 如果我们定义类的时候没有定义构造方法,那么系统

* 会自动提供一个无参构造方法

* 如果我们定义类的时候定义了构造方法,系统就不会提供默认的

* 无参构造方法

* */

//无参+set

Tea t = new Tea();

t.setName("aa");

t.setAge(11);

t.setGender("ad");

System.out.println(t.getName());

System.out.println(t.getAge());

System.out.println(t.getGender());

/* Tea t2 = new Tea(33); System.out.println(t2);

//

System.out.println(t3);/System.out.println("---------------------------");//带参构造Tea t3 = new Tea("aaa",11,"nan");System.out.println(t3.getName());System.out.println(t3.getAge());System.out.println(t3.getGender());}}-给成员变量赋值的2种方式无参构造+set方法带参构造class Tea{public Tea(){System.out.println("无参构造");}/

System.out.println("带name的构造");

}//

System.out.println("带age的构造");

}//

System.out.println("带name,age的构造");

}

*/

public Tea(String name,int age,String gender){

this.name = name;

this.age = age;

this.gender = gender;

System.out.println("带name,age,gender的构造");

}

private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; }

}

7,类的组成

-成员变量

-成员方法

-构造方法

package com.momo.demo;

/*

  • 标准类的写法
  • 无参,带参
  • 私有成员变量
  • 共有的get和set方法
  • */

public class Demo5 {

public static void main(String[] args) {

//无参+set

Phone p1 = new Phone();

p1.setBrand("dsf");

p1.setPrice(111);

p1.show();

System.out.println("----------");

//带参

Phone p2 = new Phone("dff",111);

p2.show();

}

}

class Phone{

private String brand;

private int price;

public Phone() { } public Phone(String brand, int price) { this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public void show(){ System.out.println(brand+","+price); }

}

-多练习标准类的写法即可

8,类的初始化过程

  • Phone p1 = new Phone(); 在内存中都干了什么事情?

加载 Phone.class 文件进内存

在栈内存中给p1开辟空间

在堆内存中给Phone类型对象开辟空间

对对象的成员变量进行 默认初始化

对对象的成员变量进行 显示初始化

对对象的成员变量进行 构造初始化

对象初始化完成,把对象地址值赋值给变量p1

package com.momo.demo;

/*

  • 标准类的写法
  • 无参,带参
  • 私有成员变量
  • 共有的get和set方法
  • /

public class Demo5 {public static void main(String[] args) {//无参+setPhone p1 = new Phone();/

p1.setPrice(111);*/

p1.show();

System.out.println("----------");

//带参

Phone p2 = new Phone("dff",111);

p2.show();

}

}

class Phone{

// private String brand;

private String brand = "小米";

private int price;

public Phone() { } public Phone(String brand, int price) { this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public void show(){ System.out.println(brand+","+price); }

}

9,变量到底什么时候应该定义为成员变量,什么时候又该定义为局部变量

-如果这个变量是用来描述这个类的信息的,那么这个变量就应该是成员变量

否则就是局部变量

package com.momo.demo;

/*

  • 写一个求和方法(2个int的)
  • 我们讲了面向对象思想,我们就像能不能用面向对象的方式来写这个方法?
  • 我们把方法封装到MyMath类中

  • */

public class Demo6 {

public static void main(String[] args) {

// System.out.println(sum(3,4));

// MyMath mm = new MyMath();

// System.out.println(mm.sum(3, 4));

MyMath mm = new MyMath(); mm.a = 5; mm.b = 6; System.out.println(mm.sum());

}

/* public static int sum(int a,int b){

return a+b;

}*/

}

class MyMath{

//能不能把a和b定义成成员变量?

/public int sum(int a,int b){return a+b;}/

/*

* 这种方式虽然可以,感觉好像也符合面向对象思想,但是这样不好

* 我们说过类是一组相关属性和行为的集合

* 类是通过现实事物转换而来的

* 类中成员变量是描述事物属性的(描述类的信息)

* 类中成员方法是描述事物功能的(描述类的功能)

* 所以这个方法中的a和b,其实不应该定义成成员变量

* */

int a;

int b;

public int sum(){

return a+b;

}

}

-练习:定义一个矩形,提供求周长和面积的方法,进行测试

-练习:定义一个员工类,自己分析成员,按照标准代码编写,进行测试

-练习:定义一个类,提供2个数的加减乘除方法

标签:封装,String,int,void,System,关键字,println,java,public
From: https://blog.51cto.com/u_16230968/7240761

相关文章

  • Java中的泛型概念
    在Java中,泛型是一种强类型检查机制,它允许我们在编译时期指定类、接口或方法的参数和返回值类型。使用泛型可以实现代码的重用性、类型安全性和提高代码的可读性。下面是关于Java泛型的一些重要概念和用法:泛型类(GenericClass):通过在类名后面使用尖括号<T>来声明一个泛型类,在类......
  • Java流程控制switch选择结构
    swich选择结构多选择结构还有一个实现方式,就是swichcase语句swichcase语句判断一个变量与一个系列值中某个值是否相等,每个值称为一个分支swich语句中变量类型可以是byte、short、int、char,从Java7SE开始swich支持字符串String类型,同时case标签必须为字符串常量或者字面......
  • 一维数组java练习
    1、打印下列图形*****************************************图形一:publicclassHomeWork8_24{publicstatic......
  • 变量和数据类型java练习
    1.①packagecom.company;publicclassHomeWork8_19{publicstaticvoidmain(String[]args){Stringname="小明";intage=25;intseniority=3;intage1=5;Stringsubject="java";......
  • 封装和解封装
    图示 封装将数据变为比特流的过程中,在参考模型的每一层需要添加上特定的协议报头动作动作从高层往低层依次封装,在每一层使用特定的协议,对数据进行处理,在数据前添加特定的协议报头。封装原则1:每一层在上一层数据前添加协议报头2:添加完协议报头的整体,就是该层的PDU3:每一层......
  • 选择结构和循环结构java练习
    1、通过键盘输入学生分数并根据成绩定档:0-59分“不及格”,60-69分“及格”,70-79分“中等”,80-89分“良好”,90-100分“优秀”importjava.util.Scanner;publicclassHomeWork8_22{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System......
  • java循环
    packagecom.momo.demo;importjava.util.Scanner;/*注意:做判断的时候不仅要考虑正确数据,边界数据,错误数据*/publicclassDemo1{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("输入成绩:");intscore=sc.nextInt();/*if(......
  • java入门
    java入门1、java语言简介1、java语言优点使用最广泛,且简单易学java是一门强类型语言java是非常完善的异常处理机制java提供了对大数据的基础性的支持2、java语言特点开源:java源代码是开饭的。跨平台:用java编写的代码或程序,可以在不同的操作系统上运行。JV......
  • Java 程序打印 OpenCV 的版本
    我们可以使用Java程序来使用OpenCV。OpenCV的使用需要动态库的加载才可以。  加载动态库到OpenCV的官方网站上下载最新的发布版本。  Windows下载的是一个可执行文件,没关系,这个可执行文件是一个自解压程序。当你运行以后会提示你进行解压。拷贝动态库到W......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......