JAVA-面向对象

JAVA面向对象

类和对象

类:具有相同属性(特征)和行为(动作)对象的集合。抽象出来的
对象:类的实例化

常见修饰符

static(静态) final(最终方法) abstract(抽象) native(调用C函数库) synchronized(同步锁)

类修饰符

Public : 同包和不同包内都能访问
Protected : 在同类和同包,子父类里可以访问
Defailt : 在同类同包访问
Private : 只能同类访问

静态块、构造块、局部块

静态块:在类被加载时被调用,一般用来初始化类,为类属性初始化
构造块:在类的构造方法被调用时,先于构造方法执行,初始化对象数据
局部块:在方法中减少部分变量生命周期,释放内存空间

静态变量和局部变量

静态变量:从属于类,在类加载时被分配空间直接类名调用
实例变量:从属于对象,在对象被创建时分配空间,通过对象实例调用

对象在内存中存储结构

public class TestStudent {
	public static void main(String[] args) {
		int n = 10;  //栈存储
		int m = 10;  //栈存储
		Student stu = new Student();
		//属性赋值
		stu.name="张三";
		System.out.println(stu.name);  //null   张三
		System.out.println(stu.age);   //0		
		//调用
		String name = "ls";   //局部变量(常量池)
		String aaaa="ls";
		String pwd = "123";
		stu.login(name,pwd);
		System.out.println("name:"+name);   //ls
		System.out.println("执行");
	}
}

class Student {
	// 属性
	String name;
	int age;
	//用户登录
//	String userName;
//	String pwd;
	
	public void login(String userName,String pwd){
		
		System.out.println(userName+"===="+pwd);   //ls  123
	}
	
	public void show() {
		System.out.println("姓名:" + name + ",年龄:" + age);
	}
}

在这里插入图片描述

方法重载(两必一可)

特点:
①方法必须在同一类中且方法名相同;
②方法名必须相同;
③参数列表必须不一致
(a.参数类型b.参数个数c.参数的顺序)
补充:与方法的返回值类型无关(可以相同也可以不同)

值类型和引用类型作方法的参数区别

public class Test1 {
	public static void main(String[] args) {
		
		int num =10;
		System.out.println(num);  //10
		new Test().show(num);  //
		System.out.println(num);  //10		
		
		System.out.println("---------------------");
		Test2 test2 = new Test2();
		test2.i =10;   //n=0
		System.out.println(test2.i);  //10
		new Test().show(test2);   //i=10 n= 0
		System.out.println(test2.i);  //11
		
	}
}
class Test{
	public void show(int i) {
		i++;
	}
	public void show(Test2 t) {
		t.i++;
	}
}
class Test2{
	int i;
}
public class TestSwap {
	public static void main(String[] args) {
		
//		int n=10,m=8;
//		System.out.println("n:"+n+",m:"+m);  //10   8
//		
//		swap(n,m);	//值类型作为方法的参数
//		System.out.println("n:"+n+",m:"+m);  //10   8
		
		
		DataSwap ds = new DataSwap();
		ds.n=10;
		ds.m=8;
		System.out.println("n:"+ds.n+",m:"+ds.m);   //10  8
		swap(ds);   //引用类型作为方法的参数
		
		System.out.println("n:"+ds.n+",m:"+ds.m);   //8  10
	}
	//交换(值类型 基本数据类型)
   public static void swap(int n,int m) {
	   int tmp = n;
	   n = m;
	   m = tmp;
	  // System.out.println("n:"+n+",m:"+m);  // 8  10
   }
   //交换(引用类型)
   public static void swap(DataSwap ds) {
	   int tmp = ds.n;
	   ds.n=ds.m;
	   ds.m = tmp;
   }
}
class DataSwap{
	int n;
	int m;
}

在这里插入图片描述

this关键字

作用:this关键字代表当前的对象或正在创建的对象
this关键字修饰什么:
1)属性 this.属性
2)方法 this.方法();
3)构造器 this(参数)
在构造器this注意事项:①this必须放在构造方法的第一行 ② 有n个构造方法 this 只能出现n-1
tis: this调用参数时,优先寻找子类对象,没找到后寻找父类对象。

javaBean和相关的关键字(package、import)

javaBean标准:①该类的公共的(public) ②私有的属性并且提供getter/setter方法
package: 作用:
定义包;以目录方式管理javaBean
写在类的首行,目录结构以“.”分隔;如 package 包名;
定义包的规范:项目类型.公司名称.项目名称.模块名称;包名所有字母小写的
import:作用:导入相关类
方式:import 包名.类名/接口名;
特点:可以使用“*”代表包下的所有类或接口.
如果调用不同包中的相同的类名,创建对象时要定义类的全路径;
如:包名.类名 对象=new包名.类名();
java.lang包下接口或类自动导入不需要import ;如: String ,System,Math等 ,
补充:静态导入 import static 包名.类.静态成员;

继承

