一、算法练习
给你一个整数 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("-----------------------完成-----------------------");
}
}