java之面向对象20160818

本文主要是介绍一下java面向对象编程方面的知识,涉及的内容可能有点多,所以可能会感觉比较笼统,详细请参见《Java编程思想》里面比较具体点。

1.面向对象

和遵循设计原则和设计模式,

目标都是为了消除程序中的重复代码

重复代码一般是放在父类中的

Dog dog=new Dog()

左边是创建一个Dog的引用,右边是创建Dog的一个对象,这个过程是对象实例化也就是把对象的赋值给引用(相当于创建了一个结构体变量并进行了初始化)

创建对象就相当于给结构体进行初始化,创建后除了分配了内存,构造函数被调用,其中的方法也可以被调用了(除了加了static的方法,因为加了是静态的,就不需要创建也能调用了),相当于结构体里面的函数指针对初始化了,可以被使用了

2.super和this

简单理解,super是指向父类的,this是指向当前类(对象)的,

(super.xx是调用父类的方法,this.xx是调用子类当前类的方法)

3. 抽象类和抽象函数

抽象函数里面是没有函数体的,定义抽象函数必须是在抽象类里面,

但是抽象函数可以给子类使用进行复写(关键字@ overwrite)

(子类对父类中的函数进行复写),

创建一个对象就分配了内存,同时就会自动调用了构造函数,当子类创建对象时,父类必须也是创建了对象的(为了保证子类创建对象父类也创建了对象调用了构造函数,子类的构造函数中加一个super()就会去调用父类的构造函数,对父类进行了对象创建),

所以虽然抽象类是不可以被创建对象的,但是抽象类的子类创建对象后,抽象类就会被创建了抽象函数,同时父类的构造函数也就会被调用(等于自动在子类的构造函数中加了super())

4.包(软件包)

就是相同名字的类放在不同的文件夹,一个包里就是一个文件夹里有类

在类的前面加一行打包关键字,表示当前的类放在一个包里

执行的时候要注意,带上包名,即包名.类名

包名都要小写,

package org.mars 就会生成一级级的目录,也就是先org然后里面是mars目录然后里面才是类

5.接口(类似C中的钩子函数)---很重要

特殊的类,特殊的抽象类,里面全是抽象函数,使用interface定义,省略了class,

同时抽象函数都是Public权限(即使写了其他的也是public)的

通过继承接口(类),来复写抽象函数,然后生成子类的对象

class usbphone implements USB{

}

使用implements不再是extends,这里继承接口(特殊的继承),也叫实现接口(要复写抽象函数),因为接口里面都是抽象的并没有具体

例子:

interface Usb{

public void read();

public void write();

}

定义子类实现:

class Phone implements Usb{

public void read(){

system.out.println();

}

public void write(){

system.out.println();

}

}

使用方法

class Test{

public static main(String args[]){

Phone phone=new Phone();

Usb usb =phone;//向上转型:把子类的对象赋值给父类的引用

usb.read();//这样父类对象就实例化了,父类中的函数就可以被调用了

}

}

向上转型:把子类的对象赋值给父类的引用

一个类只能有一个父类,单继承

但是一个类可以实现多个接口,一个接口可以继承多个接口

一个类可以实现多个接口:

interface WiFi{

void open();

void read();

}

class Phone implements Usb,WiFi{

public void read(){

system.out.println();

}

public void write(){

system.out.println();

}

public void open(){

system.out.println();

}

public void write(){

system.out.println();

}

}

class Test{

public static main(String args[]){

Phone phone=new Phone();

Usb usb =phone;//向上转型:把子类的对象赋值给父类的引用

usb.read();//这样父类对象就实例化了,父类中的函数就可以被调用了

WiFi wifi =phone;//向上转型:把子类的对象赋值给父类的引用

wifi.close();//这样父类对象就实例化了,父类中的函数就可以被调用了

}

}

一个接口可以继承多个接口:这里是继承不是实现,因为没有复写

interface A{

void funa();

}

interface B{

void funb();

}

interface C extends A,B{//这样C中就包含A,B中的方法,当实现C的时候就要复写A,B中的,也就是三个方法都要复写

void func();

}

6.工厂设计模式:

Class Test{

public static main(String args[]){

Printer printer=null;//类来创建对象(一个引用 左边),对象等于null就是还未实例化,对象等于new出来空间的地址或者等于一个地址就是对象的实例化(获得实例化对象)

int flag=1;

if(flag==0)

printer=new HpPrint();//向上转型

else if(flag==1)

printer=new CanPrint();

printer.open();//由于向上转型了,父类对象实例化了,所以父类中的方法可以调用了

printer.print("ets");

printer.close();

}

但是这个程序还有问题,当不断添加打印机就要不断对该打印机类型的对象实例化,并增加if else 如果很多个增加就麻烦了,代码很多。。。

一般对于重复代码,就是封装到函数里,然后来调用,可以通过参数来获得想要的,好处就是不用每次出现这段代码的地方都修改,而是只是修改函数里面的就可以了:(这就是所谓的工厂设计模式,需要的时候给参数到工厂,然后工厂根据你给的参数生产出你要的)

还有好处,对于使用者不知道内部有哪些子类,也不用关心内部有那些子类,对于开发来说就可以对于子类随时可以删除修改一下工厂就好了,外部提供的地方不用修改

Class Printfactory{

public static Print getPrinter(int flag){

Printer printer=null;//类来创建对象(一个引用 左边),对象等于null就是还未实例化,对象等于new出来空间的地址或者等于一个地址就是对象的实例化(获得实例化对象)

int flag=1;

if(flag==0)

printer=new HpPrint();//向上转型

else if(flag==1)

printer=new CanPrint();

return printer;

}

Class Test{

public static main(String args[]){

int flag=1;

Printer priner=Printfactory.getPrinter(flag);

printer.open();//由于向上转型了,父类对象实例化了,所以父类中的方法可以调用了

printer.print("ets");

printer.close();

}

7.异常  (有点类似中断)

JAVA中所有东西都是对象,同理异常也是一个对象

产生事件,就会生成一个异常对象

有可能出现异常的代码放在TRY里面,处理异常代码放在catch,finally里面主要是放一些释放资源的代码

try里面出现异常就会执行catch里面的代码,没出现异常就不会执行catch里面的代码,finally里面的代码不管出现不出现都会执行

throw ,throws抛出异常

class User{

private int age;

public void setAge(int age){

if(age<0)

{

RuntimeException e=new RuntimeException("年龄不能为负数");//创建一个异常对象(属于unChecked Exception,不需要用try catch处理,如果是Exception和它的子类除了RuntimeException,用这些checkedException就需要用try catch处理,如果还不想使用try catch,就加声明也就是throws,让谁调用谁处理)

throw e;//抛出这个异常对象,当JAVA虚拟机收到这个异常对象,会终止这个程序运行,并打印

}

this.age=age;

}

}

class User{

private int age;

public void setAge(int age)throws Exception{//checkException还不想使用try catch,就加声明也就是throws,让谁调用谁处理)

if(age<0)

{

Exception e=new Exception("年龄不能为负数");//创建一个异常对象

throw e;//抛出这个异常对象,当JAVA虚拟机收到这个异常对象,会终止这个程序运行,并打印

}

this.age=age;

}

}

调用的地方处理:

class Test{

public static main(String args[]){

User user=new User();

try{

user.setAge(-20);

}

catch(Exception e){

system.out.println(e);

}

}

}

8.JAVA当中的IO

InputStrem OutputStream是所以字节流的父类,都是抽象类

子类有

FileInputStream FileOutputStream

例如:

OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());

InputStream mmInStream = null;

mmInStream = socket.getInputStream();
if( (bytes = mmInStream.read(buffer)) > 0 )
{
    byte[] buf_data = new byte[bytes];
    for(int i=0; i<bytes; i++)
    {
        buf_data[i] = buffer[i];
    }
    String s = new String(buf_data);
    ForView.setText(s);
}
mmInStream.close();

9. 内部类和匿名内部类

内部类:

定义在一个类的里面:

假设B定义在A里面:

A a=new A();

内部类则是:

A.B b=new A().new B();

this默认是当前类的成员,如果使用外部类就要A.this.i这样来

匿名内部类:

是内部类,但是没有名字

class B{

public void fun(A a){

System.out.println();

a.doSomething();

}

}

class Test{

public static main(String args[]){

B.b=new B();

b.fun(new A(){//这里就是一个类,匿名内部类,相当于这里定义一个实现A接口的子类,这样A就可以NEW出来了

public void dosomething(){

System.out.println();

}

})

}

}

10.线程:

class FirstTread extends Thread{

public void run(){

system.out.println();

}

}

class Test{

public static main(String args[]){

FirstTread firstthread=new FirstTread();//创建线程

firstthread.start()//线程就绪运行

}

}

第二种方法:(由于继承只能使用一次,所以能不用就不用,所以第二种用的多些)

class Runnabletmp implements Runnable{

public void run(){

}

}

class Test{

public static main(String args[]){

Runnable runable=new Runnable();//生成一个实现接口的对象

Tread t=new Thread(runnable);//并将对象传进去(相当于结构体变量传进去)

t.start();

}

}

控制函数:

Tread.sleep()  Thread.yield()

getPriority() setPriority();

线程最大优先级10最小1,可以使用Thread.里面提供的静态常量当参数进行设置

时间: 2024-10-24 15:45:53

java之面向对象20160818的相关文章

Java基础——面向对象练习题

1.建立一个图形接口,声明一个面积函数.计算圆形和矩形的面积.注:体现面向对象的特征,对象值进行判断,用异常处理.不合法的数值需要出现"这个数值是非法的提示",不再进行运算. 2.在一个类中编写一个方法,这个方法搜索一个字符数组是否存在某个字符.如果存在则返回这个字符在数组中第一次出现的位置,否则返回-1.需要搜索的字符数组和字符都一参数的形式传递给该方法.如果传入的数组为NULL,则应该抛出IllegalArgumentException异常. 3.补充compare函数代码. 4.

关于java中面向对象编程的一点点小感悟!!!

断断续续接触java已经有半年的时间,当然中间也有过很多事情,不得已而中断了java的学习.当初刚刚接触到java的时候,总是不能理解java的面向对象编程优点.平常生活中我们做事情的思维方式都是面向过程的,就拿最简单的我要上一个培训班来说: 第一步:当然得是网上.贴吧.朋友的口中来了解这个辅导班,以此来决定是否需要上这个辅导班. 第二步:当然就是当了解完成之后,对这个辅导班比较满意.自己就需要做准备来达到辅导班的要求,比如说学费.复习知识,准备参加辅导班规定的考试. 第三步:当然就是付诸实践,

JAVA的面向对象编程--------课堂笔记

JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.   为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参

Java入门——面向对象基础(一)

Java入门——面向对象基础(一) 本博客目的 练习题(重要) 面向对象的概念(了解) 面向对象的三大特性(重要) 2016-09-10——13:13:39 ll练习题 用方法调用的形式进行数组排序 1 package Sep10; 2 //调用方法完成两个整形数组的排序并打印 3 public class ArrayRefDemo03 { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 // T

java基础面向对象之封装

java基础面向对象之封装 2017-01-15 封装 1)封装性就是保证类内部被外部类不可见 2)所有属性都必须使用private关键字声明 3)封转后的属性如果要被外部所访问就必须实现set和get方法 例如: 使用了private声明的属性只有在自己的类是可见的 1 class Book{ 2 private String title ; //使用private声明的属性 3 private int price ; 4 } 5 public class PrivateDemo1 { 6 p

《head first java》值得Java或面向对象基础的新手看。

看完这本书后本人收获良多. 内容对Java以及面向对象的入门者非常友好. 抽象的内容惯用图解的方法来剖析,通俗易懂 之前看C#入门经典的面向对象时,依然浓浓的一头雾水. (1)很不解为何实例化要写成A a  = new A(); 不解为何“A要重复写两次”: 不解为何“等号两边都有A,感觉它就像在说‘A=A’这样的废话一样”: (2)不知道什么是多态性,为什么是面向对象的特点,有什么好处等等. (3)不知道被抽象(abstract)修饰的类,修饰类到底是什么个东西. 后来明白了,抽象类就是不能被

java基础面向对象之类与对象

java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 ?封装性:保护内部结构的安全性 ?继承性:在已有的程序结构上扩充新的功能 ?多态性:在某一个该娘范围内满足 2)面向对象开发分为以下几个步骤: OOA(面向对象分析) OOD(面向对象设计) OOP(面向对象编程) 2.类与对象 1)了解类与对象的关系 ?认识类与对象 类与对象是整个面向对象之中最基础的组成单元,类是共性的一个集合,而对象是某一

java基础面向对象之this关键字

java基础面向对象之this关键字 2017-02-14 this的核心概念: this关键字在java中表示当前对象. this关键字的主要用法: 在java中利用this关键字可以实现类属性的调用,类方法的调用,当前对象. 一.调用属性 1 class Book{ //Book类 2 private String title ; //title属性 3 private int price ; //price属性 4 5 public Book(String t , int p){ 6 ti

java之面向对象---上

1:值类型 八大类型:整性—>byte(1字节),short(2字节),int(4字节),long(8字节): 浮点数—>float(4字节)--8位整,23位小数,1位符号:double(8字节)--11位整数,52位小数,1位符号 字符—>char(2字节)---汉语的原因吧 逻辑型—>bool(1bit) 其它数据类型:类类型. 存储方式:8大类型变量存储于栈中:是值类型 类类型变量,是引用类型,对象存放于堆中,在栈中存引用值,大小固定为4字节. 只能通过new来构造对象,不