为什么要用继承?目的实现代码的复用
语法:class subclass extends superclass 子类(派生类) extends 父类(基类或超类)
特点:
1)子类继承父,拥有(继承)父类中的所有成员,在权限范围内.
2)子类不能继承父类中的构造器,只能用super调用.
3)类的继承关系统是单继承,子类只能有一个直接父类;父类可以有多个子类
4)继承具有传递性,如果没直接继承父类,默认继承java.lang.Object类
5)extends 扩展,子类不是父类的子集是父类的扩展。

方法重写(override/overwrite)

什么是重写:对父类方法覆盖(覆写)
重载(overload):必须在同一个类,方法名相同,参数列表不同,与返回值类型无关
前提:
1)一定有继承关系
2)子类方法和父类方法的返回值类型,方法名称,参数方法列必须一致.
3)子类方法的权限修饰符不能小于父类的权限修饰符
4)子类方法抛出异常不能大于父类方法抛出的异常
5)子类方法和父类方法同为static或非static.

多态

多态:一个事物的多种表现形态。(两个或两个以上的对象在调父类中的方法时,实现了各自的内容)
多态代码:父类 对象 = new 子类(); 父类引用指向子类对象
子类 对象 = new 父类() ; //不可以
多于多态来说,编译状态(看左边的类型) ,运行状态(看右边的类型)
实现:向上转型 : 父类 对象 = new 子类(); 理解:自动类型转换
向下转型 : 父类类型对象 instanceof 子类类型 => 子类类型 对象=(子类类型)父类类型的对象 ;
类的属性没有多态性(属性不能被子类的属性覆盖)

public class Test {
	public static void main(String[] args) {
		A a1 = new A();
		A a2 = new B();
		B b = new B();
		C c = new C();
		D d = new D();
		System.out.println(a1.show(b)); // "A and A"
		System.out.println(a1.show(c)); // "A and A"
		System.out.println(a1.show(d)); // "A and D"
		System.out.println(a2.show(b)); // "B and A"
		System.out.println(a2.show(c)); // "B and A"
		System.out.println(a2.show(d)); // "A and D"
		System.out.println(b.show(b)); // "B and B"
		System.out.println(b.show(c)); // "B and B"
		System.out.println(b.show(d)); // "A and D"
	}
}

class A {
	public String show(D obj) {
		return ("A and D");
	}

	public String show(A obj) {
		return ("A and A");
	}
}

class B extends A {
	public String show(B obj) {
		return ("B and B");
	}

	public String show(A obj) {
		return ("B and A");
	}
}

class C extends B {
}

class D extends B {
}

this和super区别

this:代表是当前对象或正在创建的对象
super:父类的对象

thissuper
属性this.属性;可以访问本类中的属性,父类中的属性super.属性;只能访问父类中的属性
方法this.方法();可以访问本类中的方法,父类中的方法。super.方法();只能访问父类中的方法.
构造器this(参数)表示调用当类中的其它构造器,this(参数)最多N-1个super(参数),表示调用父类中的构造器,构造器中默认是super()

增强重写父类中的方法

1.在继承中,子类中的方法要和父类中的方法(返回值类型 方法名 参数列表)要一致。
注意:父类方法:public 父类类型 方法名(参数){}
子类方法:public 父类类型/子类类型 方法名(参数){}
2.子类中的权限修饰符不能小于父类中的权限修饰符
3.子类中的抛出的异常不能大于父类中抛出的异常。
4.static子类不能重写父类中的方法,static静态;子父类的方法同为static和非static
5.final 修饰方法不能被重写(表示的是最终的方法)
6.abstract 声明方法抽象方法,必须被子类方法重写.
7.native 没有方法体,调C或C++的实现 。
8.synchronized 线程锁和重写无关.

String类(Java.lang包)

重点:常量池存储

public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "abc";
		String s3 = new String("abc");
		//== 地址
		//equals比较字符串,比较每个字符
		System.out.println(s1==s2);   //true
		System.out.println(s1==s3);   //false
		System.out.println(s1.equals(s3));  //true
		
		String s4 ="ab"+"c"; //编译时确定
		String s5  ="ab"+ new String("c");  //运行时确定
		String s6 ="ab";
		String s7 = "c";
		String s8 = s6 + s7;
		String s9 = (s6 + s7).intern();  // 手动添加常量池函数
		System.out.println("=======================");
		System.out.println("s4==s1:"+(s4==s1));  //true
		System.out.println("s5==s1:"+(s5==s1));  //false
		System.out.println("s8==s1:"+(s8==s1));  //false
		System.out.println("s8==s1:"+(s9==s1));  //true
	}

在这里插入图片描述

包装器类

在这里插入图片描述
//自动转换
//自动拆箱 包装类型=>基本类型
int i5 = i1;
//自动装箱 基本类型=>包装类型
Integer i4 = 1;
String.valueOf(10); // 基本=》String
包装.parseXxx(“”); //String=》基本
包装器类 对象 = new 包装器类(值); //基本=》包装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值