java OOP

 

对象和类:对象是类的一个实例,类是对象的模板

类也是一种数据类型,可以声明对象引用变量,即对该对象的引用;

程序只有一个包含main方法的主类:使用该类的程序是类的客户;

public static void main(String[] args) {   }

 

UML类图

+表示public      -表示private    #表示protected    下划线表示静态变量和静态方法    斜体表示抽象类和抽象方法

斜体还表示接口和方法,虚线和空心三角形指向接口

父类方法在子类uml中被省略

  • 类名
  • 数据域:引用型(string,arry[])赋默认值null,数值型默认0,boolean默认false,char型默认'\u0000'

dataFileName:dataFiledType

  • 构造方法:无返回类型;用new操作符来创建初始化对象 new ClassName(arguments);可以重载

ClassName(parameterName:parameterType)

  • 方法:

methodName(paramaterName:parameterType):returnType

 

静态变量、常量、方法 ——static

如果一个变量和方法不依赖于某个类的具体实例,应该定义为静态变量和方法

  • 不要从构造方法中传参数来初始化静态数据域,使用静态set方法 
  • 一个类的所有实例共享数据,存储在公共内存地址,某一个对象修改其值,同一个类的所有对象都会受到影响;
  • 无需创建类的实例就可以调用静态方法;
  • 常量final static;
  • 类的静态变量和方法可以在类的实例和静态方法中使用,类的实例变量和方法只能在实例方法中使用
  • 调用方法:类名.静态方法名(参数)包括main方法         类名.静态变量

 

抽象类和抽象方法——abstract

父类类型  object = new 子类构造方法;

  • 子类的共同方法在父类中只有定义没有实现,依赖于子类对象的具体类型,由子类实现,称为抽象方法;
  • 抽象类不能使用new操作符创建实例,构造方法定义为protected,构造方法在子类的构造方法中调用;
  • 抽象类可以用作一种数据类型,如抽象类数组;
  • 包含抽象方法的一定是抽象类,但是抽象类可以不包含抽象方法;
  • 抽象类除常量和抽象方法,可以包括变量和具体方法;
  • 由抽象类扩展的非抽象子类中必须实现所有的抽象方法;
  • 父类是具体的,子类也可以是抽象的;

 

接口:只包含常量和抽象方法,目的是指明多个对象的共同行为

定义:无构造方法,不能使用new操作符创建实例;接口中所有数据域都是public final static,方法都是public,可以忽略修饰符;接口名.常量名;接口可以扩展其它接口;

            接口类型  object = new 子类构造方法;

修饰符   interface   接口名{

}

//NewInterface称为子接口,必须实现Interface1,Interface2,...,InterfaceN中定义的抽象方法

修饰符   interface   NewInterface extends Interface1,Interface2,...,InterfaceN{

}

类、接口继承:当一个类实现接口时,该类实现了定义在接口中的所有带确切签名和返回类型的方法,若不实现这些方法,应将其定义为抽象类;一个类可以扩展它的父类同时实现多个接口;一个接口类型的变量可以引用任何实现该接口的类的实例;

修饰符 class 类名 implements  接口名(可以有多个接口,多重扩展){

}

修饰符 class 类名 extends 类名 implements  Interface1,Interface2,...,InterfaceN{

}

java.lang.Cloneable接口:是一个标记接口,实现Cloneable接口的类的对象是可克隆的

java.lang.Comparable接口:定义了compareTo方法

ActionListener接口:点击按钮触发一个事件,一个事件就是一个对象,监听器对象处理这个时间

创建一个对象能够处理按钮上的动作事件,这个对象称为监听器——

对象必须是ActionListener接口的一个实例;

ActionListener对象listener必须使用方法source.addActionListener(listener)注册给源对象;

 

详细描述父子关系的strong is a relationship 用类建模;表面对象有某种属性的类属关系weak is a relationship用接口关系;

接口是一种特殊的类,可以定义为不相关类共有的父类型,更加灵活

 

 

可见性修饰符:数据域和方法能否被该类之外访问,类内无限制

  • public和默认(无)修饰符:
  • private:方法和数据域只能在自己的类中被访问;仅用于修饰类的成员(数据和方法);

