Java基础——⾯向对象(初级)
三条主线:
类及类的成员:属性、⽅法、构造器、代码块、内部类
⾯向对象的三⼤特征:封装、继承、多态
摊黄儿其他关键字:this、super、abstrct、interface、static、package、import
1.类、对象
类:class,对⼀类事物的描述,抽象概念定义。(属性/成员变量、⽅法/函数)
对象:new,实际存在的事物个体,实例。
过程:
创建类,设计类的成员class Person{String name;public void eat(){}}
创建类的对象Person a=new Person();
调⽤类的属性或⽅法a.name=""; a.eat();
2.内存解析
虚拟机栈:存储局部变量
堆:对象实例
⽅法区:被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码
3.变量
属性(成员)变量:
定义在类{}⾥
0/0.0/fal/null
加载到堆空间
局部变量:
定义在⽅法内
没有默认初始值,需要赋值
加载到栈空间
4.对象数组
定义⼀个对象数组后,系统只是分配了⼀个引⽤空间(只是声明),并没有实际分配内存空间给数组中的元素,因此对象数组中的元素还是需要使⽤new运算符来实例化。person[] a=new person[3]; a[0]=new person();
只有string可以new,也可以不⽤新建new对象,字符串常量池,string s="hello";
5.匿名对象
6.⽅法重载
同⼀个类
同⼀个⽅法名
不同的参数列表
跟权限修饰符、返回值⽆关
7.可变个数形参
数据类型 ... 变量名
string ... a与string[] a相同,可为重写
若有匹配的确定数量参数的⽅法优先调⽤
8.变量赋值忧郁近义词
基本数据类型:
int a=10;
int b=a;//两个空间,⼀变另⼀不变
引⽤数据类型:
string a=new string();
string b=a;//指向同⼀个地址,⼀变全变
9.封装性的体现
将类的属性声明为私有的private,提供公共的public⽅法来获取(get)和设置(t)此属性的值。(把类的属性设置⼀个⽅法权限进⾏限制制约,使⽤户⽆法直接调⽤,需要调⽤⽅法去给属性赋值)
10.权限修饰值
修饰类的内部结构:属性、⽅法、构造器、内部类
修饰类只能使⽤缺省、public(构造器与类相同)
private:类内部
缺省:类内部+同⼀个包
protected:类内部+同⼀个包+不同包的⼦类
public:类内部+同⼀个包+不同包的⼦类+同⼀个⼯程
11.构造器
作⽤:
创建的对象
初始化对象的属性
说明:
定义构造器的格式:权限修饰符类名(形参列表){}
创建类的对象:new+构造器(系统默认的空参构造器)
⼀旦显式定义类的构造器,可以不写空参构造器
但若需要new空参构造器,则需要写默认的空参构造器
春光满面12.this
调⽤属性、⽅法(表⽰当前对象(类的⽅法中)或当前正在创建的对象(类的构造器中),⽅法的形参与类的属性同名时,显式使⽤this.)
调⽤构造器(显式this(形参列表)表⽰,⾸⾏,⼀个)
13.package
管理类
每"."⼀次代表⼀层⽂件⽬录
java.lang、java、java.io、java.util、、java.sql、java.awt
14.import
导⼊指定包下的类、接⼝
xxx.*表⽰导⼊xxx包下的所有结构
java.lang包/本包的类可省略
使⽤不同包下的同名类,声明时加上包名
15.MVC
controller控制层=>model模型层=>view视图层
16.继承
class A extend B{}
⼦类A获取到⽗类B中的属性、⽅法,还可以声明⾃⼰特有的属性或⽅法
所有的类都直接或间接继于java.lang.Object类
17.⽅法重写
⼦类继承⽗类以后,对⽗类中同名同参数的⽅法,进⾏覆盖操作。
18.super宾馆和酒店有什么区别
调⽤⽗类的属性、⽅法:
⼦类⽗类有同名属性或重写⽅法,调⽤⽗类时需要显式定义super.
调⽤⽗类的构造器:
super(形参列表)需声明在⼦构造器的⾸⾏
this与super只能选择⼀个,默认super(形参列表);(所以具有⽗类的属性和⽅法)
⼦类构造器中显式使⽤super(形参列表)
19.多态性
实现代码的通⽤性
⽗类的引⽤指向⼦类的对象
编译时,只能调⽤⽗类声明过的⽅法
执⾏时,执⾏⼦类重写的⽅法
多态性的使⽤(虚拟⽅法调⽤):调⽤同名同参数的⽅法,执⾏⼦类重写⽗类的⽅法
equal(Object a),Object可表⽰各种数据类型
学习计划多态是运⾏时⾏为,不是编译时⾏为
20.instanceof
法国人与交物XXX向下转型:使⽤强制类型转换符。使⽗类能使⽤⼦类特有的⽅法。
避免向下转型出现classcastexception异常,使⽤instanceof判断
a instanceof A:判断对象a是否是类A的实例。如果是,返回ture,如果不是,返回fal
21.java.lang.Object
所有类的根⽗类(多态),⽆属性,只声明了⼀个空参构造器。
⽅法:
equals():
是⼀个⽅法,基本数据类型不是对象,只适⽤于引⽤数据类型。
在string、Date、File、包装类中重写了该⽅法,⽐较的是内容。
⾃定义类时⽐较需要重写。
(==:是运算符,基本数据类型⽐较数据,引⽤数据类型⽐较地址值。
⾃动类型提升:65==65.0f、12(int)==a(char a=12)都返回true)
toString():
输出⼀个对象的引⽤(类型+@+地址)时等于调⽤当前对象的toString()⽅法
重写toString()
在string、Date、File、包装类中重写了该⽅法,输出实体内容信息。
getClass()、hashCode()、clone()、finalize()、wait()、notify()、notifyAll()
22.单元测试
JUnit测试:类似main,不⽤写main
类:public,提供公共的⽆参构造器
⽅法:public,⽆返回值,⽆形参,⽅法上声明注解@Text,import org.junit.Test;
23.包装类
将基本数据类型包装为类/引⽤数据类型
byte=>Byte、short=>Short、
int=>Integer(内部定义了InterCache结构,数组范围-128-127,⾃动装箱时不⽤new,提⾼效率,所以范围内的数指向同⼀地址)long=>Long、float=>Float、double=>Double、boolean=>Boolean
char=>Character
24.基本数据类型、包装类与String类型的转换
基本数据类型转换为包装类:
int a=1;
Integer b=a;//⾃动装箱(JDK5.0新特性)
Integer b=new integer(a);//通过包装类构造器整型int
包装类转换为基本数据类型:
Integer a=new integer(1);
int b=a;//⾃动拆箱(JDK5.0新特性)
int b=a.intValue();//调⽤包装类的⽅法xxxValue()
String类型转换为基本数据类型、包装类:(⾃动装/拆箱)
int a / Integer a=Interger.paInt("1");//调⽤对应包装类的⽅法parXxx(String)(a:基本数据类型)int a / Integer a=new Integer("1");//通过包装类构造器字符串String(a:包装类)
基本数据类型、包装类转换为String类型:(⾃动装/拆箱)
int a / Integer a=new Integer(1);
String b=String.valueOf(a);//调⽤String重载的String.valueOf⽅法(a:基本数据类型)
String b=a+"";//基本数据类型+连接运算(a:基本数据类型)
String String(a);//调⽤包装类的toString(形参)的静态⽅法(a:包装类)
String String();//包装类的toString()⽅法(a:包装类)
25.static
可以被多个对象共享的属性 / 通常类中的常量 / 通常操作静态属性的⽅法 / ⼯具类中的⽅法
类的加载-对象加载-对象消亡-类的消亡
静态属性 ⾮静态属性
类 yes no
对象 yes yes
修饰属性:
通过“类.静态属性”调⽤(存在⽅法区中)
实例变量、静态变量(多个对象共享)
随着类的加载⽽加载,早于对象的创建,
修饰⽅法:
通过“类.静态⽅法”调⽤
静态⽅法中,只能调⽤静态⽅法与属性(main)(因为⾮静态的属性值未知,需要创建对象赋值)不能使⽤this、super(对象的东西都不能使⽤)
⼦类与⽗类同名同参数的⽅法要么都是static(不是重写),要么都是⾮static
代码块:
内部类:
26.单例(Singleton )设计模式
只⽣成⼀个实例,对某个类只能存在⼀个对象实例,减少了系统性能的开销。
饿汉式:对象加载时间过长,但是线程安全
私有化类的构造器
私有化创建类的静态对象
提供公共的静态的⽅法,返回类的对象
懒汉式:延迟对象创建,但是
私有化类的构造器
私有化声明类的静态对象,没有初始化
提供公共的静态的⽅法,返回类的对象(判断对象是否创建)
27.代码块或初始化块
初始化类、对象,将类⾥⾯的操作放在代码块⾥执⾏
若有修饰,只能使⽤stastic{}
静态代码块:
内部可以有输出语句
随着类的加载⽽执⾏,⽽且只执⾏⼀次,因为类只加载⼀次
只能操作静态属性或⽅法
初始化类的信息
⾮静态代码块:
内部可以有输出语句
随着对象的创建⽽执⾏,每创建⼀次执⾏⼀次
初始化对象的信息
28.属性赋值顺序
默认初始化
显⽰初始化 / 代码块赋值
构造器中初始化
有了对象以后,通过对象.属性、对象.⽅法赋值
29.final
修饰类:
不能被继承,如String类、System类、StringBuffer类
修饰⽅法:
不能被重写,⽐如Object的getClass();
修饰属性:咋了爸爸
赋值位置(显式初始化、代码块、构造器),变成常量委托协议书怎么写
static final⽤来修饰属性:全局常量
⾮静态的final可以赋值,每个对象不⼀样
修饰局部变量:
修饰形参时,表明是常量,调⽤⽅法时,声明时赋值,只能在⽅法体内使⽤
30.abstract
抽象的,⽗类⽆法详细描述
修饰类:
不可被实例化
⼀定有构造器,⼦类实例化需要调⽤super()
修饰⽅法:
存在抽象类⾥
只有声明,没有⽅法体,⼦类重写后实例化
若⼦类没有重写⽗类所有的抽象⽅法,则⼦类也要抽象修饰
应⽤:模版⽅法设计模式(Template)
31.interface
接⼝和类并列
不能定义构造器,所以接⼝不可以实例化(若多个接⼝都有⾃⼰的构造器,则不好决定构造器链的调⽤次序)接⼝定义:
jdk7:
只能定义全局常量
(public static final
可调⽤常量template.a)
抽象⽅法
(public abstract;
抽象⽅法不能调⽤,需重写)
jdk8:
还可定义静态⽅法
(static 只能通过接⼝来调⽤;
可调⽤接⼝类的静态⽅法template.a();)
默认⽅法
(default 通过实现类的对象,可以调⽤接⼝中的默认⽅法;
如果实现类重写了默认⽅法,则调⽤重写后的⽅法;