java基础(类与对象、集合)
java基础(类与对象、集合)
- 类与对象
- 类与对象中的栈和堆
- 构造方法
- this关键字
- 面向对象三大特性
- 封装性(private)
- 继承性(extends)
- 方法重写(@override)
- 多态性
- 向上转型(upcasting)
- 向下转型(downcasting)
- 简单工厂模式
- final关键字
- 抽象类
- 接口
- 集合
- ArrayList
- 泛型
- LinkedList
- Set集合
- 哈希表
- Map
类与对象
举例:
1.就拿英雄联盟或者王者荣耀来说
英雄这个统称我们叫做类
具体的哪个英雄我们称之为对象
2.做月饼
做月饼的模具我们可以称之为类
通过磨具做出来具体的月饼我们称之为对象
类和类中的对象都有一些共同的属性,对象是根据所在类的共同属性而做出来的
类是对象的模板,对象是类具体的一个实例
创建一个简单的类与对象:
类文件代码:
package OOPdemo;public class Person {// Person类所拥有的属性String name;int age;// Person类所拥有的方法public void eat(){System.out.println("在吃饭");}public void study(){System.out.println("在学习");}public void sleep(String place){System.out.println("在"+place+"睡觉");}
}
package OOPdemo;public class Test1 {public static void main(String[] args) {// 创建一个zs的对象Person zs = new Person();// 给zs对象上绑定person类的属性zs.name = "张三";zs.age = 21;zs.eat();zs.study();zs.sleep("寝室");}
}
类与对象中的栈和堆
1.每个线程(调用一次main就会开启一个新的线程)会有单独的一个栈。每次调用方法,就会开启一个栈帧,方法结束以后栈帧弹出。先进后出。和垃圾回收机制没有关系。存放局部变量
2.堆内存中是共享的空间,不管多少线程,共享一块堆内存,对象中的内容都是存在堆内存中的。如果对象失去了指向,那么就会被垃圾回收。存放成员变量
构造方法
1.也叫做构造器
2.和类同名,不写返回值类型
3.完成对象的初始化操作
4.如果没有构造初始化方法,则系统会自动提供一个无参的构造方法
this关键字
this的作用:
1.每创建一个对象,都会产生一个this的引用变量,指向当前对象
2.在类的内部,可以通过this来访问类的成员
this的使用:
this.no = no;(调用成员变量,如果变量同名,则可以使用this来区分)
this(no, name);(调用构造方法,则需要放在方法内部的第一句)
面向对象三大特性
封装性(private)
访问权限修饰符:private、默认、protected、public
private:表示私有,只有自己类能够访问
默认:只有同一个包的类能够访问
protected:表示可以被同一个包的类和其他包的子类访问
public:表示可以被该项目的所有包中的类访问
类的属性的处理:
1.一般使用private访问权限
2.用封装的get、set方法来访问操作相关属性(注意:如果有传参的构造方法初始化传递的参数,则需要在构造方法中也使用set、get方法来对参数进行赋值)
类的处理:
1.类只能使用public和默认来进行修饰
2.默认:当前包
3.public:当前项目下的所有包
继承性(extends)
定义:继承可以让我们更加容易实现对类的扩展,比如说我们定义了动物类,那么哺乳动物就可以继承动物的公有属性或者方法(比如说都有名字、年龄、会说、会吃等等)
使用要点:
1.默认父类:Object
2.super:代表直接父类对象
3.this:指向对象本身
4.只有单继承
5.子类继承父类,可以得到父类的全部属性和方法,但不一定可以全部使用,因为可能会出现私有属性或方法
方法重写(@override)
背景:从父类继承下来的方法已经无法满足子类的需求了,这时我们可以考虑方法重写
public void introduce (){super.introduce() ; //通过super调用父类的方法,这里可以选择不调用父类方法,完全自己重写system.out.println (nickName) ;
}
注:
1.如果有修饰符final表示最后一个,则不能重写;如果是静态方法,则不能重写。
2.IDEA中alt+insert可以快速创建构造方法和set和get方法等等
多态性
多态指的是同一个方法调用,对象的不同会导致可能会有不同的行为,比如说,同样是吃饭,中国人是用筷子吃饭,而英国人使用刀叉吃饭
多态要点:
1.多态和成员变量无关,和重写的方法有关
2.无法调用子类特有的方法
3.多态的存在有3个必要条件(继承,方法的重写,父类引用指向子类对象)
4.父类引用指向子类对象后,用该父类调用子类重写的方法,此时多态就出现了
Programmer pro = new Chinese();//父类引用指向父类对象
pro.writeCode();
pro.eat();//多态,调用中国人的吃饭方法
向上转型(upcasting)
//引用数据类型的类型转换
Programmer pro = new Chinese();//此时是自动转换,向上转型,chinese向programer转型
pro.writeCode();//调用从父类继承的方法,结果是唯一的
pro.eat();//调用被子类重写的方法,结果是子类的结果
向下转型(downcasting)
将父类的引用变量转换成子类的类型,叫做向下转型,向下转型后就可以调用子类特有的方法。
1.需要进行强制转换
2.跟基本数据类型向下转换不同,基本数据类型强制向下转换相当于“做手术”。引用类型强制转换不能“做手术”,必须转化为真实的子类类型
//引用数据类型的类型转换
Programmer pro = new Chinese();
pro.eat();
//pro.playBoxing();***不能直接使用子类特有的方法
Chinese ch =(Chinese)pro; //向下强制转换
ch.playBoxing() ; //此时可以调用子类特有的方法
注:在类的继承树关系上,必须要有上下级关系
简单工厂模式
工厂负责创建,使用者直接调用;
基本要求:
1.定义一个static方法,可以直接通过类名调用
2.传入一个字符串类型的参数,工厂根据参数创建相应的对象(子类产品)
final关键字
作用:
1.修饰变量:被修饰后不能被改变,一旦被赋值,就不能重新赋值
final a = 100;
2.修饰方法:不能被重写,但可以被重载
final void look(){}
3.修饰类:被修饰的类不能被继承
final class A{}
注意:
1.不能修饰构造方法
2.修饰基本数据类型,只能赋值一次
3.修饰引用数据类型时,比如:
final Cat cat = new Cat();
不能变的是cat这个对象的引用地址,其内部的属性还是可以发生改变的
抽象类
比如说我们创建动物类的时候,有时候不希望这个动物类不被new成一个实例对象,就可以在类之前加上一个abstract(抽象的),就可以防止被new出一个新Animal
Animal类
public abstract class Animal {private String name;private int age;// 无参构造方法public Animal() {}// 有参构造方法public Animal(String name, int age) {this.name = name;this.age = age;}
}
主类
public static void main(String[] args) {// Animal an = new Animal(); 会报错,因为Animal是抽象类}
扩充:抽象方法:
Animal类:
public abstract void look();/*{System.out.println("----动物在看----");}*/
特点:没有方法体,告诉子类必须给抽象方法具体的实现,否则会报错
Dog类:
public void look(){System.out.println("---animal look---");}
接口
背景:
比如说多种事物都有同样的功能,比如人和爬行动物都有吃的功能,但他们的父类都不是同一个,此时就可以使用接口来实现
定义:
1.接口定义的是一种规范,一组规则
2.接口中定义的全是全局静态final常量
3.接口不能new,也没有构造方法,不会自动继承类
4.接口中所有的方法都是抽象的
5.接口之间用的是继承(extends)
6.接口与类之间用的是实现(implements)实现接口中的规范
接口中定义一个常量:
public static final int age;
// 接口中下面这种的定义方式的性质其实就是上面这种
int age;
注:既有继承又有实现的话,先写继承extends再写实现implements
最后还有异常和常用类,做实际项目时都会接触到的,建议多敲代码,这两个就很好理解
集合
ArrayList
// 创建一个ArrayList对象ArrayList arr = new ArrayList();
// 向ArrayList中添加元素arr.add(80);//在末尾添加一个元素arr.add(69);//自动装箱arr.add(68);//集合的元素必须是对象类型arr.add(1, 100);//指定位置添加数据
// 获取ArrayList的数据System.out.println("---------------------------");System.out.println(arr);System.out.println(arr.size());//获取元素个数System.out.println(arr.get(1));//获取索引对应元素
// 遍历arrSystem.out.println("---------------------------");
// 1、for (int i = 0; i < arr.size(); i++) {int arrs = (int)arr.get(i);System.out.println(arrs);}System.out.println("-------------------------------");
// 2、使用迭代器遍历Iterator it = arr.iterator();while (it.hasNext()){int its = (int)it.next();System.out.println(its);}
缺点:
1.遍历得到的数据类型是对象,需要强制转换
2.添加字符串类型数据不安全
解决办法(**
泛型
**(jdk1.5))(数据安全,不需要强制转换):
// 创建一个ArrayList对象ArrayList<Integer> arr = new ArrayList<Integer>();
// 2、使用迭代器遍历Iterator<Integer> it = arr.iterator();
其他方法:
// 删除方法:arr.clear();//全部删除arr.remove(new Integer(80));//删除内容为80的元素arr.remove(1);//删除索引为1的元素// 修改方法:arr.set(0,99);
LinkedList
和ArrayList使用方法基本相同
相对于ArrayList提供了更多的方法
不同的地方:
1.底层的存储结构发生改变
ArrayList:数组
LinkedList:双向链表
2.方法底层的实现(比如在指定位置添加元素)
ArrayList:后移元素 效率较低
LinkedList:修改前后节点指针 效率较高
使用哪种集合根据情况而定:
如果是添加删除元素 LinkedList
如果是按照索引查询元素 ArrayList
Set集合
Set <String>se = new <String>HashSet();se.add("HTML");se.add("CSS");se.add("Javascript");se.add("HTML");//不接受重复数据System.out.println(se.size());//3System.out.println(se.toString());//[CSS, Javascript, HTML]
HashSet:唯一、无序
Set <String>se = new <String>LinkedHashSet();se.add("HTML");se.add("CSS");se.add("Javascript");se.add("HTML");//不接受重复数据System.out.println(se.size());//3System.out.println(se.toString());//[HTML, CSS, Javascript]
LinkedHashSet:唯一、有序(添加顺序)
Set <String>se = new <String>TreeSet();se.add("HTML");se.add("CSS");se.add("Javascript");se.add("HTML");//不接受重复数据System.out.println(se.size());//3System.out.println(se.toString());//[CSS, HTML, Javascript]
TreeSet:唯一、有序(自然顺序)、红黑树(从小到大)
遍历方法(foreach、迭代)
// 两种遍历方法
// 1.foreachfor (String ele:se) {System.out.println(ele);}
// 2.迭代Iterator<String> it = se.iterator();while (it.hasNext()){String ele = it.next();System.out.println(ele);}
哈希表
哈希表中添加数据步骤:
1.计算哈希码
x=key.hashCode();
2.根据哈希码计算存储的位置
y=x%11;
3.存入指定的位置
情况一、如果是空链表:直接添加一个节点
情况二、如果不是空(数据不相同):调用equals进行比较,如果没有相同的内容,则添加到节点中
情况三、如果不是空(数据相同):调用equals进行比较,如果有相同的内容,则不再添加,确保了数据的唯一性
哈希表的查询和添加顺序是一样的
Map
特点:key唯一、无序
创建方法和Set类似,不过要注意的是使用泛型时要指定key和value的数据类型
添加数据用put方法
HashMap:
//创建一个map对象Map<String,String> map = new HashMap<String,String>();//向map对象中添加数据map.put("cn","China");map.put("jp","Japen");
// 查看数据System.out.println(map);//{jp=Japen, cn=China}System.out.println(map.size());//2
key:唯一、无序、HashSet特点
value:不唯一、无序
LinkedHashMap:
//创建一个map对象Map<String,String> map = new LinkedHashMap<String,String>();//向map对象中添加数据map.put("cn","China");map.put("jp","Japen");
// 查看数据System.out.println(map);//{cn=China, jp=Japen}System.out.println(map.size());//2
key:唯一、有序(添加顺序)、LinkedHashSet特点
value:不唯一、无序
TreeMap:
key:唯一、有序(自然顺序)、TreeSet特点、不能添加空元素
value:不唯一、无序
Map常用操作:
创建对象、添加数据、根据key查找数据
遍历:
//通历2∶得到所有的key-value组成的set,直接逼历Set 推荐使用Set<Map.Entry<String,String>> entrySet = map.entrySet();for (Map.Entry<String,String> entry:entrySet){// System.out.println (entry) ;System.out.println (entry.getKey() +"====>>"+entry.getValue());}
java基础(类与对象、集合)相关推荐
- Java基础--类与对象
2019独角兽企业重金招聘Python工程师标准>>> 一.类与对象 类是对一类事物描述,是抽象的.概念上的定义. 对象是实际存在的该类事物的每个个体,因而也称实例(instan ...
- Java 基础——类和对象
Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究类与对象的概念. 对象:对象是类的一个实例,有状态和行为.例 ...
- Java基础——类和对象的使用
2019独角兽企业重金招聘Python工程师标准>>> 类的定义: 对象的定义: 转载于:https://my.oschina.net/u/3746823/blog/1595889
- Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举
Java基础(一):编译和解释.数据类型.变量作用域.String常用方法.数组.面向对象.异常 Java基础(二):集合.IO流(Zip压缩输入/输出流等).File文件类.反射.枚举 Java异常 ...
- java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用
java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用 七十年代,IBM的Smalltalk语言最先推广面向对象,后来C语言变为C++,后来C++又产生了J ...
- Java基础之数组与集合
Java基础之数组与集合 一.数组 二.冒泡排序算法 三.选择排序算法 四.二维数组 五.Arrays 工具 六.宠物管理系统 七.集合 Collection 八.List 九.重写 equals 方 ...
- Python基础(类与对象)
Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- java演练 类与对象 给我一个数字还你一个字符串
java演练 类与对象 给我一个数字还你一个字符串 视频 https://www.ixigua.com/i6870502014800003598/ 代码 类 public class Game {pu ...
最新文章
- 【java】兴唐第三十一节课之反射
- html 标签、图像、链接、注释、锚点定位、特殊字符
- 2019年中国智能制造的十大发展关键点
- 数据中心管理:从DCIM过渡到DMAAS
- 计算不规则图形周长_7.2三年级上册数学《周长》同步练习,附答案
- Hadoop宿醉:使用Apache Whirr启动hadoop集群CDH4
- 云原生安全厂商小佑科技完成数千万Pre-A轮融资
- java自定义注解实现日志功能
- 2017.9.6.语文
- 微信小程序自定义弹窗组件
- python求解重叠区域线段覆盖总长度
- [疑难解答]MSN常见问题及回答(转)
- 软件测试方法可以分为几种?
- android9手机* 代码,android Telephony学习 --- 第九篇 USSD简介
- java.lang.Byte常用方法
- nginx 安装和使用godaddy颁发证书
- 【多线程】初识多线程
- Vue Vant点赞效果
- 哪些东西买了之后,会让人因生活质量和幸福感提升而感觉相见恨晚?
- C++函数模板与类模板的区别
热门文章
- 用户操作日志记录字段修改前后值
- ubuntu下使用bt dongle
- windows下部署多个解压缩包版本的MySql5.7步骤及解决办法
- gets();getschar();fget();
- java引用数组长度_如何引用Java数组的长度
- 英雄联盟总结之客户端综述4(笔记分享)
- 宇视网络视频录像机人机实况画面偏色排查步骤
- python自动生成鸡汤文_用20行Python代码生成鸡汤,打造AI咪蒙指日可待。
- 【Java】泛型常用特点
- OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码