黑马程序员——面向对象概述

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------


面向对象概述

1. 面向对象的理解
    面向对象是相对面向过程而言,面向对象和面向过程都是一种思想.
    面向过程强调的是功能行为,面向对象将功能封装进对象,
    强调具备了功能的对象.面向对象是基于面向过程的.
2. 面向对象的特点
    是一种符合人们思考习惯的思想,可以将复杂的事情简单化.
    将程序员从执行者转换成了指挥者.
    完成需求时,先要去找具有所需的功能的对象来用.
    如果该对象不存在,那么创建一个具有所需功能的对象.
    这样简化开发并提高复用.
3. 面向对象开发,设计,特征
    开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
    设计的过程:其实就是在管理和维护对象之间的关系。
    面向对象的特征:封装,继承,多态
    封装(encapsulation)  继承(inheritance)  多态(polymorphism)
4. 类与对象的关系
    java中描述事物是通过类的形式体现,类是具体事物的抽象,
    概念上的定义。对象即是该类事物实实在在存在的个体。
5. 类的定义
    生活中描述事物无非就是描述事物的属性和行为。
    如:人有身高,体重等属性,有说话,打球等行为。
    Java中用类class来描述事物也是如此
    属性:对应类中的成员变量。
    行为:对应类中的成员函数。
    定义类其实在定义类中的成员(成员变量和成员函数)。
6. 成员变量和局部变量的区别
    成员变量:
    成员变量定义在类中,在整个类中都可以被访问。
    成员变量随着对象的建立而建立,存在于对象所在的堆内存中。
    成员变量有默认初始化值。
    局部变量:
    局部变量只定义在局部范围内,如:函数内,语句内等。
    局部变量存在于栈内存中。
    作用的范围结束,变量空间会自动释放。
    局部变量没有默认初始化值。
7. 创建对象,使用对象
    只要是用new操作符定义的实体就会在堆内存中开辟一个新的空间。
    并每一个对象中都有一份属于自己的属性。
    通过 对象.对象成员的方式操作对象中的成员,
    对其中一个对象的成员进行了修改。和另一个对象没有关系。
8. 匿名对象
    匿名对象是对象的简化形式,匿名对象两种使用情况:
    (1) 当对对象方法仅进行一次调用的时
    (2) 匿名对象可以作为实际参数进行传递
9. Java中API的使用
    (1)Math类  特点: 没有构造方法,因为成员变量和成员方法都是静态的,
    可以通过类名使用。在lang包下,所以,使用不用导包。
    常用方法: abs() 求绝对值  ceil() 向上取整  floor() 向下取整
    pow() 求一个数的幂  max() 求最大值 min() 求最小值
    random() 产生随机数  round() 四舍五入  sqrt() 求正的平方根
    (2)Scanner类  作用:可以通过它接收从键盘录入的数据。
    使用步骤:a:导入包 import java.util.Scanner;
          b:创建对象 Scanner sc = new Scanner(System.in);
          c:使用功能 int x = sc.nextInt();
    Scanner小问题,先获取int类型的值,在获取String类型的值,
    会把换行符当做字符串接收。解决方案:重新创建对象
    或者把所有的数据按照字符串接收,然后针对需要的数据进行转换。
    (3) Random类
    (1)产生随机数的类。还有一个是Math类的Math.random()方法
    (2)构造方法:
        Random():每次产生的都是不同的
        Random(long seed):有了种子,可以产生同一的随机数
    (3)成员方法:
        int nextInt():产生的是int范围内的随机数
        int nextInt(int n):产生的是[0,n)之间的随机数
    (4)案例:
        1-100之间的随机数。
        Random r = new Random();  int num = r.nextInt(100)+1;
10. 包(package)
    对类文件进行分类管理。给类提供多层命名(名称)空间。
    写在程序文件的第一行。类名的全称的是  包名.类名。
    包也是一种封装形式。
    自动建包: javac -d . Hello.java 运行: java cn.java.Hello
11. classpath
    给JVM提供的一个环境变量。指定类或者包所在的路径。
    classpath变量值的最后有分号与无分号是有区别的。
12. 包之间的访问import
    被访问的包中的类权限必须是public的。
    类中的成员权限:public或者protected
    protected是为其他包中的子类提供的一种权限
    如果在不同包下使用类,多次时候最好导包。
    简化类名。一个程序文件中只有一个package,可以有多个import。
    用来导包中的类,不导入包中的包。
    通常写import  mypack.Demo;  而不写import mypack.*;
13. 四种权限修饰符
          public    protected    default       private
    同一类中    V            V              V          V
    同一包中    V            V            V   
    子    类    V            V    
    不同包中    V
    成员变量:权限修饰符+[static/final]+数据类型+变量;
    成员方法:权限修饰符+[static/abstract]+返回值类型+方法名(参数);
14. 常见的类,构造方法,成员变量,成员方法可以被哪些修饰符修饰。
               类    构造方法    成员变量    成员方法
    private             Y         Y         Y
    默认        Y     Y         Y         Y
    protected         Y         Y         Y
    public        Y     Y         Y         Y
    static                     Y         Y
    final        Y             Y         Y
    abstract    Y                     Y
15. Object类
    Object类是所有类的超类。所有的类都直接或者间接继承自Object类。
    Object类的常用方法:
    (1) public String toString():返回对象的字符串表示。
    (2) getClass().getName() + '@' + Integer.toHexString(hashCode())
    它表示的是对象的地址信息,对我们没有意义.所以,一般我们需要重写。
    (3) public final Class<?> getClass():返回的是class文件的描述(反射)。
    (4) public int hashCode():返回对象的哈希码值。
    (5) protected void finalize():当对象没有被引用变量指向的时候,
        jvm调用此方法进行垃圾回收。
    (6) public boolean equals(Object obj):默认比较的是对象的地址值。
        一般来说没有意义。所以,我们也会根据需求重写该方法。
16. String类,StringBuffer类,
    (1) 字符串是一个特殊的对象。字符串一旦初始化就不可以被改变。
    (数据内容不能变,不是说字符串的引用不能变).
    (2) 下面的s和s2的区别:
    String s = new String("abc"); 在创建s的时候,有两个对象被创建。
    String s2 = "abc"; 在创建s2的时候,有一个对象被创建。
    直接赋值字符串常量是直接拿字符串常量池里面的值。                    
    (3) StringBuffer和StringBuilder:
    字符串的组成原理就是通过该类实现的。是字符串缓冲区类。是一个容器。
    字符串是固定的,StringBuffer可以对字符串内容进行增删,是可变长度的。
    而且通过测试可知道的它容量的变化 (上次的容量*2+2)
    StringBuffer是一个容器。很多方法与String相同。
    StingBuffer是可变长度的,JDK1.5出现一个StringBuilder,方法完全一样.
    构造方法:
        StringBuffer():默认容量16
        StringBuffer(int capacity): 指定容量capacity
        StringBuffer(String str): 默认容量16+str.length()
    (4) String和StringBuffer的相互转换
        String --> StringBuffer
            StringBuffer buffer = new StringBuffer(String str);
            StringBuffer buffer = new StringBuffer();
            buffer.append(String str)
        StringBuffer --> String
            String s = new String(StringBuffer buffer);
            String s = buffer.toString();
    (5) 区别是StringBuffer是同步的,StringBuilder是非同步的。
17. 基本数据类型对象包装类
    (1) 将基本数据类型封装成对象的好处:
    在于可以在对象中定义更多的功能方法操作该数据。
    常用的操作之一:用于基本数据类型与字符串之间的转换。
    例:Integer的parseInt方法,intValue方法。
    Integer i = new Integer(String s); //注意:s必须是数字字符串
    String --> int:       int i = Integer.parseInt(String s);
    int --> String:    String s = String.valueOf(int i);
    (2) 基本数据类型对象包装类新特性
    JDK1.5以后,简化了定义方式。
    Integer x = new Integer(4);可以直接写成
    Integer x = 4; //自动装箱。
    x  = x + 5; //自动拆箱。通过intValue方法。
    需要注意:在使用时,Integer  x = null;
    上面的代码就会出现NullPointerException。
    因为隐式的拆箱可能会有空指针异常。
    (3) 在byte范围内,直接给包装类赋值,用的byte常量池里面的数据。    
