---------------------- 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-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之间的随机数。
*/
//引入随机数类
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. 猜数字小游戏
- 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());
- }
- }
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. 动物类测试
- /*
- 我现在有两个类,一个狗类,一个猫类,狗有姓名和年龄,猫也有姓名和年龄。
- 并且他们还有共同的吃的方法,内容是:吃食物。
- 但是,他们也有不同的方法,狗喜欢跑步,猫喜欢捉迷藏。
- 请用所学过的知识,分析并写出代码并测试。
- */
- 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();
- }
- }
/*
我现在有两个类,一个狗类,一个猫类,狗有姓名和年龄,猫也有姓名和年龄。
并且他们还有共同的吃的方法,内容是:吃食物。
但是,他们也有不同的方法,狗喜欢跑步,猫喜欢捉迷藏。
请用所学过的知识,分析并写出代码并测试。
*/
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培训、期待与您交流! ----------------------