我学完OOP之后对OOP的理解

//代码注释
//单行注释 //
//多行注释 /* /
//文档注释
/
*
*
*
*
*/

//基本类型和引用类型
//int a=5;int b=a;将变量a的值,拷贝一个副本给变量b,变量a和变量b是互相独立的。
//int [] a ={1};int [] b=a;将数组a引用的地址,拷贝一个副本给数组b,数组a和b指向同一个数组。
//Student a = new Student();Student b=a;同数组

//oop : object oriented programming
//抽象:模具
//类:class
//访问修饰符 [abstract/static/final/…] class/interface/enum 类名称{
//属性、静态特征、成员变量、全局变量
//访问修饰符 [static/final/volatile/transient/…] 数据类型 属性名称;
//1.程序运行时:自动为属性赋无效的初值,同数组初始化
//方法、动态特征、函数、行为
//访问修饰符 [abstract/static/final/native/…] 返回类型 方法的名称([形式参数列表]){方法体}
//形式参数:定义类型,数量,顺序
//1.入口方法:程序的入口
public static void main(String[] args){…}
//2.构造方法:初始化(赋值)x
public 与类同名 ([形式参数列表]){…}
//构造方法的重载:
//同一个类中
//方法名称相同
//参数不同(数量不同,类型不同,不同类型的参数顺序不同)
//3.自定义方法
//使用方法:功能,参数,返回值
//创建方法:方法的源码
void:方法无返回类型
//方法返回值:只能有一个
return [值]; 1.终止方法 2.返回值

					//方法入参规则:可以有多个
						//3个以内,直接入参
						//3个以上,封装入参
					
		//}
	//this关键字:当前对象,同类中某构造方法中通过重载调用其他构造方法,且必须为第一句。
	/*  public Student(String name,int age){
    this.name = name;
    this.age = age;
}

    public Student(String name,int age,float myMoney){
    this(name, age);
    this.myMoney = myMoney;
} */


	
	
		
		
		
//object
	//创建对象
		//实际参数:定义值
		类 对象名称 = new 构造方法([实际参数列表]);
	//访问对象
		//外部访问
			//访问对象的【可见】属性
				//对象名称.属性名称
			//访问对象的【可见】方法
				//对象名称.方法名称([实际参数列表])
		//内部访问:直接访问
		
//类的认知
	//GC垃圾回收器,相当于磁盘碎片整理
	//数据类:实体类
		//					类型         返回的数值
		//变量				1			1
		//数组				1			N
		//类				N			1
		//对象数组			N			N
	//业务类

//static 和基本类型的存在,证明Java不是纯粹面向对象的语言
//static
//优点:方便跨类调用
//缺点:违背OOP,生命周期
//基本类型对应的包装类
基本类型 包装类 扩展方法
String String
char Character boolean is = Character.isDigit(char c);//c是否为数字
boolean is = Character.isLetter(char c);//c是否为字符(不区分大小写)
byte Byte
short Short
int Integer int val = Integer.parseInt(String str);//字符串转为整数型
long Long
float Float float val = Float.parseFloat(String str);//字符串转为小数型
double Double
boolean Boolean
//OOP的三大特性
//目标:
//代码的重用性
//耦合度(低耦合度比较好,低的依赖性)
//扩展性
//封装
写类的过程就是封装的过程
//继承 extends
另一种形式的封装
class B{}
class A extends B //继承是为了重用,更是为了扩展
//所有类的祖宗:Object
//单根继承
//凡是符合“Xxx is a Yyy” class Xxx extends Yyy{}
//super 父类对象,调用父类构造方法,且必须为第一句。
//本质是每一个子类对象中都有一个独有的父类对象,由虚拟机负责创建
//父类中不可以继承的内容
//私有的属性和方法
//构造方法,通过super(…) 去调
//访问修饰符 类内 同包[子类] 异包子类 其他(异包非子类)
public √ √ √ √
protected √ √ √
default(无) √ √
private √ ×
//继承关系不同性质代码执行顺序 (父>子 /静态>普通>构造)
父类静态代码块
子类静态代码块
父类普通代码块
父类构造方法
子类普通代码块
子类构造方法
//多态
//概念:一种类型多种表现形态
//必要条件:
//继承
//重写:子类重写父类同名同参方法(参数返回值完全相同,访问权限>=父类)
//类型转换
//☆自动类型转换:子类对象给父类的引用
//强制类型转换:
//将父类引用指向的子类对象,转化为子类对应的实际引用
boolean is = objectA instanceOf classB;(对象A是否是类B的实例)
((classB)objectA).specialAct();
//重载也是多态

