java基础教程-面向对象(一)
一、面向对象
1.1 java键盘输入
1.1.1这种方法我认为是最简单,最强大的,就是用Scanner类
import java.util.Scanner; public static void main(String [] args) { Scanner sc = new Scanner(System.in); System.out.println(“请输入你的姓名:”); String name = sc.nextLine();//字符串输入 System.out.println(“请输入你的年龄:”); int age = sc.nextInt();//整型输入 System.out.println(“请输入你的工资:”); float salary = sc.nextFloat();//浮点型输入 System.out.println(“你的信息如下:”); System.out.println(“姓名:”+name+“\n”+“年龄:”+age+“\n”+“工资:”+salary); }
这段代码已经表明,Scanner类不管是对于字符串还是整型数据或者float类型的变量,只需做一点小小的改变,就能够实现功能!无疑他是最强大的
1.1.2
while(a.hasNext()) { System.out.println("你输入的是:"+a.nextInt()); } hasNext()是Scanner类的一个方法,判断是否有输入,有输入项,a .hasNext()为true,没有输入项,a .hasNext()为false
1.2.数组
定义数组 int [][] a=new int [10][10];
1.3.java变量命名规则
1、 类名:每个单词首字母大写,例UserName
2、 方法名和变量名:第一个单词首字母小写,其他单词首字母大写
例:getInfor(),getInfor
注:类方法的第一个单词必须是动词
构造方法(用来完成对对象的初始化):名字必须与类的名字相同
3、 包名:全部小写,例:example
4、 常量:所有字母全部大写,如果多个单词组成,通常用_连接
例:MIN_VALUE,PI
1.4.Java内存解析
形参和局部变量在栈中分配内存空间 ,运行完自动释放,堆中的内存程序员释放,分析内存解析时,要从main()开始一步一步分析。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
静态变量(static)存放在数据区
new创造对象,会直接执行构造函数,
首先我们先来讲解一下内存中的各个区域。
stack(栈):存放基本类型的数据和对象的引用,即存放变量。
如果存放的事基本类型的数据(非静态变量),则直接将变量名和值存入stack中的内存中;
如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)。
heap(堆):存放new产生的数据。
data segment:分为静态域和常量域。
静态域:
存放在对象中用static定义的静态成员(即静态变量,同理,如果该静态变量是基本类型则将变量名和值存入静态域,如果是引用类型则指向new出的对象)。
常量池:
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型 (如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法和名称和描述符。
注:大家要注意String类型不是基本数据类型,所以它可以创建对象,并且它的值是放在常量池中的。
1.5.Static
每new一个对象,成员变量都会赋予新的值,而static成员变量是唯一的,固定不变的,而且对所有成员共享,访问的静态变量占用统一块内存。
1.6.包
包的命名 对于公司, com.company.lksk.sk
调用包 用inport 包名.* (调用包下的所有类)
或 import 包名.类名 (调用特定类)
调用时 调用的包必须与程序在相同目录下,而且类必须是/com/company/lksk/sk/文件夹下 或者class文件的最上层包的父目录(com文件的父目录)位于classpath下
执行一个类,需要写全包名,即java com.company.lksk.sk.Dog
在jdk中的jre/lib文件夹中rt.jar,包含java自带的各种类,而Java.lang包中的类可以直接使用(包括System.class String.class等),不需要import,其余均需要import
生成jar包,目录调至class文件最上层包的父目录,执行jar –cvf test.jar *.*(jar包的名字)
1.7. Java SE EE ME区别:
Java SE=Java Standard Edition
Java EE=Java Enterprise Edition
Java ME=Java Mobile Edition
SE(标准版)主要用于桌面程序,控制台开发(JFC)
EE(企业版)企业级开发(JSP,EJB):网站开发和基于 b/s模式的编程
ME(微缩版)嵌入式开发(手机,小家电):手机软件游戏编程
1. Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
2. Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
3. Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
1.8.Java中random类的用法
1.8.1Random类 (java.util)
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。
Random类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍:
1.8.2、Random类中的常用方法
a、public boolean nextBoolean()
该方法的作用是生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。
b、public double nextDouble()
该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间。
c、public int nextInt()
该方法的作用是生成一个随机的int值,该值介于int的区间,也就是-231到231-1之间。
如果需要生成指定区间的int值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。
d、public int nextInt(int n)
该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。
如果想生成指定区间的int值,也需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。
e、public void setSeed(long seed)
该方法的作用是重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同
方法举例:
Random r = new Random();
生成[1,2.5)区间的小数:double d3 = r.nextDouble() * 1.5 + 1;
生成[-3,15)区间的整数:int n4 = r.nextInt(18) - 3;
1.9.多态
多态实际上就是就是,调用方法时,如果方法重写了,实际当中调用哪个方法,要看你new的对象是什么。
动态绑定是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型调用其相应的方法。
多态的三个必要条件:1、要有继承2、要有重写3、父类引用指向子类对象。当三个条件满足,调用父类中的重写的方法时,实际上new的什么对象,就调用该对象的方法。
1.10.abstract类/object类
abstrcat抽象方法是用来重写的,本身只做定义,在子类中重写,抽象方法必须位于抽象类中。抽象类必须被继承,抽象类不能实例化;抽象方法必须被重写,抽象方法只需声明,不需实现。子类继承抽象类时,必须重写抽象类中的方法。
abstract class Animal(){ public abstract void enjoy(); }
object 类中的equals函数必须是指向同一引用时,才会返回true,所以一般要重写equals函数。
1.11.final
final 的变量值不能改变,final的方法不能重写,final的类不能继承
1.12.接口
接口是抽象类和常量定义的集合,实际上接口是一种特殊的抽象类,这种抽象类只包含常量方法的定义,而没有变量和方法的实现。接口方法的实现必须用class去implements
public interface Runner(){ public static final int id = 1; public void start(); public void run(); }
接口中声明的属性只能是public static final(不管你写不写),方法只能是抽象方法(不管你写不写),而且必须是public。
接口的实现用implements
例 interface Singer(){ Public void sing (); Public void sleep(): } class Student implements Singer{ }
类之间只能单继承,一个子类只能继承一个父类,而一个类可以实现多个无关的接口,且多个无关的类可以实现同一个接口。
例:class Teacher implements Singer,Painter(){}
class Teacher extends School implements Singer,Painter(){}
当接口继承另一个接口时,实现接口的类,必须重写两个接口中所有的方法。