面向对象学习

面向对象与面向过程的区别

面向过程思想适合简单、不需要协作的任务,

面向对象需要很多协作才能完成,面向对象就应运而生了。

object(对象),instance(实例)

  1. 都是解决问题的思维模式,都是代码组织的方式

  2. 解决简单问题可以使用面向过程

  3. 解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程。

对象是什么,对象和数据管理

事物的发展总是遵循“量变引起质变”的哲学原则,起初是并不需要对象的,

  1. 数据无管理时代:不做任何管理

  2. 数据管理和企业部门制:因此有了数组的概念

  3. 对象和企业项目制:项目组合一个独立的公司差不多,例如腾讯微信组

对象是包含了不同类型的数据

对象和类的关系、属性、成员变量、方法

对象和类的概念

类(class)可以看做是对象的模板

抽象是抽出像的部分形成一个类,某个类的对象,某个类的实例是一样的意思。

类中包括属性(成员变量)和方法,

只有属性没有方法,只能叫做结构体。

一个典型类的定义和类的UML图

看到new " " 就代表创建一个对象

构造方法,用于创建这个类的对象,无参的构造方法可以由系统自动创建

UML图直观的表示一个类的结构。

内存分析

Java虚拟机的内存可以分为三个区域,栈(stack),堆(heap)、方法区(method area),方法区也在堆中

  1. 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3. 栈属于线程私有,不能实现线程间的共享!
  4. 栈的存储特性是“先进后出,后进先出”
  5. 栈是由系统自由分配,速度快!栈是一个连续的内存空间。

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM 只有一个堆,被所有线程共享
  3. 堆是一个不连续的空间,分配灵活,速度慢

方法区

  1. JVM只有一个方法区,被所有线程共享。
  2. 方法区实际也是堆,只是用于存储类、常量相关的信息!
  3. 用来存放程序中永远是不变或唯一的内容。(类信息,class对象、静态变量、字符串常量等)

构造方法

构造器也叫构造方法,用于对象的初始化

构造方法的第一句总是super,即使不书写,编译器也会自动添加

要点:

  1. 通过new关键字调用
  2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里面使用return返回某个值
  3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数,如果已定义则编译器不会自动添加!
  4. 构造器的方法名必须和类名一致。

return作用:1. 结束方法运行,

  1. 返回值。

垃圾回收机制

  1. 发现无用的对象。

  2. 回收无用对象占用的空间。

垃圾回收相关算法

  1. 引用计数法:缺点是循坏引用的无用对象 ,无法被识别
  2. 引用可达法(根搜索算法):较为常用。

通用的分代垃圾回收机制

年轻代、年老代、持久代

等学到一定程度 ——回看067 开发中容易造成内存泄漏的操作。

this关键字

对象创建的过程

  1. 分配对象空间,并将对象成员变量初始化为0或为空

  2. 执行属性值的显示初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

this的本质

就是创建好的对象的地址,由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表当前对象。

构造器的调用只能位于第一列

this不能用于static方法中 ,this指的是当前对象

static关键字

static ‘静态’的意思,用static声明的成员变量为静态成员变量,也称为类变量,类变量的生命周期和类相同,在整个应用程序执行期间都有效

static修饰的成员变量和方法,从属于类

普通变量和方法从属于对象

静态方法无法使用非静态的方法。

静态方法可以使用静态变量

把普通与静态看做汽车和汽车的设计图纸作比加深理解。普通方法可以调用静态方法,好比有汽车必有图纸。

静态初始化块(讲完继承回头再看一遍)

静态初始化块用于类的初始化。

继承树的追溯

参数传值机制

Java中所有参数传值都是值传递,也就是传递的值的副本,传递的是地址的拷贝

public class test {public static void main(String[] args) {User4 u1=new User4(100,"高小七");u1.testParameterTransfer01(u1);System.out.println(u1.name);}public static class User4{int id;String name;String pwd;public User4(int id,String name){this.id = id;this.name=name;}public  void testParameterTransfer01(User4 u){u.name="高小八";}}
}

Java包机制

包机制是Java中管理类的重要手段。开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理,包对于类,相当于文件夹对于文件的作用。

包名位于第一句,一定是非注释性的语句。

import详解

静态导入

加*代表导入所有类。

面向对象三大特征

继承

继承(extends),子类是父类的拓展,

Java中只有单继承,Java的接口可以多继承