//常用的字符串方法
//charAt(n) n取值范围:0~str.length()-1
//strA.equals(strB)
//String[] strs = str.split(strRegex); //以strRegex来分开数组中的元素
//String part = str.substring(beginIndex,endIndex); //截取字符串
//int len = str.length();

	public R<Order> findOrder(int state,int... userNo) {
		
		int... 参数
		表示动态参数,有且只能有一个参数

//抽象类和接口
//抽象的例子:

(老师举了A B C D四个例子,A为抽象父类,A定义了一个方法:会计算。B,C为子类,D类想用类B和类C的方法。B会加法,C会减法。D会计算)
public abstract class A(){

private String name;

public A(String name){
	this.name
}

public abstract int cal(int a,int b);

}

public class B extends A(){
//子类B必须重写抽象父类的抽象方法
@Override
public int cal(int a,int b){
return a+b;
}
}

public class C extends A(){
//子类C必须重写抽象父类的抽象方法
@Override
public int cal(int a,int b){
return a-b;
}
}
public class D{
//D想用A的计算
public void cal(A a,int c,int b){
System.out.println(a.cal(c,b));
}
}
//测试类
public class Test{
public static void main(String[] args){
//instance实例
D d = new D();
d.cal(b,c:2,b:3);//得到的值为5
d.cal(c,c:2,b:3);//得到的值为-1
}
}

//抽象类:abstract修饰的类就是抽象类(父类通常是抽象的,不能实例化)
public	abstract class A{}
	//特征:
		//不可以直接实例化
		//可以有构造方法,可以有属性(留给子类使用),可以有自定义方法
		//可以有抽象方法,子类必须重写抽象父类的抽象方法,除非子类也是抽象类
//接口
	//public interface A {}
	//不可以直接实例化
	//不能有构造方法,属性默认为公共的静态的常量;方法默认为公共的抽象的,不能有方法体
	//实现类(子类)implements必须重写父接口的所有方法,除非子类是抽象类或接口
	
//应用场景
//是一个 (is a)   A extends [abstract] B		重用
//有一个(has a)	A implements interface B	扩展 (有一个类A,类B想扩展A的功能,那么先新建一个接口;再新建一个新的类(B)继承原来的类(A),再实现一个接口)
写接口的例子——Calculator

//给Calculator定义了一个带参方法
public class Calculator{
	public int add(int a,int b){
		return a+b;
	}
}

//Calculator2类想扩展Calculator类的方法,需要先新建一个接口MultiAdd
public interface MultiAdd{
	int add(int...arr);
}

//Calculator2类继承Calculator,实现MultiAdd
public class Calculator2 extends Calculator implements MultiAdd {
	
	@Override
	public int add (int...arr){
		int sum = 0;
		for(int i : arr){
			sum = add(sum,i);
		}
		return sum;
	}
}

//测试类
public class Test{
	public static void main(String[] args){
		Calculator2 c2 = new Calculator2;
	}
}



//面向修改是封闭的,面向扩展是开放的。

//异常
//异常:阻止项目正常编译或运行的现象
Error:系统级异常
StackOverflowError 栈溢出
OutOfMemoryError 内存溢出
InterruptedException 线程

Exception
CompileException:编译异常

线程
Java连接操作数据库
RuntimeException:运行时异常
InputMismatchException
ArrayIndexOutOfBoundsException
ArithmeticException
ClassCastException
NumberFormatException

//异常处理方式
//非编译异常:推荐使用程序逻辑规避异常的发生
//比如:Integer.parseInt(String val)
//产生异常的原因:字符串val不符合整数的特征
//判断字符是否为整型
private static boolean isInt(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit©) {
return false;
}
}
return true;
}
//比如:int[] arr ={22,34,15};
public int get(int index){return arr[index];}
//产生异常的原因:整型参数index不在0~arr.length-1的范围内
private boolean OutOfBounds(int index){
return index<0||index>arr.length-1;
}

	//编译异常:走异常的常规套路
	处理方式1:(快捷方式  .try)
	try{
		//可能出现的代码段
		xxx...
		xxx...
		xxx...
	}catch(XxxException1 e){	//catch的数量取决于代码段中可能产生异常的种类数
								//如果不同种类的异常,必须不同处理,则必须多个catch
								//即使存在多个不同种类异常,但处理方式相同,则一个catch即可(多态的方式,父类)
	}catch(XxxException2 e){
		
	}catch(XxxException3 e){
		
	}
	xxx...
	
	处理方式2:抛出异常
	public xxx method(xxx xxx) throws xxxException{//如果选择抛出异常:必须为编译异常(Exception)
		//系统预定义异常:自动抛出
		//自定义异常:必须手动抛出
		throws new XxxException("...");
	}
	//自定义异常:public class XxxException extends Exception/RunTimeException{...}

【了解】
//final关键字
final int VALUE =5; //常量
final class Xxx{};//不可以被继承
final void show(){};//不可以被重写
//内部类
//☆★★★内部类可以自由访问外部类的任何内容,而外部类不能访问内部类任何内容
class Xxx2{}
public class Xxx{
[public static final] class InXxx{}
}
Xxx.InXxx

//匿名内部类:创建接口对象或抽象类;

//举例说明:
public interface Info{
	public int add(int a,int b);
	public int add(int...as);
}

public class InfoFactory{
	public static Info get(){
		return new Info(){
			@override
			public int add(int a,int b){
				return a+b;
			}
			@override
			public int add(int...as){
				int sum = 0;
				for(int a:as){
					sum = add(sum,a);
				}
				return sum;
			}
		};
	}
}

//测试类
public class CollectTest {
	public static void main(String[] args){
		Info info = InfoFactory.get();
		system.out.println(info.add(a:1,b:2));
		int[] as = {1,2,3};
		system.out.println(info.add(as)));
	}
}

//对象之间的等值比较
objOne.equals(objTwo)
//默认是比较地址
public boolean equals(){
return(this==obj);
}
//可以通过重构equals,修改比较的规则
public class User{
private String username;
private String password;
public User(String username,String password){
this.username = username;
this.password = password;
}

@Override
public boolean equals(Object obj){
	return null !=obj 
			&& obj instanceof User
			&&((User)obj).username.equals(this.username)
			&&((User)obj).password.equals(this.password);
	}
	
}

//对象之间比较大小
//实现Comparable
public class User implements Comparable{
private String username;
private String password;
private int age;

public User(String username,int age){
	this.username = username;
	this.age = age;
	
}

/**
*	@param o
*	@return 1: this>o 0: this==o -1: this<o
*/
@Override
public int compareTo(User o){
	return null ==o?-1:this.age>o.age? 1:this.age==o.age?0:-1;
}

}

//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值