18. Jar包及其操作
    (1) Java的压缩包,方便项目的携带。
    方便于使用,只要在classpath设置jar路径即可。
    数据库驱动,SSH框架等都是以jar包体现的。
    (2) 通过jar.exe工具对jar的操作。
    创建jar包: jar  -cvf  mypack.jar  packa packb
    查看jar包: jar  -tvf  mypack.jar  [>定向文件]
    解压缩: jar  -xvf  mypack.jar
    自定义jar包的清单文件: jar –cvfm  mypack.jar  mf.txt  packa packb
    注:     c:创建压缩文档。  f:制定存档名称。
        v:显示详细信息。  m:加入自定义清单信息。
    通常应用与Java制作的图形界面程序。
    在清单文件中其中定一个Main-Class: 空格 带有主函数的类名回车
    在设置一下jar文件的打开方式通过javaw –jar就可以双击执行了。

19. 练习巩固题

1.  生成一个1-100之间的随机数。

  1. /* 
  2.   实现生成一个1-100之间的随机数。 
  3. */  
  4.   
  5. //引入随机数类   
  6. import java.util.Random;  
  7.   
  8. class RandomTest   
  9. {  
  10.     public static void main(String[] args)   
  11.     {  
  12.         produceRandomNumber1();  
  13.         produceRandomNumber2();  
  14.   
  15.     }  
  16.   
  17.     public static void produceRandomNumber1(){  
  18.         System.out.println(" 调用Math类的random()随机函数:");  
  19.         for(int i=1;i<=100;i++){  
  20.             //int randomNumber = (int)(Math.random()*100);   
  21.             //返回最大的double值,该值小于等于参数,并等于某个整数   
  22.             double num = Math.ceil(Math.random()*100);  
  23.             //返回带正号的 double值,该值大于等于0.0且小于1.0   
  24.             long randomNumber = Math.round(num);  
  25.             System.out.print(randomNumber+"\t");  
  26.             if(0 == i%10)  
  27.                 System.out.println();                 
  28.         }  
  29.     }  
  30.   
  31.     public static void produceRandomNumber2(){  
  32.         System.out.println(" 使用Random类的nextInt()函数:");  
  33.         Random random = new Random();  
  34.         for(int x=1;x<=100;x++){  
  35.             //返回一个伪随机数,它是取自此随机数生成器序列的   
  36.             int num = random.nextInt(100)+1;  
  37.             System.out.print(num+"\t");  
  38.             if(0 == x%10){  
  39.                 System.out.println();  
  40.             }  
  41.         }  
  42.     }  
  43. }  
/*
  实现生成一个1-100之间的随机数。
*/

//引入随机数类
import java.util.Random;

class RandomTest 
{
	public static void main(String[] args) 
	{
		produceRandomNumber1();
		produceRandomNumber2();

	}

	public static void produceRandomNumber1(){
		System.out.println(" 调用Math类的random()随机函数:");
		for(int i=1;i<=100;i++){
			//int randomNumber = (int)(Math.random()*100);
			//返回最大的double值,该值小于等于参数,并等于某个整数
			double num = Math.ceil(Math.random()*100);
			//返回带正号的 double值,该值大于等于0.0且小于1.0
			long randomNumber = Math.round(num);
			System.out.print(randomNumber+"\t");
			if(0 == i%10)
				System.out.println();				
		}
	}

	public static void produceRandomNumber2(){
		System.out.println(" 使用Random类的nextInt()函数:");
		Random random = new Random();
		for(int x=1;x<=100;x++){
			//返回一个伪随机数,它是取自此随机数生成器序列的
			int num = random.nextInt(100)+1;
			System.out.print(num+"\t");
			if(0 == x%10){
				System.out.println();
			}
		}
	}
}

生成1-100之间的随机数运行截图:



2. 猜数字小游戏

  1. import java.util.Scanner;  
  2.   
  3. class GuessNumber  
  4. {  
  5.     GuessNumber(){}  
  6.     private int x = (int)(Math.random()*100+1);  
  7.     private int y = -1;  
  8.   
  9.     public int getX(){  
  10.         return x;  
  11.     }  
  12.   
  13.     public int getY(){  
  14.         return x;  
  15.     }  
  16.   
  17.     public void input(){  
  18.           
  19.         do{  
  20.             System.out.print("请输入一个数: ");  
  21.             Scanner sc = new Scanner(System.in);  
  22.             y = sc.nextInt();  
  23.     //      System.out.println("y: "+y);   
  24.   
  25.             judgeTwoNumber(x,y);  
  26.         }while(x != y);  
  27.     }  
  28.   
  29.     public static void judgeTwoNumber(int a,int b){  
  30.         if(a == b){  
  31.             System.out.println("恭喜你猜中了!");  
  32.         }else if(a > b){  
  33.             System.out.println("输入的数小了!");  
  34.         }else{  
  35.             System.out.println("输入的数大了!");  
  36.         }  
  37.     }  
  38.   
  39. }  
  40.   
  41. class GuessNumberTest   
  42. {  
  43.     public static void main(String[] args)   
  44.     {  
  45.           
  46.     //  int x = (int)(Math.random()*100+1);   
  47.     //  System.out.println("x: "+x);   
  48.   
  49.         GuessNumber gn = new GuessNumber();  
  50.         gn.input();  
  51.         gn.judgeTwoNumber(gn.getX(),gn.getY());  
  52.     }  
  53.   
  54. }  
import java.util.Scanner;

class GuessNumber
{
	GuessNumber(){}
	private int x = (int)(Math.random()*100+1);
	private int y = -1;

	public int getX(){
		return x;
	}

	public int getY(){
		return x;
	}

	public void input(){
		
		do{
			System.out.print("请输入一个数: ");
			Scanner sc = new Scanner(System.in);
			y = sc.nextInt();
	//		System.out.println("y: "+y);

			judgeTwoNumber(x,y);
		}while(x != y);
	}

	public static void judgeTwoNumber(int a,int b){
		if(a == b){
			System.out.println("恭喜你猜中了!");
		}else if(a > b){
			System.out.println("输入的数小了!");
		}else{
			System.out.println("输入的数大了!");
		}
	}

}

class GuessNumberTest 
{
	public static void main(String[] args) 
	{
		
	//	int x = (int)(Math.random()*100+1);
	//	System.out.println("x: "+x);

		GuessNumber gn = new GuessNumber();
		gn.input();
		gn.judgeTwoNumber(gn.getX(),gn.getY());
	}

}

猜数字小游戏运行结果截图




