这几天认真地研究了一下类与对象,有很大的收获,所以在这以博客的形式和大家分享一下我的心得,不足之处还希望大家多提建议,有帮到读友的部分的话我也是很开心,接下来就是总结了。
一:面向对象编程
三大特点:继承,封装与多态
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让可信的类或者对象操作,对不可信的进⾏信息隐藏。简⽽⾔之就是,内部操作对外部⽽⾔不可⻅(保护性)
继承是指这样⼀种能⼒:它可以使⽤现有类的所有功能,并在⽆需重新编写原来的类的情况下对这些功能进⾏扩展。
所谓多态就是指⼀个类实例的相同⽅法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接⼝。(利⽤多态可以得到良好的设计)
二:类与对象
一个类的定义中,一般包括几个部分。
1.类的属性。2.类的构造函数.。3.成员方法。
例如:
class TestDome{ private String name; // 成员属性 private int age; public TestDome(String name,int age){ this.age = age; this.name = name; //构造函数 } public TestDome(String name){ this.name = name; //构造函数 } public void Studay(){ System.out.println(this.name+" "+this.age+" "+"我爱学习"); } //成员方法 } public class Test { public static void main(String[] args) { TestDome testDome = new TestDome("小明",18); //实例化对象 TestDome testDome1 = new TestDome("小红"); testDome.Studay(); testDome1.Studay(); } }
运行结果:
其中,构造函数可以重载,具体的差异在参数的个数中体现。
Person:基类--》父类--》超类
Student:派生类--》子类
1、派生类继承了基类,继承了什么东西?
除构造函数外的其他东西。
派生类需要帮助基类构造
2、super
super();//调用基类的构造函数
spuer.data;//访问基类的属性
super.func()//调用基类的成员函数
不允许被继承,密封类
final class B{
}
密封方法 ===》不能被重写
public final void func() {
System.out.println("Person.func()");
}
三:this
如何理解this?
它是对当前对象的引用,以下是他的作用:
1.调用属性
2.调用函数
3.调用构造函数(必须放在第一句)
代码例子:
class TestDome{ private String name; // 成员属性 private int age; public TestDome(String name,int age){ this.age = age; this.name = name; //调用属性 } public TestDome(){ this("小王",20); } //调用构造函数 public void Fun(){ this.Studay(); } //调用方法 public TestDome(String name){ this.name = name; //构造函数 } public void Studay(){ System.out.println(this.name+" "+this.age+" "+"我爱学习"); } //成员方法 }
四:对象属性的初始化方式
对象属性的初始化方式
1.提供一系列的get 和 set 方法
2.提供合适的构造函数 (对象的产生需要以下几步,2步, 1 为对象开辟内存,2. 调用合适的构造函数 构造函数不只有一个)
3.静态代码块和实例代码块
static{} 静态代码块 {} 实例代码块
注意:
静态代码块只会被初始化一次 在打印时静态代码块 跑在第一位 接着是实例代码块 最后为构造函数实例化
五:数组的拷贝方式
数组的拷贝有以下4种方式
for\ clone()\ system.arraycopy()拷贝最快 (底层函数由 native 所修饰 底层函数由C/C++完成 效率最高)\ Arrays.copyOf()
1.for循环拷贝
int[] arr = {1,2,3,4,5,6,7,8,9,10}; int[] arr1 = new int [10]; for (int i = 0; i < arr.length ; i++) { arr1[i] = arr[i]; } System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(arr1)); }
2.Arrays.copyOf()
例如:arr1 = Arrays.copyOf(arr,10);
3.clone()
例如:arr1 = arr.clone();
4.system.arraycopy()
例如:System.arraycopy(arr,0,arr1,0,10); 目标数组,目标数组拷贝起始地址,目的数组,目的数组的保存起始地址,拷贝长度
他们对于基本类型来说都是是深拷贝(对拷贝对象的值没有影响)
2. array2 = array.clone(); 原地址消失,新建一个地址克隆目标数组 4种拷贝方式对于引用类型来说是浅拷贝
函数被static 所修饰,谁在前谁先使用
第二部分:
内部类
1.成员(实例内部类) 静态 方法 匿名 内部类 4种
class InnerClass{
}
class OuterClass{
}
4种访问权限 protected public private 包访问权限
在构造函数中 没有有修饰的变量的访问权限默认为包访问权
一:实例内部类
问题1:如何访问实例内部类?
通过外部类对象访问
实例内部类无法定义static 的数据成员 可以 使用final 完成
如果先初始化实例内部类,会引起初始化异常,static 先进行初始化,而实例内部类则是后初始化
final是在编译期间就确定的值
例如: public static final int a = 100;
问题2:实例内部类对象是否哟额外的内存消耗?
有额外的消耗 外层内部类的this 访问权限
二:静态内部类
静态内部类的访问只需要点(.)出来
静态内部类能否访问外部类的实例数据成员
可以 在内部类中拿到一个外部类对象 并且有参数
例如:System.out.println(this.out.data2);
三:本地(局部)内部类
先写一个外部类
包含 元素 构造函数 方法
在定义一个类 (在方法的内部定义一个类)
这就是本地的内部类
四:匿名内部类
回调函数
Ctrl+O IDEA 重写的快捷键在方法的内部
五:继承 extends
作用:代码的重用性
具体实现:继承了除了构造函数之外的其他的东西
操作代码例:
super(age,name) 调用基类的构造函数 必须放在第一行
super.data;访问基类的属性
super.func();调用基类的成员函数
invokespecial 代表构造函数
invokevirtual 普通的方法 虚函数
invokestatic 静态方法
overload 重载 函数名相同 参数列表不同 返回值不要求
override 重写 函数名相同 参数列表相同 返回值相同
六:多态
基类引用派生类的对象并且基类和派生类有同名的覆盖方法 (向上转型)
也就是重写方法 方法表地址的覆盖
向下转型需先进行 向上转型
运行时多态 动多态
静多态 : 调用静态函数
方法表在编译时生成
class对象在方法区 保存的是对象的RTTI信息 runtime type infomation
和类型一一对应
final 加上之后不可修改,(不能被重写) 不允许被继承 这是代表密封类