24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

Java面向对象的基础知识总结

2017-08-20 11:46:59 东方博宜 阅读

1、面向对象基础

类(class):类是对于对象的抽象,类是属性和方法的集合!

           类是一个抽象的概念!

对象:对象是类的实例!

 

注意:静态方法和非静态方法的区别?

非静态方法:表示面向对象的方法,必须是某个对象出现了才能调用的方法,因此通过对象名.方法名来调用,在本类的其它非静态方法中,对象名可以省略!

 

静态方法:表示非面向对象的方法,跟类有关,和对象无关,通过类名.方法名来调用,在本类中,类名可以省略!

 

注意:一个文件中可以有多个类,但只能有一个类是公共的,声明为public的类的类名要和文件名一致!

 


 

例子:构建一个球员类,有姓名、身高、年龄属性,跑、投篮的方法!

/**

 *  定义球员类

 */

public class Person {

 

         //属性

         public String name;

         public double height;

         public int age;

        

         //方法

         public void run(){

                   System.out.println("球员在跑步!");

         }

        

         public void shoot(){

                   System.out.println("球员在投篮!");

         }

}

 

/**

 * 测试类

 */

class Test{

        

         public static void main(String[] args) {

                   //生成类的对象(通过new关键字来创造对象)

                   Person p = new Person();

                   //为球员的属性赋值

                   p.name = "姚明";

                   p.height = 230.0;

                   p.age = 30;

                  

                   //输出属性的值

                   System.out.println(p.name + " " + p.height + " " + p.age);

                  

                   //调用方法

                   p.run();

                   p.shoot();

         }

}

 

 

例子:写一个猫类(Cat),有名字(String name)、颜色(char color)属性,有睡觉(sleep)、展示(show)方法!

写一个测试类,生成一只猫的对象,为这个对象属性赋值为,名字“小喵”,颜色“白”,输出该小喵的各个属性,调用一下小喵的各个方法!

 

 

2、属性和方法之间的互相制约

方法改变属性的值,属性制约方法的运行!

例子:新建一个游戏人物类(Player),有:姓名(name)、能量值(blood)、食物(food)属性,有显示人物属性的方法!

有战斗(fight)、吃饭(eat)方法,每战斗一次,消耗5个点的能量;每吃饭一次,消耗3个点的食物,增加2个点的能量!

写一个测试类,生成一个姓名为:“张无忌“,初始能量10个点,初始食物3个点!调用张无忌的战斗和吃饭方法测试!

 

public class Player {

 

         //属性

         public String name;

         public int blood;

         public int food;

        

         /**

     * 显示人物属性的方法

     * 问题:次数显示的是谁的namebloodfood的值?

     * 由于show()方法是非静态的,必须由对象来调用

     * 因此此处的namebloodfood的值,指代的是将来调用show()方法的那个对象的属性的值  

    */

         public void show(){

                   System.out.println("姓名:" + name + ",能量值:" + blood + ",食物:" + food);

         }

        

         //战斗

         public void fight(){

                   //属性制约方法的运行

                   if(blood > 0){

                      System.out.println(name + "在战斗!");

                      blood = blood - 5;

                     

                      //判断战斗后是否GAME OVER

                      if(blood <= 0){

                               blood = 0;

                               System.out.println("GAME OVER!");

                      }

                   }else{

                            System.out.println("GAME OVER!");

                   }

                  

                   show();//非静态方法直接调用非静态方法

         }

        

         //补充能量

         public void eat(){

                   //属性制约方法的运行

                   if(blood > 0 && food >= 3){

                            System.out.println(name + "补充能量!");

                            food = food - 3;

                            blood = blood + 2;

                   }else{

                            //判断属于哪种情况

                            if(blood <= 0){

                                     System.out.println("GAME OVER!");

                            }else{

                                     System.out.println("食物不足,请尽快补充!");

                            }

                   }

                  

                   show();

         }

}

 

/**

 * 测试类

 */

class TestPlayer{

 

         public static void main(String[] args) {

                   Player p = new Player();//生成对象

                   //为属性赋值

                   p.name = "张无忌";

                   p.blood = 10;

                   p.food = 3;

                  

                   p.show();

                  

                   p.fight();

                   p.eat();

                   p.eat();

                   p.fight();

                   p.fight();

         }

}

 

 

注意:常见的错误,无法在静态上下文中使用非静态的属性或方法!

 

问题:重构上述main的测试,输入整数1是命令张三丰去fight、输入整数2是命令他去eat()、输入整数3show(),可以无限输入,直到GAME OVER,或者输入-1来结束程序!

 

         public static void main(String[] args) {

                   Player p = new Player();//生成对象

                   //为属性赋值

                   p.name = "张无忌";

                   p.blood = 10;

                   p.food = 3;

                  

                  

                   Scanner sc = new Scanner(System.in);

                   System.out.println("请输入1代表fight2代表eat3代表show-1则结束!");

                   while(true){

                        int n = sc.nextInt();

                        if(p.blood <= 0){

                       System.out.println("游戏结束!");

                       break;

                        }else if(n == 1){

                       p.fight();

                       

                       if(p.blood <= 0){

                                   System.out.println("游戏结束!");

                                   break;

                       }

                        }else if(n == 2){

                       p.eat();

                        }else if(n == 3){

                       p.show();

                        }else if(n == -1){

                       System.out.println("您结束了游戏!");

                       break;

                        }else{

                       System.out.println("指令输入有误,请重新输入!");

                        }

                   }

                  

         }

 

