Java面向对象
万事万物皆对象
匿名对象
class Student{
int age = 3;
String sex;
}
public class a {
public static void main(String[]args){
System.out.println(new Student().age)
//有名字的对象
Student s = new Student();
//匿名对象:
new Student()
}
}
匿名对象其实就是对象,对象具有的功能匿名对象都具有,只不过有名字的对象可以重复使用,匿名对象只能用一次罢了。
匿名对象平时使用场景较少,日常项目开发中很少使用,一般框架层面才会用到
特点
- 由于我们没有记录堆内存对象的地址值,所以只能用一次,再次使用就找不到了
- 匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间
方法的重载
什么是重载:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。
重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同。调用时,根据方法参数列表的不同来却别。
public static int sum(int a, int b) {
return a + b;
}
//三个数相加
public static int sum(int a, int b, int c) {
return a + b + c;
}
//四个数相加:
public static int sum(int a, int b, int c, int d) {
return a + b + c + d;
}
方法的可变个数类型形参!(javaSE5新特性)
/*
* 可变参数
* 1、java SE 5 特性
* 2、形式 Object... 本质Object数组。int... args 自动装箱
* 3、位置必须是方法参数的最后一个参数
* 4、调用可变参数的方法不提供参数是 数组不为null,数组length为0
*/
@Test
//@Test是注解表达式里的测试 等价于main方法
public void testVarArgument() {
// 没有提供参数
varArg();
}
public static void varArg(Integer... args) {
if(args == null) {
System.out.println("没有提供参数,数组为null");
} else {
System.out.println("数组大小为:" +args.length);
}
}
方法参数的值传递机制
方法必须由所在的类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
方法的递归调用(自己调用自己)
什么是递归:
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调;
用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过;
程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归必须要有的三个条件
- 边界值必须要有
- 递归条件前进代码
- 递归条件结束判断代码
当边界值未达到时递归继续前进,开始新一轮循环,边界值达到条件则递归结束。
package 递归调用;
/**
* 递归调用,计算5的阶乘
* 递归调用就是在方法中调用自己的方法
* @author Administrator
*
*/
public class Jiecheng {
public static void main(String[] args) {
long r=Jiecheng.resursion(5);
System.out.println(r);
}
public static long resursion(int i){
if(i==1||i==0){
return 1;
}else{
return i*resursion(i-1);
}
}
}
面向对象的特征之一(封装与隐藏)
什么是封装?
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
简而言之封装就是 封装好类只管使用不管他到底是如何实现某些功能的。
权限修饰符的使用
Java中四种权限修饰符:public(公共的)、protected(受保护的)、default(默认的)、private(私有的)
状态修饰符:static(静态的),final(最终的)
static(静态的)
可以修饰成员变量,成员方法,不能修饰类,不能修饰构造方法。
被修饰的变量,方法可以通过类名进行调用。
final(最终的)
可以修饰类,成员变量,成员方法,不能修饰构造方法。
修饰的类不能被继承,被修饰的变量是常量,被修饰的方法不能被继承。
抽象修饰符:abstract(抽象的)
abstract(抽象的)
不能修饰构造方法,不能修饰成员变量,可以修饰类(接口),成员方法
被修饰的类(接口)不能被实例化,只能被继承,被修饰的成员方法在子类中必须被重写
构造器
构造器的注意事项:
1.构造器的名称必须和类名一致;
2.一个类中可以定义多个构造器,但是构造器的参数列表必须不同;
3.如果我们没有手动定义构造器,则java系统会提供一个默认的构造器给我们使用。一旦我们定了构造器,则系统会把构造器收回;
4.构造器的作用:实例化对象,给对象赋初始值;
public class a{
public int age;
public a(){ //构造器初始化时默认赋值age=18;
age=18;//如果没写构造器,系统会自动生成构造器
}
@Test
a();
}
JavaBean
什么是JavaBean
JavaBean是使用Java语言开发的一个可重用的组件,在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁。JSP搭配JavaBean来使用,有以下的优点:
1.可将HTML和Java代码分离,这主要是为了日后维护的方便。如果把所有的程序代码(HTML和Java)写到JSP页面中,会使整个程序代码又多又复杂,造成日后维护上的困难。
2.可利用JavaBean的优点。将日常用到的程序写成JavaBean组件,当在JSP要使用时,只要调用JavaBean组件来执行用户所要的功能,不用再重复写相同的程序,这样以来也可以节省开发所需的时间。
UML图
有待填坑 目前没听懂
this关键字
class Person {
int age;
public Person(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
package、import 关键字的使用
1、包–package
包名一般为小写,而类名的第一个字母一般为大写,这样在引用时,可以明显的分辨出包名和类名。如果在类的定义之前没有使用package定义包名,那么该类就属于缺
省的包。
包的作用:
可以更好的组织类,包与文件夹类似,文件夹可以将不同的文件放在同一个文件夹中,而包也可以将不同的类文件放在同一包中。减少类名的冲突问题,这也与文件夹类似,同一文件夹中的文件不能重名,不同文件中的 文件可以重名,同一包中的类名不能重复,不同包中的类名可以重复,对包中的类起了一定的保护作用。
包的使用:
使用 package 关键字指明类所在的包。 package 语句必须在文件的最前面。 编译时可使用 javac –d . Test.java 自动产生包需要目录。 可以使用 java testPackage.Test来执行编译后的代码。
2、导入–import
使用了包机制后,如果在一个类中使用了其他包中的类,需要使用 import 来引入。
import 的使用:
直接引用指定的类,如 import java.util.Vector。引用一个包中的多个类,如 import java.awt.。 号代替类名,但不能代替包名,如import java.awt.,只引用 java.awt 下的类,而不引用 java.awt 下的子包里面的类。import java.awt.F,这种使用方法是错误的。import 语句在所有类定义之前,在 package 定义之后。 import 只告诉编译器及解释器哪里可以找到类、变量、方法的定义,而并没有将这些定义 引入代码中。
包中类的使用:
如果要使用的类是属于 java.lang 包的,那么可以直接使用类名来引用指定的类,而不需要加上包名,因为包 java.lang 不用显示使用 import,它是缺省引入的。 如果要使用的类在其它包(java.lang 除外)中,那么可以通过包名加上类名来引用该类, 如java.awt.Font。对于经常要使用的类(该类在其它包中),那么最好使用 import 引用指定的包,如java.awt.*。
如果import引入的不同的包中包含有相同的类名,那么这些类的使用必须加上包名。
MVC设计模式