面向对象基础

1.主要特性:封装性、继承性、多态性。

(1)封装性:①把对象的属性和行为看成一个密不可分的整体,将这两者”封装”在一个不可分割的独立单位(即对象)中;②”信息屏蔽”,把不需要让外界知道的信息隐藏起来。
(2)继承性:大大增强程序代码的复用性,提高了软件的开发效率。
(3)多态性:方法重载和覆写、对象的多态性。

2.类的基础

类是由属性+方法组成的。
对象的创建格式:

类名 对象名称=null;
对象名称 = new 类名();
或者 类名 对象名称= new 类名();

注:所有的对象名称都在栈内存中保存(比较准确的说法是栈中存放的是堆空间的地址),而对象的具体内容则保存在对应的堆内存中,必须使用关键字new才能开辟堆内存空间,在堆内存中保存着对象的属性信息。

访问对象中的属性或方法:

访问属性:对象名称.属性名();
访问方法:对象名称.方法名();

注:在对象使用之前必须实例化。

每当出现关键字new的时候必定表示开辟了新的堆内存空间。
引用数据类型就是指一段堆内存空间可以同时被多个栈内存指向。
★★引用传递就是将一个堆内存空间的使用权给多个栈内存空间,每个栈内存空间都可以修改堆内存的内容。
注:一个栈内存空间只能指向一个堆内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。

3.封装性

使用封装性:

属性封装:private 属性类型 属性名称;
方法封装:private 方法返回值 方法名称(参数列表){}

为了解决属性必须封装且又必须访问的矛盾,在Java开发中对于私有属性的访问有如下明确的定义:”只要是被封装的属性,则必须通过setter和getter方法设置和取得”。

4.构造方法

构造方法作用:为类中的属性初始化。
要注意以下几点:
①构造方法名称必须与类名称一致;
②构造方法的声明处不能有任何返回值类型的声明;
③不能在构造方法中使用return返回一个值。

只要调用关键字new实例化对象就会调用构造方法。
只要是类就必定存在构造方法,在Java中如果有一个类中没有明确地声明一个构造方法时,则在编译时会直接生成一个无参数的、什么都不做的构造方法。
构造方法同样是可以被重载的,只要每个构造方法的参数类型或参数个数不同,即可实现重载。

5.匿名对象

匿名对象:没有明确给出名称的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
匿名对象在使用一次后就等待被垃圾收集机制回收。
在实际开发中基本上是作为其他类实例化对象的参数传递的,实际上匿名对象就是一个堆内存空间,对象不管是匿名还是不匿名,都必须开辟堆内存空间之后才可以使用。

6.String

(1)实例化String对象:
①直接赋值:String name=”hello”; 并不会再多开辟堆内存空间;
②调用String类中的构造方法:String name =new String(“hello”); 每调用一次,开辟一次堆内存。
一个字符串就是一个String类的匿名对象,匿名对象就是开辟了堆内存空间并可以直接使用的对象。一个字符串是可以调用String类中的方法的。
String str1=”hello”实际上就是把堆中开辟的堆内存空间的使用权给了str1对象,好处是如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会再重新开辟空间,而继续使用已经开辟好的堆内存。
注:其实在Java中会提供一个字符串池来保存全部的内容。
对于String的这种情况,在Java中称为共享设计,设计思路是:在Java中形成一个对象池,在这个对象池中保存多个对象,新实例化的对象如果已经在池中定义了,则不再重新定义,而从池中直接取出继续使用。

(2)基本数据类型可以通过”==”进行内容的比较,而String却用”==“进行地址比较。
String如果想进行内容比较需使用equals方法,即str1.equals(str2);

(3)在使用String类进行操作时需注意字符串的内容一旦声明不可改变。
而一个String对象内容的改变实际上是通过内存地址的”断开-连接”变化完成的,而本身字符串中的内容并没有任何的变化。

(4)常用方法
①字符串可以使用toCharArray()方法编程一个字符数组,也可以使用String类的构造方法把一个字符数组变为一个字符串。
②使用charAt()方法取出字符串指定位置的字符。
③通过getBytes()方法将String变为一个byte数组,使用String类的构造方法把一个字节数组重新变为字符串。
④使用length()方法取得字符串的长度。
⑤使用Index()方法可以返回指定的字符串的位置,如果不存在则返回-1.
⑥使用trim()方法可以去掉字符串的左右空格。
⑦两个substring()方法,一个是从指定位置截取到字符串结尾,一个是截取指定范围的内容。
⑧通过split()方法进行字符串的拆分操作,拆分的数据将以字符串数组的形式返回。
⑨字符串的大小写转换toUpperCase()和toLowerCase()
⑩使用startsWith()可以判断字符串是否以指定的内容开头,使用endsWith()方法可以判断字符串是否以指定的内容结尾。
⑾通过equals()方法进行字符串内容的比较,但是它是区分大小写的,而要完成不区分大小写的可以使用equalsIgnoreCase()方法。
⑿使用replaceAll()方法将字符串的指定内容进行替换。

7.引用传递

引用传递就是将堆内存空间的使用权交给多个栈内存空间。
在对象引用传递上也可以在一个类中接收自己本来对象的实例,而且接收完之后,可以方便地将此对象直接进行本类中封装属性的访问。这种形式的引用传递一般在对象比较时才会使用。

8.this关键字

使用this可以:
①强调调用的是本类中的方法;
②表示类中的属性;
③调用本类的构造方法;
④表示当前对象(最重要的特点)。

在使用this调用构造方法时需注意:只可在构造方法中调用构造方法,且在首行。
由于构造方法是在实例化对象时被调用的,也就是说在类中的所有方法中,只有构造方法是被优先调用的,所以使用this调用构造方法必须也只能放在构造方法的首行。
注:this调用构造方法时一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。一般都会将无参构造方法作为出口。

9.static关键字

属性被所有对象共享,就可以将其声明为static属性,而且一个属性使用了static关键字声明后,可以直接使用类名称进行访问。如果一个类中的方法想由类调用,则可以声明为static方法。
在程序中使用static属性,则称属性为全局属性(静态属性)。

在Java中常用的内存区域:
栈内存空间:保存所有的对象名称(比较准确的说法是栈中存放的是堆空间的地址)。
堆内存空间:保存每个对象的具体属性内容。
全局数据区:保存static类型的属性。
全局代码区:保存所有的方法定义。

类属性的调用:

类名称.static的属性名称

类方法的调用:

类名称.static的方法

注:非static声明的方法可以调用static声明的属性或方法,但是static声明的方法是不能调用非static类型声明的属性或方法的。

10.main方法的理解

public static void main(String []args)为Java程序的入口方法,JVM在运行程序时,会首先查找main()方法。
public表明任何类或对象都可以访问这个方法
static表明main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动时就是按照上述方法的签名(必须有public与static修饰,返回值为void,方法的参数为字符串数组)来查找方法的入口地址,若能找到,就执行;找不到,则会报错
void表明方法没有返回值
main是JVM识别的特殊方法名,是程序的入口方法
字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段

通常来讲,要执行一个类的方法,必须先实例化一个类对象,然后通过类对象来调用这个方法。但main()是入口方法,此时还没有实例化对象。

(1)main()方法的其他定义格式:
a.public与static无顺序关系 static public void (String []args)
b.public static final void main(String []args)
c.public static synchronized void main(String []ars)
不管哪种定义方式,都必须保证main()的返回值为void,并用static与public修饰。同时main()为入口方法,不能用abstract修饰
(2)同一个.java文件是否可以有多个main()方法?
虽然每个类中都可以定义main()方法,但是只要与文件名相同的用public修饰的类的main()方法才能作为整个程序的入口方法.

注:System.exit(1)表示系统退出,只要在exit()方法中设置一个非零数字,则系统执行到此语句之后将退出程序。
如果一个方法要由主方法直接调用,则必须按以下格式声明:”public static 方法的返回值类型 方法名称(参数列表){}”。

11.代码块

代码块就是指使用”{}”括起来的一段代码,根据位置及声明关键字的不同,代码块可以分为普通代码块、构造块、静态代码块、同步代码块4种。
普通代码块:直接在方法或语句中定义的代码块。
构造块:直接写在类中的代码块。
静态代码块:使用static关键字声明的代码块。
注:静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。

12.单例模式

构造方法私有化可以实现单例设计模式,即无论程序怎样进行,该类永远只会有一个实例化对象产生。

class Singleton
{
    private static Singleton instance=new Singleton();
    private Singleton
    {
     }
    public static Singleton getInstance()
    {   
        return instance;
    }
    public void print()
    {
        System.out.println("Hello World!!!");
    }
}

public class SingleDemo05
{
    public static void main(Sting args[])
    {
        Singleton s1=Singleton.getInstance();
        Singleton s2=Singleton.getInstance();
        Singleton s3=Singleton.getInstance();
        s1.print();
        s2.print();
        s3.print();
    }
}

13.对象数组

数组一定要先开辟空间,但是因为其是引用数据类型,所以数组中的每一个对象默认值都是null值,则在使用时数组中的每一个对象都必须分别进行实例化操作。
静态初始化:Person per[]={new Person(“张三”),new Person(“李四”)};
动态初始化:Person per[]=new Person[2];
per[0]=new Person(“张三”);
per[1]=new Person(“李四”);
注:主方法中的String args[]就是对象数组。

14.内部类

(1)内部类的唯一好处就是可方便地访问外部类的私有属性。
(2)内部类可以声明成private或public,当内部类被声明成private或public,对其访问的限制与成员变量和成员方法完全相同。
(3)内部类的存在其实破坏了一个类的基本结构,因为类是由属性和方法组成的。
(4)使用static声明的内部类,就相当于变成了外部类,但是用static声明的内部类不能访问非static的外部类属性。
(5)一个内部类除了可以通过外部类访问,也可以直接在其他类中进行调用。
在外部类访问内部类:

外部类.内部类 内部类对象=外部类实例.new 内部类();

(6)在方法中定义一个内部类,但是在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数要想被内部类所访问,则参数前必须加上final关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值