子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问,比如,父类私有的属性和方法。

方法的重写override

子类通过重写父类的方法,可以用自身的行为替换父类的行为

方法重写的要点:

  1. ==:方法名,形参列表相同
  2. “<=”:返回值类型和声明异常类型,子类小于等于父类
  3. “>=”:访问权限,子类大于父类

object类的用法

object类时所有Java类的根基类,也就意味着所有的Java对象都拥有object类的属性和方法。

super关键字

super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性

构造方法的调用顺序

  1. 构造方法的第一句总是super(),是默认的。,所以,流程是:先向上追溯带object。然后在依次向下执行类的初始化和构造方法,知道当前子类为止。
  2. 静态初始化块的调用顺序,与构造方法调用顺序一样。

封装的作用和含义

程序设计追求的是“高内聚,低耦合”,高内聚就是内部数据操作自己完成,不允许外部干涉,低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用

封装的优点:

  1. 提高代码的安全性
  2. 提高代码的复用性
  3. 高内聚:粉转细节,便于内部修改代码,提高可维护性
  4. 低耦合:简化外部调用,便于调用者使用,便于拓展和协作

封装的实现—使用访问控制符

  1. private表示私有,只有自己类能访问
  2. default表示没有修饰符修饰,只有同一个包的类能访问
  3. protected表示可以被同一个包的类以及其他包中的子类能访问
  4. public表示可以被该项目的所有包中的所有类访问

(子类不可以引用父类的私有属性和方法)

封装的使用细节

类的属性的处理:

  1. 一般使用private访问的权限
  2. 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:Boolean变量的get方法是is开头的)
  3. 一些只用与本类的辅助性方法可以用private修饰,希望其他类所使用的方法用public修饰。

多态

多态指的是同一个方法的调用,由于对象不同可能会有不同的行为,现实生活中,同一个方法,具体实现会完全不同。

多态的要点

  1. 多态是方法的多态,不是属性的多态(多态与属性无关)
  2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
  3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了

对象的转型

自动向上转型:子类可以自动转型为父类

强制向下转型,可以将父类的对象转为子类(自上而下)

UNStudent st2=(UNStudent) st1;

强制转型转化后父类可以调用子类中特有的方法

子类的对象转为父类(自下而上)是自动转型。

final关键字

  1. 修饰变量:被修饰的变量不可改变,一旦赋了初值,就不能被重新赋值
  2. 修饰方法:该方法不可被子类重写,但是可以被重载
  3. 修饰类:修饰的类不可被继承,比如Math,String。

数组

数组是相同类型数据的有序集合,数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称做一个元素,每个元素可以通过一个索引(下标)来访问它们。

基本特点:

  1. 长度是确定的,数组一旦被创建,它的大小就是不可以改变的
  2. 其元素必须是相同类型,不允许出现混合类型
  3. 数组类型可以是任意数组类型,包括基本数据类型和引用类型
  4. 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。

数组的初始化

数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。

静态初始化

int[] a = {3, 4, 5};//静态初始化

默认初始化

int a2[]=new int[2];//默认初始化

动态初始化

int []a1=new int[2];
a1[0]=1;
a1[1]=2;//动态初始化

数组的遍历

public class test {public static void main(String[] args) {int []a =new int[4];for (int i= 0;i<a.length;i++){a[i]=100*i;}for (int i = 0;i<a.length;i++){System.out.println(a[i]);}}
}

for-each循环

专门用于读取数组或集合中所有的元素,即对数组进行遍历

for (int m :a){System.out.println(m);
}

数组的拷贝

public static void testBsaicCopy(){String [] s1 = {"aa","bb","cc","dd","ee"};System.arraycopy(s1,3,s1,3-1,s1.length-3);s1[s1.length-1] = null;for (int i = 0; i<s1.length;i++){System.out.println(i+""+s1[i]);}}

数组的扩容

//数组的扩容(本质上是:先定义一个更大的数组,然后将原数组内容拷贝到新数组中)public static void extendRange(String[]s1){//String[]s1={"aa","bb","cc"};String[]s2=new String[s1,0,s2,0,s1.length];for (String temp:s2){System.out.println(temp);}}

Arrays类

是一个工具类

