》为什么使用面向对象
现实世界就是“面向对象的”。任何存在的事物都可以看作“对象”。
面向对象就是采用“现实模拟”的方法设计和开发程序。面向对象技术利用“面向对象的思想”去描述“面向对象的世界”,实现了虚拟世界和显示世界的一致性,符合人们的思维习惯,使客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅,同时代码重用性高。可靠性高等优点,大大提高了软甲尤其实大型软件的设计个开发效率。
》面向对象的基本步骤
面象对象设计的过程就是抽象过程,分以下三步来完成。
》第一步:发现类
》第二步:发现类的属性
》第三步:发现类的方法
》创建类和对象
》宠物狗狗类
public class Dog {
String name="无名氏"; //昵称,默认值是“无名氏”
int health = 100; //健康值,默认为100
int love = 0; //亲密度
String strain="聪明的拉布拉多犬";
public void print(){
System.out.println("宠物的自白:\n我的名字"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我是一只"+this.strain+"。");
}
}
》宠物企鹅类
public class Penguin {
String name="无名氏"; //昵称,默认值是“无名氏”
int health = 100; //健康值,默认为100
int love = 0; //亲密度
String sex="Q仔";
public void print(){
System.out.println("宠物的自白:\n我的名字"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",性别是"+this.sex+"。");
}
}
》测试类:
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("欢迎您来到宠物店!");
System.out.println("请输入要领养的宠物的名字:");
String name = input.next();
System.out.println("请选择要领养的的类型:(1.狗狗 2.企鹅)");
int num = input.nextInt();
switch(num){
case 1 :
System.out.println("请选择狗狗的品种:(1.聪明的拉拉布拉多犬 2.酷酷的雪纳瑞犬)");
String strain= input.next();
if(input.nextInt()==1){
strain = "聪明的拉拉布拉多犬";
}else{
strain = "酷酷的雪纳瑞犬";
}
Dog dog=new Dog();
dog.name=name;
dog.strain=strain;
dog.print();
break;
case 2 :
System.out.println("请选择企鹅的性别:(1.Q仔 2.Q妹)");
String sex=input.next();
if(sex.equals("1")){
sex="Q仔";
}else{
sex="Q妹";
}
Penguin pgn = new Penguin();
pgn.name=name;
pgn.sex=sex;
pgn.print();
break;
}
}
}
》构造方法及重载
Java 可以通过无参或带参数的构造方法完成赋值的初识化工作。
》无参构造
public class Dog {
String name="无名氏"; //昵称,默认值是“无名氏”
int health = 100; //健康值,默认为100
int love = 0; //亲密度
String strain="聪明的拉布拉多犬";
//无参构造
public Dog(){
name="楠楠";
love=20;
System.out.println("执行构造方法");
}
public void print(){
System.out.println("宠物的自白:\n我的名字"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",我是一只"+this.strain+"。");
}
}
测试:
public static void main(String[] args) {
Dog dog =new Dog();
}
在创建Dog对象的时候就执行了Dog 类的构造方法。
构造方法是一个特殊的方法,当类中没有构造方法时,系统会提供一个空的构造方法
》带参构造
public class Penguin {
String name="无名氏"; //昵称,默认值是“无名氏”
int health = 100; //健康值,默认为100
int love = 0; //亲密度
String sex="Q仔";
public Penguin(){
name="楠楠";
love=20;
sex="Q仔";
System.out.println("执行构造方法");
}
//两个参数的构造方法
public Penguin(String name,String sex){
this.name=name;
this.sex=sex;
}
//四个参数的构造方法
public Penguin(String name,int health,int love ,String sex){
this.name=name;
this.health=health;
this.love=love;
this.sex=sex;
}
public void print(){
System.out.println("宠物的自白:\n我的名字"+this.name+",健康值是"+this.health+",和主人的亲密度是"+this.love+",性别是"+this.sex+"。");
}
}
在同一个类里面方法名相同,参数列表(方法参数的个数或参数类型)不同,称之为 方法重载 方法重载与方法返回值和方法修饰符没有任何关系。
测试:
public static void main(String[] args) {
Penguin png=null;
png = new Penguin();
png.print();
png = new Penguin("亚亚","企鹅");
png.print();
png = new Penguin("美美",80,20,"Q仔");
png.print();
}
结果:
》封装
封装是面向对象三大特征之一(另外两个是继承和多态),它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的信息,而是通过该类所提供的方法来实现对内部的操作和访问。
对一个类或 对象实现良好的封装,可以实现以下目的:
》隐藏类的实现细节。
》让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
》可以进行数据检查,从而有利于保证对象信息的完整性。
》便于修改,提高代码的维护性
为了实现良好的封装,需要从两个方面考虑:
》将对象的属性和实现细节隐藏起来,不允许外部直接访问。
》把方法暴露出来,让方法来操作这些属性。
因此封装有两个含义:把该隐藏的隐藏起来,把该暴露出来的暴露出来。这两个方面都需要通过使用Java提供的访问修饰符来实现
》private (当前类访问权限):如果类里的一个成员(包括属性和方法)使用 private 访问控制符来修饰,则这个成员只能在该类的内部被使用。很显然,这个访问控制符用于修饰属性最合适不过,使用它来修饰属性就可以把属性隐藏在类的内部。
》default (包访问权限) :如果类里的一个成员(包括属性和方法)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限的,default 访问控制的成员或外部类可以被相同包下的其它类访问
》protected (子类访问权限):如果 一个成员 (包括属性和方法)使用 priotected访问控制符修饰,那么这个成员既可以被同一个包中的其类法问 ,也可以被不同包中的子类访问。通常情况下,如果使用 protected 来修饰一个方法,通常是希望其子类来重写·这个方法。
》public (公共访问权限):这是一个宽松的访问控制级别,如果一个成员(包括属性和方法)或一个顶级类使用了 public 修饰,这个成员或顶级类就可以 被所有类访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。
通过上面关于访问控制符的介绍不难发现,访问控制符用于控制一个类的成员是否可以被其它类访问,对于局部变量而言,其作用域就是它所在的方法,不可能被其它类访问,因此不能使用访问控制符来修饰。
对于外部类而言,他也可以使用访问控制符修饰,但外部类只能有两种访问控制级别:public 和 默认,外部类不能使用 private和 protected 修饰,因为外部类没有处于任何类的内部,也就没有其所在类的内部、所在类的子类两个范围,因此private 和 protected 访问控制符对外部类没有意义。
外部类可以使用 public 和包访问控制权限,使用 public 修饰的外部类可以被所有类使用,如声明变量、创建实例;不使用任何访问控制符修饰的外部类只能被同一个包中的其它类使用。
》定义学生(Student)类,来实现封装
public class Student {
//使用 private 修饰成员变量,将这些成员变量隐藏起来
private String name;
private int age;
public String getName() {
return name;
}
//提供方法来操作 name 成员变量
public void setName(String name) {
if(name.length()<2 || name.length() > 6){
System.out.println("您设置的人名不符合要求");
return;
}else{
this.name = name;
}
}
public int getAge() {
return age;
}
//提供方法来操作 age 成员变量
public void setAge(int age) {
if(age>100||age<0){
System.out.println("您设置的年龄不合法");
return;
}else{
this.age = age;
}
}
}
该类的 name 和 age 两个成员变量只有在 Student 类内部才可以操作和访问,在 Student 类之外只能通过各自对应的 setter 和 getter 方法来操作和访问它们。
public class MyTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Student stu = new Student(); //创建学生对象
System.out.println("请输入姓名:");
String name=input.next();
System.out.println("请输入年龄:");
int age=input.nextInt();
System.out.println();
stu.setName(name);
stu.setAge(age);
System.out.println("我的叫:"+stu.getName()+"\t年龄:"+stu.getAge());
}
}