为了防止数据被修改以及使类更易于维护,将数据域声明为私有的。

数据域封装——避免对数据的直接修改,将数据域声明为私有的

                          返回值get方法public returnType getPropertyName()或public boolean isPropertyName()

                          更新值set方法public void setPropertyName(dataType propertyValue)

防止用户创建类的对象——定义一个私有的无参构造方法;

                                            如果类的所有方法都是静态的无需创建对象通过类名调用;

  • protected:允许子类访问定义在父类中的数据域或方法但不允许非子类访问;仅用于修饰类的成员(数据和方法)

子类可以覆盖父类 的protected方法,并把可见性改为public,但是子类不能削弱父类方法的可见性

 同一类内可访问同一包中可访问子类内可访问不同包内可访问
public
protected 
none  
private   

 

final:表明一个类是终极的,不能作为父类;一个方法是终极的,不能被子类覆盖;表面一个方法内的变量是常量      防止扩展和覆盖

 

字符串

 

文件类File

创建对象:File file = new File("image/us.gif")   并不是在机器上创建文件; 不要直接使用绝对文件名 ;

PrintWriter写数据:

PrintWriter output = new PrintWriter(file);//若文件不存在创建新文件,存在当前内容废弃,Java强制要求编写代码处理异常

output .print();

.....

output .close();//必须关闭文件

Scanner读数据:令牌读取方法,分隔符默认是空格,可通过useDelimiter(String regex)自定义,不读取令牌后面的分隔符,然后返回分隔符之前的字符串

Scanner input = new Scanner(System.in);

Scanner input = new Scanner(new File(filename));

input.next()不转换/nextInt()转换为int型值/nextLine()/hasNext();

input.close();//不强制,但可以释放被占用资源

GUI:JFileChooser

 

关于对象:

防止用户修改对象定义不可变类:所有数据域私有;无set修改器方法;无访问器方法可以返回一个指向可变数据域的引用

this引用:指向调用对象本身

  • 引用类的隐藏数据域(数据域名被用作参数名);实例变量用this.i = i,静态变量用classname.i = i
  • 构造方法中通过this(参数表)调用参数多的构造方法,必须在任何语句前出现

类的抽象和封装: 将类的使用和实现分离        

对象的组合:一个对象包含同类不同类的多个对象

类的设计原则:内聚性;一致性;封装性;清晰性;完整性

 

继承:从原有的类派生出新类,子类从父类中继承可访问的数据域和方法(不包括构造方法),可以添加新的数据域和方法

        public class childclass  extends parentclass

  • Java只允许单一继承,多重继承通过接口实现;
  • 父类的私有数据域只能通过公共的set/get 方法来访问修改;
  • 子类要比父类包含过多的信息;
  • 不是所有的is-a 是关系 都用继承建模,eg.没有如何东西可以从矩形扩展到正方形;

关键字super:

  • 调用父类的构造方法  必须在子类构造方法的第一行  super()/super(parameters)

构造方法可以调用重载的构造方法或父类的构造方法,如果他们没有被显示调用会自动将super()作为第一行语句;

构造一个类的实例时,将会调用沿着及继承链的所有父类的构造方法,子类调用父类,父类调用父类的父类....;

最好为每一个类提供无参构造方法,便于扩展

  • 调用父类的方法   super.方法名(参数)   适用于父类方法被覆盖时

方法覆盖:子类需要修改父类中方法的实现

                 必须使用相同的签名以及相同的返回值类型;

                 仅当是实例方法并且可访问时才能被覆盖;

对象类Object:

java中的每一个类都源于java.lang.Object类

toString()方法:System.out.println(object)/(object.toString())

equals()方法:public boolean equals(Object obj) {  return this == obj}        子类覆盖应该使用equals(Object obj)

 

多态:使用父类对象的地方都可以使用子类对象,父类型的变量可以引用子类型的对象;每个子类的实例都是其父类的实例,总可以将子类的实例传给需要父类类型的参数

    当访问数据域或静态方法时,变量的声明类型决定在编译时匹配哪个方法;

    当引用变量调用实例方法时,变量的实际类型(被变量引用的对象的实际类)决定运行时使用方法的哪个实现;