public class TestArrays {public static void main(String[] args) {int[]a={100,20,35,5,50,80};System.out.println(a);//打印指定的数组内容System.out.println(Arrays.toString(a));Arrays.sort(a);System.out.println(Arrays.toString(a));System.out.println(Arrays.binarySearch(a,35));}}

多维数组

可以看成以数组为元素的数组

int[][] a=new int[3][];a[0]=new int[]{20,30};a[1]=new int[]{10,15,80};a[2]=new int[]{50,60};System.out.println(a[1][2]);//静态初始化二维数组int b [][]={{20,30,40},{50,20},{100,200,300,400}};System.out.println(b[2][3]);}

数组存储表格数据

Object[] emp1 = {1001, "李文泽", "学生", "2001-12-03"};Object[] emp2 = {1002, "李文泽", "学生", "2003-04-03"};Object[] emp3 = {1003, "李文泽", "学生", "2009-05-03"};Object[][] tableData = new Object[3][];tableData[0] = emp1;tableData[1] = emp2;tableData[2] = emp3;for (Object[]temp:tableData){System.out.println(Arrays.toString(temp));}

冒泡排序优化排序

算法如下:

  1. 比较相邻的元素,如果第一个比第二个大,就交换他们两个
  2. 对每一对相邻元素作相同的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较

基本算法

public class TestBubbleSort {public static void main(String[] args) {int[] values = {3, 1, 6, 2, 9, 0, 7, 4, 5, 8};int temp = 0;for (int i = 0; i < values.length - 1; i++) {for (int j = 0; j < values.length - 1-i; j++) {if (values[j] > values[j + 1]) {temp = values[j];values[j] = values[j + 1];values[j + 1] = temp;}System.out.println(Arrays.toString(values));}System.out.println("***************");}}
}

优化算法

public class TestBubbleSort {public static void main(String[] args) {int[] values = {3, 1, 6, 2, 9, 0, 7, 4, 5, 8};int temp = 0;for (int i = 0; i < values.length - 1; i++) {boolean flag=true;for (int j = 0; j < values.length - 1-i; j++) {if (values[j] > values[j + 1]) {temp = values[j];values[j] = values[j + 1];values[j + 1] = temp;flag=false;}System.out.println(Arrays.toString(values));}if (flag){System.out.println("结束");break;}System.out.println("***************");}}
}

二分法查找(折半检索)

基本要求:数组要排好序

//测试二分法查找
public class TestBinarySearch {public static void main(String[] args) {int[] arr = {30, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};Arrays.sort(arr);int value = 10;System.out.println(Arrays.toString(arr));System.out.println(myBinarySearch(arr,40));}
public static int myBinarySearch(int []arr, int value){int low=0;int high=arr.length-1;while (low<=high){int mid=(low+high)/2;if (value==arr[mid]){return mid;}if (value>arr[mid]){low=mid+1;}if (value<arr[mid]){high=mid-1;}}return -1;
}
}

抽象类、抽象方法

抽象方法

使用abstract修饰的方法,没有方法体,只有声明,定义的是一种“规范”,就是告诉子类必须要给抽象方法听过具体的实现

抽象类

包含抽象方法的类就是抽象类,通过abstract方法定义规范,然后要求子类必须定义具体实现(必须重写),通过抽象类,我们就可以做到严格限制子类的设计,是子类之间更加通用

使用要点

  1. 有抽象方法的类只能定义成抽象类
  2. 抽象类不能实例化,即不能用new来实例化抽象类
  3. 抽象类可以包含属性、方法、构造方法,但是构造方法不能用来new实例,只能用来被子类调用
  4. 抽象类只能用来被继承
  5. 抽象方法必须被子类实现

抽象类的意义就在于:为子类提供统一的、规范的模板,子类必须实现相关的抽象方法。

接口

接口是比“抽象类”更抽象的“抽象类”,接口的本质是契约

定义接口的说明:

  1. 访问修饰符:只能是public或者默认default
  2. 接口名:和类名采取相同的命名机制
  3. extends:接口可以多继承
  4. 常量:接口中的属性只能是常量,总是:public static final 修饰,不写也是
  5. 方法:接口中的方法只能是:public abstract,省略的话,也是public abstract。

要点

  1. 子类通过implements来实现接口中的规范
  2. 接口不能创建实例,但是可用于声明变量了类型
  3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
  4. JDK1.7之前,接口中只能包含静态常量、抽象方法,不能有普通属性、普通方法、构造方法

内部类

成员内部类

成员内部类包含非静态内部类和静态内部类

非静态内部类

非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问内部类的成员。

  1. 非静态内部类必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象,非静态内部类对象单独属于外部类的某个对象
  2. 非静态内部类可以直接访问外部类成员,但是外部类不能直接访问非静态内部类成员
  3. 非静态内部类不能有静态方法,静态属性和静态代码块
  4. 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例
成员变量访问要点
  1. 内部类里方法的局部变量:变量名
  2. 内部类属性:this.变量名
  3. 外部类属性:外部类名.this.变量名。

静态内部类

用static修饰

使用要点
  1. 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法
  2. 静态内部类看做外部类的一个静态成员,因此,外部类的方法可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过new 静态内部类()访问静态内部类的实例。

匿名内部类

注意:

  1. 匿名内部类没有访问修饰符
  2. 匿名内部类没有构造方法,因为没有名字

局部内部类

方法内部定义的,作用域只限于本方法,成为局部内部类

string类

  1. string类称作不可变序列
  2. Java字符串就是Unicode字符序列
  3. 比较字符串使用equals(),不要使用==

StringBuilder(可变字符串序列)

String str;//StringBuilder线程不安全,效率高(一般使用它);StringBuffer线程安全,效率低StringBuilder sb =new StringBuilder("abcdefg");System.out.println(Integer.toHexString(sb.hashCode() ));System.out.println(sb);sb.setCharAt(2,'M');System.out.println(Integer.toHexString(sb.hashCode()));System.out.println(sb );
StringBuilder sb =new StringBuilder();for (int i=0; i<26;i++){sb.append((char)('a'+i));}System.out.println(sb);sb.reverse();//倒序System.out.println(sb);sb.setCharAt(3,'高');System.out.println(sb);sb.insert(0,'我').insert(6,'爱').insert(10,'你');//链式调用。核心就是:该方法调用了return this,把自己返回了。System.out.println(sb);sb.delete(20,23);System.out.println(sb)

注意

/*使用String进行字符串的拼接*/String str ="";long num1=Runtime.getRuntime().freeMemory();//获取系统剩余内存空间long time1=System.currentTimeMillis();for (int i=0;i<500;i++){str = str+i;}long num2=Runtime.getRuntime().freeMemory();long time2=System.currentTimeMillis();System.out.println("String占用内存:"+(num1-num2 ));//975256System.out.println("String占用时间:"+(time2-time1));//17ms/*使用StringBuilder进行字符串的拼接*/StringBuilder sb1=new StringBuilder("");long num3=Runtime.getRuntime().freeMemory();//获取系统剩余内存空间long time3=System.currentTimeMillis();for (int i=0;i<500;i++){sb1.append(i);}long num4=Runtime.getRuntime().freeMemory();long time4=System.currentTimeMillis();System.out.println("StringBuilder占用内存:"+(num4-num3));//0System.out.println("StringBuilder占用时间:"+(time4-time3));//0

建议使用stringbuilder进行循环拼接。

常量池

  1. 全局字符串常量池
  2. class文件常量池
  3. 运行时常量池

包装类

包装类位于Java.lang包

//Integer a = new Integer(3);//基本数据类型转化为包装类对象Integer a=new Integer(3);Integer b=Integer.valueOf(30);//把包装类对象转成基本数据类型int c =b.intValue();double d =b.doubleValue();//把字符串转成包装类对象Integer e = new Integer("9999");Integer f = new Integer("999888");//把包装类对象转化成字符串String str = f.toString();//""+f也可以//常见的常量System.out.println("int类型最大的整数"+Integer.MAX_VALUE);System.out.println("int类型最小的整数"+Integer.MIN_VALUE);

自动装箱和拆箱

自动装箱:基本类型的数据处于需要对象的环境中时,会自动转为“对象”

自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,不需要再去显式调用intValue()、doubleValue()等转型方法

Integer a=234;//编译器会转化为 Integer a =Integer.valueOf(234)   自动装箱int b =a;  //编译器会修改成int b =a.intValue()  自动拆箱Integer c= null;if (c!=null){int d =c;   //自动拆箱,调用了:c.intValue}//缓存【-128,127】之间的数字,实际就是系统初始的时候,创建了【-128,127】之间的一个缓存数组//当我们调用valueOf()的时候,首先检查是否在【-128,127】之间,如果在这个范围之间直接从缓存数组中拿出已经建好的对象//如果不在这个发范围,则创建新的Integer对象。Integer in1= -128;Integer in2= -128;System.out.println(in1==in2);//true,因为在缓存范围内System.out.println(in1.equals(in2));//trueInteger in3=1234;Integer in4=1234;System.out.println(in3==in4);//false,因为1234不在缓存范围内System.out.println(in3.equals(in4));//true

DATE 时间类

1970年1月1日 00:00:00定为基准时间

Java中使用long类型的变量来表示时间,

