java中所有属性和方法都在类中,一个程序可以包含一个主类,和若干类
主类public class的名称只能与文件名相同。
java的类中包括属性和方法,一般由主类进行对象实例化,new一个对象的时候,系统统一开辟了一个堆内存存放属性数据,栈内存存放其堆内存的地址。给属性赋值就是与对象建立联系。
java中常使用private对类中属性进行封装,使用getting和setting方法用于调用
set用于设置get用于返回给属性
构造方法此时没有访问类和属性的区别,往往属性前追加一个this
public person(string name,int age)
{
this.name=name;
this.age=age;
}
访问本类中属性时,属性前加this.
this调用本类方法(构造与普通方法)
this()语句仅允许放在构造方法首行
构造方法互相调用保留程序出口不形成死循环
类名称必须有意义,再怎么说,要让人家看的明白吧
类之中所有属性必须使用private封装,并提供setter,getter方法
类之中可以有多个构造方法,但是必须保留有一个无参数构造方法
类之中不允许出现任何输出语句,所有输出必须交给被调用处
类之中需要有一个可以取得对象完整信息的方法,一般叫做getInfo(),返回String型数据
声明static属性
重复储存数据且修改不方便,使用static用定义公共属性。
static属性可以由类名称调用。
static 属性虽然定义在类之中,但并不受实例化对象的控制。(在实例化之前使用)
声明static方法
static方法只允许调用static属性和static方法
代码块以{}作为分界,普通块可以划分代码结构,构造块优先于构造方法在类之中,静态块优先于构造方法,只执行一次用于给静态属性初始化,静态代码块优先于主方法。
声明方法
数据类型 名称 [ ] = new 数据类型 名称 [ ]
name.length 获取数组长度
foreach输出
for(int temp:data)
可变参数数组
int … data
类数组(类比于结构体数组)
string内存分析
直接赋值,
new 对象 会占两个空间,两个实例化对象(使用构造方法实例化string类型不会自动保存到字符串对象池)
string常量池本质是一个数组
public string intern()入池方法
string对象池
静态常量池:指的是程序(*.class)在加载的时候自动将此程序之中保存字符串普通常量类和方法信息分配。
运行时常量池:程序加载后里面可能有些变量,提供的常量池。
字符串内容不可修改(重新建立引用关系)不要频繁修改
class 子类(派生类) extends 父类(超类)
子类中直接包含父类属性
核心是扩充父类
子类实例化定义要求
new 子类 时系统自动实例化父类
super()子类构造调用父类构造方法
只能放在子类构造方法首行,对于调用父类无参构造方法没有影响。
Java之中不允许多重继承,仅允许多层继承。
继承关系不应超过三层。
子类可以继承父类所有操作结构,所有私有操作为隐式继承,非私有为显示继承。
跟父类方法一模一样(覆盖)
子类调用父类方法时,前面一定要添加super
方法覆写的限制
被覆写的方法不能有比父类方法更严格的访问权限。
public > default > private
方法重载和方法覆写的区别
this调用本类,再调用父类,super只能由子类调用父类
super()和this()区别:
super():调用父类无形参的构造方法;
super(形参):调用父类中某个带形参的构造方法;
this(形参):调用本类中另一种形式的构造方法;
注意:放在方法的首行;
2.super和this的区别:
super.父类的成员变量;
super.父类的方法;
super:当子类中的成员变量、方法和父类的相同时,实现调用父类的成员变量和方法;
this:代表当前的对象;
使用的地方:若函数的形参和成员变量同名时,需要用this.成员变量名
annotation
@Override明确覆写,没有覆写则报错
@Deprecated 过期操作 编译显示过期api
@SuppressWarnings 压制警告 不让警告信息出现
多态性
方法的多态性
方法的重载:同一个方法名称可以根据传入的参数类型或个数不同实现不同功能执行。方法的覆写:子类不同有不同实习对象多态性:父子实例的相互转换,他有两种模式,对象向上,对象向下。
父类 名称 = new 子类 名称 (对象向上)自动转换
解决参数统一问题,接受参数和返回参数的统一性。方法覆写
对象的向下转型
需要子类特殊的定义处理(特殊功能)
先向上转型后向下转型
instanceof判断是否为某类对象
名称 instanceof 类(判断名称属于类)向下转型前判断
一个类没有父类为object类(默认继承object类)
object类处理方法
tostring()获取对象完整信息(与直接名字输出相同)
覆写tostring获得全部方法取缔getinfo()
equals()比较两个对象
比较应在类内部具有,在子类中覆写equals方法
public boolean equals(Objest obj){
if(!(obj instanceof Person)){
return false;
}
if(obj==null){
return false;
}
if(this==obj){
return ture;
}
return this.name.equals(per.name)&&this.age==per.age;
}
抽象类
普通类加抽象方法为抽象类(不是完整的)
public abstract string getinfo()
抽象类必须有非抽象类的子类,必须覆写抽象方法
抽象类使用建议
抽象类无法直接实例化
抽象类主要进行过渡操作使用
抽象类不允许有final关键字
抽象类的应用
行为类(给定一个模板)
装箱:将基本数据类型保存到包装类
拆箱:从包装类获取基本数据类型
对象型包装类 boolean character
数值型包装类。(number)integer byte long short float double 等
自动拆箱与装箱
https://blog.csdn.net/zhanghaipeng1989/article/details/45512433?utm_source=app
接口与抽象类
接口基本定义
除了抽象方法和全局常量(普通方法静态方法)
interface关键字定义接口
接口名称前常加入I
对于接口要求
接口需要被子类实现,可以是多个父接口。
需要覆写接口中所有抽象方法。
接口对象可以利用子类对象的向上转型进行实例化。
implement(实现)
可实现多继承。
接口默认权限public
子类先继承父类,后实现接口
接口可以继承多个接口。
接口开发作用
进行标准设置。
表示一种操作能力。
暴露远程方法视图,一般用于RPC分布式开发中。
接口追加普通方法必须添加default
用抽象类继承接口
使用接口定义标准
工厂设计模式(factory)
代理模式,代理调用本类
利用object定义,多内容接收
字符串自动包装自动拆包,[安全隐患]
object类涵盖范围太广
泛型定义:
类中属性方法的参数和返回值类型由实例化时决定(用户决定)
类声明
默认的泛型类型为object,编译会出现警告
public class point
point point =new point ();
泛型只允许引用类型,包装类
泛型可以简化为new point<>();
泛型的通配符
方法引用传递
message>类型
不设置泛型,会对数据修改
?extends number 只允许设置number的子类(上限)
?super string 只允许string和其父类(下限)
泛型接口
泛型接口定义
子类中接着用泛型
子类中定义泛型类型
泛型方法
泛型标记写入泛型方法
利用泛型改造工厂
包=目录
package cn.cnki.n
点作为分割号目录/
import 导入其他包
Javac -d .*. Java 自己匹配其他包编译。
包导入需要public 程序包
包为小写路径
用*包根据使用加载
如果两个包都有相同名称的类(引用不明确)
静态导入
import static 路径.类名
导入后无需类名调用方法
jar文件打包
先编译后打包(根目录jar打包)
jar -cvf 包名.jar 根目录
引入需要 classpath jar 路径用分号分隔
try{ 可能产生异常的片段
}
catch(异常类型1){ 异常处理办法
}
catch(异常类型2){ 异常处理办法
}
finally{ 不管是不是有异常都执行
}
程序运行中产生异常,try语句捕获实例化对象,异常类型是核心,error程序未执行的错误,exception程序执行后出现的错误,可以被认为处理
所有异常都可以用exception e处理,不确定用exception处理可用,最好对异常分开处理,最大范围放在后面
throws关键字
public static int div (int a,int b) throws exception
有throws必须用try catch 异常处理
自定义exception 用类继承exception或者runtimeexception
为什么要有内部类
轻松使用外部类私有属性
外部类先实例化内部类再实例化