动态绑定(实际类型): 假设对象o是类c1,c2,c3.....cn的实例,ci-1是ci的子类,cn是最通用的父类,c1是最特殊的子类,对象o调用一个方法,Java虚拟机会在依次类c1,c2,c3.....cn中查找方法的实现,调用第一次查找到的实现.

对象转换:总是可以把子类的实例转换为父类的变量;父类的实例转换为子类变量需要通过(子类名)进行显示转换

               eg.  ((Circle)object).getArea()         加圆括号

instanceof关键字:判断对象是否是类的实例 object instanceof classname

为了进行通用程序设计,把变量定义为父类型,这样可以接收任何类型的子类型的值

 

异常处理:将检测错误从处理错误中分离出来 

try {
    Code to try;
    Throw an exception with a throw statement or from method if necessary;
    More code to try; 
}
catch(type ex){
    Code to process the exception;
}

throw语句直接抛出异常或者调用一个可能会抛出异常的方法,调用catch块处理异常,然后执行catch块后的语句,任何情况下finally中的代码都会被执行。 

异常类型:Throwable类是所有异常类的根    ex.getMessage()/toString()/printStackTrace()/getStackTrace()获取异常信息

  • 系统错误:由Error类表示,内部系统错误,由java虚拟机抛出;若发生,仅能通知用户以及尽量稳妥的终止程序

             eg.LinkageError,VirtualMachError

  • 异常:Exception类表示,由程序和外部环境引起,能被程序捕获和处理.

            eg.ClassNotFoundException,IOException,RuntimeException

  • 运行时异常:RuntimeException类表示,程序设计错误,由java虚拟机抛出

eg.ArithmeticException当出现异常的运算条件时,抛出此异常

NullPointerException通过 null 引用变量访问一个对象,抛出该异常

IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出

IllegalArgumentException向方法传递了一个不合法或不正确的参数

声明异常:异常Exception类需在方法中显示声明;如果方法没有在父类中声明异常,就不能在子类中对其进行覆盖声明异常.

public void method() throws Exception1,Exception2,...,Exceptionn

抛出异常:创建一个正常异常类型的实例并抛出  throw new ex;

                异常类有两种构造方法:无参构造方法和带异常描述String参数的构造方法

捕获异常:如果异常没有在当前方法中被捕获,就被传给调用该方法的调用者,直到异常被捕获或被传给main方法;

如果一个catch块可以捕获一个父类异常对象,就能捕获那个父类的所有子类异常对象,catch块中异常类型顺序子类出现在父类前;

如果方法声明了一个必检异常,调用该方法时就必须在try-catch块中捕获异常,或者声明中要抛出异常

 

包装类:Boolean,Character,Integer,Double,Float,Byte,Short,Long

基本数据类型不作为对象使用,可以将基本数据类型并入对象或包装成对象

                   Integer intObject = new  Integer (5)/("5");等价于 Integer intObject = 5;

                                (需要对象自动装箱)(需要基本数据类型自动开箱)

 

包装类没有无参构造方法,可以用基本数据类型值或表示数值的字符串来构造包装类,所有包装类的实例都不可变

数值包装类:Integer,Double,Float,Byte,Short,Long

  • 常量MAX_VALUE,MIN_VALUE;
  • 都覆盖了在Object类中定义的toString和equals方法;
  • 都实现了Number类中定义的抽象方法doubleValue(),intValue(),floatValue(),longValue(),shortValue();
  • 都有一个静态方法valueOf(String s),该方法创建一个新对象,将其初始化为指定字符串表示的值,如Double.valueOf("12.14");
  • 都有两个重载的方法将数值字符串转换为以各种进制表示的数值,如parseInt(String s),parseInt(String s,int radix)

 

字符串,数组是对象;

对任意对象类型的数组进行排序:sort(int/double/char/stringArray)

 

BigInterger和BigDecimal类:大数和高精度浮点数计算

new BigInteger/BigDecimal(String s)

用obj1.add/subtract/multiple/divide/remainder(obj2)进行运算,使用compareTo进行比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值