 Date d =new Date(2000);System.out.println(d);System.out.println(d.getTime());Date d2 = new Date();System.out.println(d2.getTime());System.out.println(d2.after(d));//以后遇到日期处理,使用Canlendar日期类Date d3 = new Date(2020-1900,3,10);System.out.println(d3);//2020.4.10

DataFormat 类和 SimpleFormat 类

//把时间对象按照“格式字符串指定的形式”转成相应的字符串DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String str = df.format(new Date(4000000));System.out.println(str);//把字符串按照“格式字符串指定的格式”转成相应的时间对象DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date date = df.parse("1983-5-10 10:45:59");System.out.println(date);//测试其他的字符,利用D,或者获得本时间对象是所处年份的第几天DateFormat df3 = new SimpleDateFormat("D");String str3= df3.format(new Date());System.out.println(str3);

Calendar和GregorianCalendar的使用

Calendar calendar = new GregorianCalendar(2999,10,9,22,10,50);int year=calendar.get(Calendar.YEAR);int month=calendar.get(Calendar.MONTH);int weekday = calendar.get(Calendar.DAY_OF_WEEK);//星期几:1-7.1:星期日,2:星期一,7:星期六int day=calendar.get(Calendar.DATE);//也可以使用DAY_OF_MONTH.System.out.println(year);System.out.println(month);//0-11表示对应的月份,0是一月,依此类推。System.out.println(weekday);System.out.println(day);//设置日期相关的元素Calendar calendar1=new GregorianCalendar();calendar1.set(Calendar.YEAR,8012);System.out.println(calendar1);//日期的计算Calendar calendar2 =new GregorianCalendar();calendar2.add(Calendar.YEAR,-100);System.out.println(calendar2);//日期对象和时间对象的转化Date date = calendar2.getTime();Calendar calendar3 = new GregorianCalendar();calendar3.setTime(new Date());printCalendar(calendar3);}public static void printCalendar(Calendar c){int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH)+1;int date = c.get(Calendar.DAY_OF_MONTH);int dayWeek = c.get(Calendar.DAY_OF_WEEK)-1;String dayWeek1=dayWeek==0?"日":dayWeek+"";int hour =c.get(Calendar.HOUR);int minute=c.get(Calendar.MINUTE);int second=c.get(Calendar.SECOND);System.out.println(year+"年"+month+"月"+date+"日  "+hour+"时"+minute+"分"+second+"秒"+ "   周"+dayWeek);

File类

import java.util.Date;
import java.util.Objects;
import java.util.Properties;
import java.util.Scanner;public class test {public static void main(String[] args) throws IOException {File f = new File("d:\\a.txt");File file =new File("d:/a.txt");file.createNewFile();System.out.println("File是否存在"+file.exists());System.out.println("File是否是目录"+file.isDirectory());System.out.println("File是否是文件"+file.isFile());System.out.println("File最后修改的时间"+new Date(file.lastModified()));System.out.println("File的大小"+file.length());System.out.println("File的文件名"+file.getName());System.out.println("File的目录路径"+file.getAbsoluteFile());//使用mkdirs和mkdir创建目录File file1 =new File("d:/电影/华语/大陆");boolean flag = file1.mkdirs();//目录结构中有一个不存在也没关系,创建整个目录树System.out.println(flag);//File类综合运用File file2 = new File("d:/sxt/b.txt");boolean flag1=file2.exists();if (flag1){boolean flagd = file2.delete();if (flagd){System.out.println("删除成功");}else {System.out.println("删除失败");}}else {boolean flagn=true;try {File dir = file2.getParentFile();dir.mkdirs();flagn = file2.createNewFile();System.out.println("创建成功");}catch (IOException e){System.out.println("创建失败");e.printStackTrace();}}}
}

枚举类

所有的枚举类型隐性地继承Java.lang.Enum.枚举实质上还是类,而每个被枚举的成员实质就是一个枚举类型的实例,默认都是public static final 修饰的,可以直接通过枚举类型名使用。

注意

  1. 当需要定义一组常量,可以使用枚举类型
  2. 尽量不要使用枚举的高级特性,事实上高级特性都可以使用普通类来实现,没有必要引入枚举,增加程序的复杂性。
ublic class test {public static void main(String[] args)  {System.out.println(Season.SPRING);Season a = Season.AUTUMN;switch (a){case SPRING:System.out.println("春天");break;case SUMMER:System.out.println("夏天");break;case AUTUMN:System.out.println("秋天");break;case WINTER:System.out.println("冬天");break;}}
}
enum Season{SPRING,SUMMER,AUTUMN,WINTER
}
enum Week{星期一,星期二,星期三,星期四,星期五,星期六,星期日,
}

Java基础(2)面向对象的理解相关推荐

  1. 再探java基础——对面向对象的理解(1)

    对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...

  2. 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  3. Java基础篇--面向对象(Object Oriented)

    Java基础篇--面向对象(Object Oriented) 1. 面向对象概念 1.1 什么事面向对象 1.2 理解面向对象 1.3 面向对象的特点 1.4 面向对象开发设计特征 2. 类与对象 2 ...

  4. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  5. Java基础之面向对象的概念 继承---组合----枚举类

    Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...

  6. 【Java基础】面向对象(三)

    [Java基础]面向对象(三) 一.多态 概念 引用类型转换 二.Object类 概述 常用方法 三.抽象类 抽象类与抽象方法的定义 注意事项 四.接口 概述 接口定义 含有抽象方法 含有默认方法和静 ...

  7. JAVA基础学习--面向对象

    JAVA基础学习–面向对象 1.面向对象与面向过程: 面向过程:就代表从头到位,每一步都需要我们来完成,例如洗衣服,首先收拾脏衣服.接上水.到洗衣液.搓.倒水.拧干.晾晒.每一步都需要我们来完成. 面 ...

  8. java基础(一)-面向对象思想

    前言 java是一门面向对象的语言,在学习java前,先要理解面向对象这个概念,区别于c这类的面向过程语言,面向对象有着什么一样的特点呢?先上一张思维导图吧: 对象 什么是对象 问题空间中的元素及其在 ...

  9. Java基础(08) 面向对象

    Java基础(八)-- 面向对象 ​ 面向对象(Object Oriented Programming, 简称OOP )是Java基础学习的重点,必须掌握每个细节,接下来对面向对象的学习主要围绕以下三 ...

  10. JAVA基础语法——面向对象思想

    Java基础语法 前言 一.面向对象思想 1.面向对象(OOP)概述 2.面向对象三大特性五大原则 二.类和对象 1.对象和类的概念 2.对象的特征 3.构造方法 3.This关键字 4.static ...

最新文章

  1. 人生中五个遗憾,共勉
  2. java线程 教程_Java多线程系列教程
  3. mvn命令安装jar包--转
  4. 常用 Git 命令清单(转)
  5. matlab光学远轴光的折射,光学课后习题
  6. block--内存管理
  7. scrap连接django
  8. cf(聚簇因子)调优,计划调优,SQL改造
  9. python判断密码强度并输出_Python实现的密码强度检测器示例
  10. ideal如何快速导入import_Vue性能优化:如何实现延迟加载和代码拆分?
  11. 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”
  12. Mysql缺少可执行的命令
  13. linux 上安装 Node.js和npm
  14. dojo实现省份地市级联报错(一)
  15. html里制作简单导航栏
  16. Invalid bound statement (not found)错误解决方法
  17. Adobe Illustrator自制苏大计科院院徽
  18. ubuntu更换源(清华、中科大、阿里)
  19. 嵌入式开发:硬件在环测试
  20. HTML5网页设计样式-基本CSS选择器

热门文章

  1. Ubuntu18.04 在线安装显卡驱动
  2. 实时股票数据获取方式
  3. .NET MAUI 开发电子木鱼(上)
  4. 域控赛道/智驾国产化启动,中科创达不想只是吃「软饭」
  5. 助力零售业降本增效,零售业相关场景RPA应用
  6. leetcode-算法基础-5、6、7、8
  7. 英语学习年终总结——2014 year-end summary of English learning
  8. 【微信小程序】可拖拽操作的“树状图”模块的制作和小程序经验的总结
  9. 使用LM386的简单Arduino音频播放器和放大器
  10. .net SSO单点登录mvc