3. 动物类测试


  1. /* 
  2.   我现在有两个类,一个狗类,一个猫类,狗有姓名和年龄,猫也有姓名和年龄。 
  3.       并且他们还有共同的吃的方法,内容是:吃食物。 
  4.       但是,他们也有不同的方法,狗喜欢跑步,猫喜欢捉迷藏。 
  5.       请用所学过的知识,分析并写出代码并测试。 
  6. */  
  7.   
  8. class Animals  
  9. {  
  10.     public Animals(){}  
  11.     public Animals(String name,int age){  
  12.         this.name = name;  
  13.         this.age = age;  
  14.     }  
  15.     private String name;  
  16.     private int age;  
  17.   
  18.     public void setName(String name){  
  19.         this.name = name;  
  20.     }  
  21.     public String getName(){  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setAge(int age){  
  26.         this.age = age;  
  27.     }  
  28.     public int getAge(){  
  29.         return age;  
  30.     }  
  31.   
  32.     public void eat(){  
  33.         System.out.print("吃食物!");  
  34.     }  
  35.   
  36.     public void show(){  
  37.         System.out.println("\n我是一只: "+getName()+"\t年龄: "+getAge());  
  38.     }  
  39.   
  40. }  
  41.   
  42. class Dog extends Animals  
  43. {  
  44.     public Dog(){}  
  45.     public Dog(String name,int age){  
  46.         super(name,age);  
  47.     }  
  48.     public void eat(){  
  49.         super.eat();  
  50.         System.out.println("爱啃骨头!");  
  51.     }  
  52.     public void run(){  
  53.         System.out.println("喜欢跑步!");  
  54.     }  
  55. }  
  56.   
  57. class Cat extends Animals  
  58. {  
  59.     public Cat(){}  
  60.     public Cat(String name,int age){  
  61.         super(name,age);  
  62.     }  
  63.     public void eat(){  
  64.         super.eat();  
  65.         System.out.println("爱吃鱼!");  
  66.     }  
  67.     public void play(){  
  68.         System.out.println("喜欢捉迷藏!");  
  69.     }  
  70. }  
  71.   
  72. class AnimalsTest   
  73. {  
  74.     public static void main(String[] args)   
  75.     {  
  76.   
  77.         Animals animal1 = new Animals("动物",8);  
  78.         animal1.show();  
  79.         animal1.eat();  
  80.   
  81.         Animals animal2 = new Animals();  
  82.         animal2.setName("四脚");  
  83.         animal2.setAge(10);  
  84.         animal2.show();  
  85.         animal2.eat();  
  86.   
  87.         Cat cat1 = new Cat("小花",1);  
  88.         cat1.show();  
  89.         cat1.eat();  
  90.   
  91.         Cat cat2 = new Cat();  
  92.         cat2.setName("花猫");  
  93.         cat2.setAge(2);  
  94.         cat2.show();  
  95.         cat2.eat();  
  96.   
  97.         Dog dog1 = new Dog("旺财",4);  
  98.         dog1.show();  
  99.         dog1.eat();  
  100.   
  101.         Dog dog2 = new Dog();  
  102.         dog2.setName("大黄");  
  103.         dog2.setAge(5);  
  104.         dog2.show();  
  105.         dog2.eat();  
  106.           
  107.     }  
  108. }  
/*
  我现在有两个类,一个狗类,一个猫类,狗有姓名和年龄,猫也有姓名和年龄。
	  并且他们还有共同的吃的方法,内容是:吃食物。
	  但是,他们也有不同的方法,狗喜欢跑步,猫喜欢捉迷藏。
	  请用所学过的知识,分析并写出代码并测试。
*/

class Animals
{
	public Animals(){}
	public Animals(String name,int age){
		this.name = name;
		this.age = age;
	}
	private String name;
	private int age;

	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}

	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}

	public void eat(){
		System.out.print("吃食物!");
	}

	public void show(){
		System.out.println("\n我是一只: "+getName()+"\t年龄: "+getAge());
	}

}

class Dog extends Animals
{
	public Dog(){}
	public Dog(String name,int age){
		super(name,age);
	}
	public void eat(){
		super.eat();
		System.out.println("爱啃骨头!");
	}
	public void run(){
		System.out.println("喜欢跑步!");
	}
}

class Cat extends Animals
{
	public Cat(){}
	public Cat(String name,int age){
		super(name,age);
	}
	public void eat(){
		super.eat();
		System.out.println("爱吃鱼!");
	}
	public void play(){
		System.out.println("喜欢捉迷藏!");
	}
}

class AnimalsTest 
{
	public static void main(String[] args) 
	{

		Animals animal1 = new Animals("动物",8);
		animal1.show();
		animal1.eat();

		Animals animal2 = new Animals();
		animal2.setName("四脚");
		animal2.setAge(10);
		animal2.show();
		animal2.eat();

		Cat cat1 = new Cat("小花",1);
		cat1.show();
		cat1.eat();

		Cat cat2 = new Cat();
		cat2.setName("花猫");
		cat2.setAge(2);
		cat2.show();
		cat2.eat();

		Dog dog1 = new Dog("旺财",4);
		dog1.show();
		dog1.eat();

		Dog dog2 = new Dog();
		dog2.setName("大黄");
		dog2.setAge(5);
		dog2.show();
		dog2.eat();
		
	}
}

动物类测试运行截图





---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值