Java学习——23-5-19,

文章介绍了如何判断一个整数是否为回文数的算法,并探讨了面向对象编程中的封装特性。通过一个示例展示了如何使用封装限制类内部数据的直接访问,以及如何通过公共接口(getter和setter方法)进行安全的数据操作。同时,文章强调了封装在实现高内聚、低耦合原则中的重要性,并提供了几个练习来巩固这些概念。
摘要由CSDN通过智能技术生成

一、算法练习

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。
输入:x = 121
输出:true
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

 

bool isPalindrome(int x){        
    int flag=x;
    int m=0;
    long int res = 0;
    while (x>0){
        m=x%10;  //读取个位数值
        x /=10;  //删除个位数值
        res= res*10+m;
    }
    if(res ==flag)
    return true;
    else return false;
}

 解题思路 定义一个flag用来接受最初x的值(因为x的值经过循环体会改变) 创建一个while循环,每循环一次 m用来获取x的个位数 x的个位被消除 res用来计算最终值,定义为长整型(测试数据可能太大,int存放不下) 当x等于0时,退出循环 if判断语句判断res和flag是否相等

二、面向对象的特征之一:封装性

面向对象的特征:封装、继承、多态;

为什么需要封装性?
类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚,低耦合”

高内聚、低耦合是软件工程中的概念,也是UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;
耦合指一个软件结构内不同模块之间互连程度的度量。
内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身。


而“高内聚,低耦合”的体现之一:
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉,
低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用
 

通俗的说:把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想
 

2.如何实现数据封装?
    2.1权限修饰,分别:private 、缺省、protected、public

    2.2作用:可以使用四种权限修饰类及类的内部成员,这些成员或类被调用时的可见性大小。
案例示例:

public  class AnimalTest {
    public static void main(String[] args){
        Animal animal1= new Animal();
            animal1.name = "金蟾";
          animal1.setlegs(2);
         // System.out.println(legs);//因为Animal类中legs的权限修饰符为private私有的;
        System.out.println("name:"+animal1.name+"\nlegs:"+animal1.getintln());
        animal1.eat();
    }

    public static class Animal{//动物
        //属性
        String name;//名字
        //在类的内部可以调用私有的,出了Animal就看不见了
        //可以通过setlegs方法间接调用
        private int legs;//腿的个数,

        public void setlegs(int l){
            if(l >= 0 && l % 2 == 0){
                legs = l;
            }else{
                System.out.println("你的数据非法");
            }
        }
        //获取legs的属性值
        public int getintln(){
            return legs;
        }
        public void eat(){
            System.out.println("动物觅食");
        }
    }
}


在案例中给Animal的对象的Legs属性赋值。在实际的常识中,我们知道Legs不能赋值为负数的。但是如果直接调用属性Legs,是不能加入判断逻辑的。那怎么办呢?
将Legs属性私有化(private),禁止在Animal类的外部直接调用此属性。
提供给Legs属性赋值的setLegs()方法,在此方法中加入Legs赋值的判断逻辑f(legs =  && Legs % 2 ==0)V将此方法暴露出去,使得在Animal类的外部调用此方法,对Legs属性赋值。
提供给Legs属性获取的getLegs()方法,此方法对外暴露。使得在Animal类的外部还可以调用此属性的值.


修饰符从小到大public、protected 、缺省 、private。

具体修饰的结构:
。外部类: public、缺省
。成员变量、成员方法、构造器、成员内部类: public、protected、缺省、private


2.4  4种权限的具体使用
其中外部类:可以使用public、缺省;
类的内部成员:可以使用4种权限进行修饰。

2.5开发中四种权限使用频率情况:
比较高:public,private
比较低:缺省、protected

3.封装的体现
场景1:私有化类的属性,提供公开(public)的get和set方法,,对此属性进行获取或修改
场景2:将类中不需要对外暴露的方法,设置为private。  
场景3:单例模式中构造器private的了,避免在类的外部创建实例。(在static关键字后讲)

封装性练习:
练习一:
创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAne()返回人的年龄。在PersonTest类中实例化Person类的对象b,调用setAqe()和getAge()方法,体会Java的封装性

public class Person {
    private int age;//设置了private私有的,类外无法调用。

    //设置age属性
    public void setAge(int a){
        if(a>=0&&a<=130){
            age = a;
        }else{
            System.out.println("你输入的年龄不合法");
        }
    }

    //获取age属性
    public int getAge(){
        return age;
    }

public class PersonTest {
    public static void main(String[] args){
        //创建Person实例1
        Person p1=new Person();
        //p1.age = 10;//编译不通过;被设置了private
        //System.out.println(p1.age);

        p1.setAge(20);//通过调用setAge();方法来修改Person中的age
        System.out.println(p1.getAge());//通过调用getAge()来获取age;

    }
}
练习二:
案例:自定义图书类设定属性包括书名bookName,作者author,价格price;
方法包括相应属性的get/set方法图书信息介绍等。


public class Book {
    private String bookName;//书名
    private String author;//作者
    private double price;//价格

    //方法
    public String getBookName(){
        return bookName;
    }
    public void setBookName(String s){
        bookName = s;
    }
    public String getAuthor(){
        return author;
    }
    public void setAuthor(String s){
        author = s;
    }
    public double getPrice(){
        return price;
    }
    public void setPrice(int x){
        if(x>=0){
            price = x;
        }else{
            System.out.println("你的输入非法");
        }
    }

}

public class BookTest {
    public static void main(String[] args){
        //创建实例对象
        Book p1 = new Book();

        // p1.bookName ="java从入门到精通";
        //Book所有的属性的权限修饰符都使用了private私有化了必须调用相关函数来编写
        p1.setBookName("java从入门到精通");
        p1.setAuthor("桂锦超");
        p1.setPrice(120);

        System.out.println("书名:"+p1.getBookName()+"\n作者:"+p1.getAuthor()+"\n价格:"+p1.getPrice());

    }
}

练习三
声明员工类Employee,
包含属性:姓名、性别、年龄、电话,属性私有化
提供get/set方法
提供String getInfo()方法  新建数组

public class Employee {
    //员工属性
    private String name;//姓名
    private char gender;//性别
    private int age;//年龄
    private String phoneNUmber;//电话号码

    //方法
    public void setName(String x){
        name = x;
    }
    public String getName(){
        return name;
    }
    public void setGender(char x){
        gender = x;
    }
    public char getGender(){
        return gender;
    }
    public void setAge(int x){
        if(x>=0){
            age = x;
        }else{
            System.out.println("你输入的数据非法");
        }
    }
    public int getAge(){
        return age;
    }
    public void setPhoneNUmber(String x){
        phoneNUmber = x;
    }

    public String getPhoneNUmber() {
        return phoneNUmber;
    }
    public String getInfo(){
        return getName()+"\t"+getGender() + "\t" + getAge() +"\t" +getPhoneNUmber();
    }

}

package er;

import java.util.Scanner;

public class EmployeeTest {
    public static void main(String[] args) {
        //创建对象
        Scanner scan = new Scanner(System.in);


        //创建Employee[]
        Employee[] emps = new Employee[2];

        for (int i = 0; i < emps.length; i++) {
            emps[i] = new Employee();

            System.out.println("-------------------添加第" + (i + 1) + "名员工-------------------");
            System.out.print("姓名:");
            String name = scan.next();
            System.out.print("性别:");
            char gender = scan.next().charAt(0);
            System.out.print("年龄:");
            int age = scan.nextInt();
            System.out.print("电话:");
            String phoneNumber = scan.next();

            //给指定的employee对象的各属性赋值
            emps[i].setName(name);
            emps[i].setGender(gender);
            emps[i].setAge(age);
            emps[i].setPhoneNUmber(phoneNumber);

        }
        //遍历员工列表
        System.out.println("---------------------员工列表---------------------");
        System.out.println("编号\t姓名\t性别\t年龄\t电话");
        for(int i=0;i< emps.length;i++){
            System.out.println((i+1)+"\t"+emps[i].getInfo());
        }
        System.out.println("-----------------------完成-----------------------");
    }
}
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值