例子:新建一个银行账户类(Bank),有卡号(cardNum),余额(money)属性,有查询余额(show),取款(get(double m))、存款(save(double m))方法。

写程序测试,新建一个银行账户对象,卡号为:3212 8382 3943 224,余额为100元。调用取款方法取50元,调用查询余额方法查询。

调用存款方法存100元,调用查询余额方法查询!

 

3、将一个类的对象作为另一个类的属性

例子:设定一个游戏人物类(Player),有姓名(name)、年龄(age)、银行账户(Bank)属性,有显示游戏人物属性(show)方法!

生成一个游戏人物的对象,为其属性赋值,并调用其账户的存取款方法测试!

 

/**

 * 银行账户类

 */

public class Bank {

 

         public String cardNum;

         public double money;

        

         //方法

         public void show(){

                   System.out.println("卡号:" + cardNum + ",余额:"+ money);

         }

        

         //存款

         public void save(double m){

                   System.out.println("存款成功!");

                   money += m;

         }

        

         //取款

         public void get(double m){

                   if(m <= money){

                            System.out.println("取款成功!");

                            money -= m;

                   }else{

                            System.out.println("余额不足!");

                   }

         }

}

 

/**

 * 游戏人物类

 */

public class Player {

 

         //属性

         public String name;

         public int age;

         public Bank bank;//将银行账户的对象作为游戏人物的属性

        

         public void show(){

                   System.out.println("姓名:" + name + ",年龄:" + age + ",银行账户信息:");

                   bank.show();

         }

}

 

/**

 * 测试类

 */

class TestPlayer{

 

         public static void main(String[] args) {

                   //生成游戏人物的对象

                   Player p = new Player();

                   //为属性赋值

                   p.name = "张晓明";

                   p.age = 89;

                  

                   //准备一个银行账户,赋值给游戏人物,作为他的属性

                   Bank b = new Bank();

                   b.cardNum = "3213 8473 9487 294";

                   b.money = 100;

                  

                   //为游戏人物的银行账户属性赋值,需要首先准备一银行账户的对象

                   p.bank = b;

                  

                   //调用游戏人物的银行账户的存取款的方法

                   p.bank.show();

                   p.bank.save(500);

                   p.bank.show();

                   p.bank.get(1000);

                   p.bank.show();

                  

                   p.show();

         }

}

 

4、局部变量和属性(全局变量)的差别

A、全局变量指的是定义在方法外部的变量,局部变量指的是定义在方法内部的变量;

 

B、局部变量必须先赋初值再使用,全局变量由编译器默认赋初值

 

例子:

/**

 *  定义球员类

 */

public class Person {

 

         //4个简单类型

         public int a;//0

         public double b;//0.0

         public char c;//\0 代表空字符

         public boolean d;//false

        

         //引用类型(对象类型)

         public String s;//null

        

         public static void main(String[] args) {

                   /*

                   int x;

                   x++;//语法错误,局部变量x没有赋初值

                   */

                  

                   Person p = new Person();

                   System.out.println(p.a + " " + p.b + " " + p.c + " " + p.d + " " + p.s);

         }

}

 

5System.out.println()详解

Java的基本组成:类、属性、方法!

System:类

outoutSystem的静态属性(PrintStream类型的属性,将PrintStream类的对象out作为了System类的属性)

println()out的非静态方法

 

 

6、构造方法

问题:什么是构造方法?

类中用来构造对象的方法,是这个类的构造方法!

 

问题:构造方法的作用?

用来构造类的对象!

 

问题:构造方法的特点?(构造方法和普通方法之间的区别?)

A、构造方法如果程序员不提供,则编译器提供默认的无参构造方法,如果程序员提供了,则编译器不再提供默认的无参构造方法!

B、构造方法一定和类同名

C、构造方法一定是非静态的

D、构造方法一定没有返回值,但也不需要声明void

E、构造方法通过new来调用!

 

例子:

/**

 *  定义球员类

 */

public class Person {

 

         //默认无参构造方法

         public Person(){

                   System.out.println("Person的构造方法被调用!");

         }

        

         public static void main(String[] args) {

                   //new调用的就是Person类的构造方法!

                   Person p = new Person();

         }

}

 

例子:有参构造方法

/**

 *  定义球员类

 */

public class Person {

 

         public String name;

         public int age;

        

         //默认无参构造方法

         public Person(){

                   System.out.println("Person的无参构造方法被调用!");

         }

        

         //有参构造方法(构造对象的同时为属性赋值)

         public Person(String n,int a){

                   name = n;

                   age = a;

                   System.out.println("Person的有参构造方法被调用!");

         }

        

         //展示属性的方法

         public void show(){

                   System.out.println("姓名:" + name + ",年龄:" + age);

         }

        

         public static void main(String[] args) {

                   Person p = new Person();

                   p.show();

                  

                   Person p2 = new Person("张晓芳",18);

                   p2.show();

         }

}

 

问题:有参构造方法的作用?

构造对象的同时,为属性赋值!

 

例子:经典的错误

/**

 *  定义球员类

 */

public class Person {

 

         public String name;

         public int age;

                  

         public Person(String n,int a){

                   name = n;

                   age = a;

         }

        

         public static void main(String[] args) {

                   new Person();

         }

}

 

错误原因:由于程序员提供了有参构造方法,编译器不再提供默认的无参构造构造方法,因此语法错误!

图片.png

Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn