3.1面向对象的概念
1.封装性: 面向对象核心思想,将对象的属性和行为封装起来,不让外界知道具体实现细节.
2.继承性: 主要是描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类进行扩展.
3.多态性: 指在程序中允许出现重命名现象,,它指在一个类中定义的属性和方法被其他类继承后,它们可以具有不同的数据类型或者表现出不同的行为.这使得同一种属性和方法在不同的类中具有不同的语意.
3.2.1类与对象
类: 是对某一类事物的抽象描述
对象: 用于表现现实中该类事物的个体.
类和对象的关系: 类是对象的抽象, 对象是类的具体.
类中可以定义成员变量 和 成员方法.
成员变量: 用于描述对象的特征,也称为属性.
成员方法: 用于描述对象的行为, 简称方法.
局部变量: 定义在方法中的变量.
public class t {
int age = 10; //成员变量
void speak(){
int age =60; //局部变量 与 成员变量 同名
System.out.println("age="+age); // 在方法中 访问的是局部变量, 打印输出60
}
}
3.2.2 对象的创建与使用
在java程序中可以使用 new 关键字 来创建 对象.
格式: 类名 对象名称 =new 类名();
例如: Person p = new Person();
new Person 用于创建Person类的实例对象
Person p则是声明了一个Person类型的变量p
public class t {
public static void main(String[] args) {
Person p1 = new Person(); //创建第一个Person对象
Person p2 = new Person(); //创建第二个Person对象
p1.age=18; //为P1指向的Person对象 的 age属性赋值
p1.speak();
p2.speak();
}
}
打印结果: age =18
age =0
结论1: 给p1赋值和p2没有关系, 这是两个实例对象.
结论2: 没有给p2赋值, 打印age = 0. 这是因为在实例化对象时,java虚拟机会自动为成员变量进行初始化.针对不同类型的成员变量,Java虚拟机会赋不同的初始值.
成员变量 初始值
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0D
char 空字符,'\u0000'
boolean false
引用数据类型 null
注意: 当没有任何变量引用这个对象时,它将成为垃圾对象,不能再被使用.
{
Person p1 = new Person();
}
变成垃圾: 上面这个代码变量p1引用Person类型变量, 当这段代码运行完毕时,变量p1就会超出其作用域而被销毁.
Person类型对象没有被任何变量引用,变成垃圾.
第二段代码
class Person {
void say() {
System.out.println("我是一个人");
}
}
class t {
public static void main(String[] args) {
Person p2 = new Person(); // 创建Person对象
p2.say(); // 调用say方法
p2 = null; // 将Person对象设置为null
p2.say();
}
}
输出异常: java.lang.NullPointerException
在java中null是一种特殊的常量,当一个变量的值为null时,表示该变量不指向任何一个对象.
当把变量p2设置为null时候,的Person对象失去引用, 成为垃圾对象.
3.2.3 类的设计
3.2.4 类的封装
在设计一个类时,应该对成员变量的访问做出一些限定,不允许外界随意访问,这就是类的封装
使用private关键字来修饰属性 私有属性只能在 它所在的类中被访问.
为了能让外界访问私有属性,需要提供一些使用public修饰的共有方法.
setxxx
getxxx
3.3 构造方法
在实例化对象的 同时 就为这个对象的属性进行赋值,
构造方法是类的一个特殊成员,它会在类的实例化对象时自动调用.
构造方法的定义:
1,方法名与类名相同
2,在方法名的前面没有返回值类型的声明
3,在方法中不能使用return语句返回一个值
3.3.2构造方法的重载
与普通方法一样, 构造方法也可以重载,
在一个类中可以定义多个构造方法, 只要每个构造方法的参数类型或参数个数不同即可.
如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的 无参的 构造方法.
如果自己在类中定义了构造方法, 系统就不会自动创建 默认无参的构造方法, 需要自动手动创建无参构造.
3.4 this 关键字
同过this关键字可以明确地访问一个类的成员变量,解决局部变量名称冲突问题
可以同this关键字调用成员方法
可以用this([参数1,参数2...])的形式来调用其他构造方法
只能在构造方法中使用this调用其他构造方法,
在构造方法中,使用this调用构造方法的语句必须放在第一行,且只能出现一次.
不能在一个类的两个构造方法中使用this互调用.......会产生调来调去,调不清楚的问题.....
3.5垃圾回收
当对象成为垃圾后, 仍然会占用内存空间,时间一场就会导致内存空间不足.
java有垃圾回收机制.java虚拟机会自动回收垃圾对象占用的内存空间
除了等待java虚拟机自动垃圾回收,也可以通过调用System.gc(); 通知java虚拟机立即进行垃圾回收
当一个对象在内存中被释放,它的finalize()方法会被调用
3.6 static关键字
java中,定义一个static关键字,它用于修饰类的成员,如成员变量,成员方法以及代码块
3.6.1 静态变量
通过static修饰的变量,在内存中只存在一份,而且所有的实例对象所共享
举个例子
class Person {
static String scholName;
}
class t {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(); // 创建Person对象
Person.scholName="北大";
System.out.println(p1.scholName);
System.out.println(p2.scholName);
}
}
static关键字只能用于修饰成员变量,不能用于修饰局部变量.
3.6.2静态方法
在方法面前加上static关键字,可以使用"类名.方法名"的方式来访问,也可以通过类的实例对象来访问.
class Person {
public static void sayHello() { // 定义静态方法
System.out.println("hello");
}
}
class Test {
public static void main(String[] args) {
Person.sayHello();
}
}
注意, 在静态方法中,只能访问用static修饰的成员, 因为没有被static修饰的成员需要先创建对象才能访问,而静态方法被调用可以不用创建任何对象.
3.6.3静态代码块
在java中,使用一对大括号包围起来的若干代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块.
类被加载时,静态代码块会执行. 类只加载一次,所以静态代码块也只加载一次
静态代码块 用于成员变量的初始化.
3.7内部类
在java中,允许在一个类中定义类,称作内部类.可以分为,成员内部类,静态内部类,方法内部类.
3.7.1成员内部类
在一个类中除了定义成员变量,成员方法,还可以定义类.
在成员内部类中可以访问外部类的所有成员.
3.7.2静态内部类
可以使用static关键字来修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化,
在静态内部类中只能访问外部类的静态成员
在静态内部类中可以定义静态成员,而在非静态的内部类中不允许定义静态的成员.
3.7.3方法内部类