例如:
①包含关系:班级 学生 (has a relationship)
②继承关系:学生 大学生 (is a relationship)
③类与对象:大学 清华大学
方法的重载:在同一个类中用同一个名字表示不同的方法
构造方法:创建对象时被调用
↓
类名 对象引用名 = new 构造方法();
Employee emp =new Employee();
信息隐藏,用类进行封装
继承:子类继承父类非私有的方法和属性,即新类必须在已有类的基础上进行构造。
java为单根继承,父类只有一个
java中每个类都有父类:Object
1.父类定义了自己的构造方法,子类所有的构造方法中都必须先调用父类,并且super(…)调用的语句必须是子类构造方法中的第一个
public class Employee { String name; int age; float salary; Employee(String n,int a,float s){//构造函数 this.name=n; this.age=a; this.salary=s; } }
public class Manager extends Employee { float allowance; Manager(String n, int a, float s,float allowance) {//构造函数 super(n, a, s);//super表示当前对象的父类对象,表示父类的构造函数 this.allowance=allowance;//this,表示当前对象 } }
2.覆盖(override):子类对父类同名方法的重写(子类可以把从父类那继承来的某个方法改写,形成与父类方法同名,解决问题相似,但具体实现和功能不一致的新方法)
依旧以Employee和Manager为例:
public class Employee { //属性 String name; int age; float salary; //构造函数 Employee(String n,int a,float s){ this.name=n; this.age=a; this.salary=s; } //普通方法 String getInfo(){ return "name:"+this.name+" age:"+this.age+" salary:"+this.salary; } }
public class Manager extends Employee { //属性 float allowance; //构造函数 Manager(String n, int a, float s,float allowance) {//继承 super(n, a, s);//super表示当前对象的父类对象,表示父类的构造函数 this.allowance=allowance;//this 表示当前对象 } //普通方法 String getInfo() {//覆盖,调用父类的方法(super.当前方法)+子类新增的输出 return super.getInfo()+" allowance"+this.allowance; } }
基本形态:①重载②继承③对象引用多态
什么是对象引用多态?父类引用可以指向子类对象,也可以理解为兼容
【一个对象只有一种形式,即构造函数所确定的,但是引用一个对象(父类)可以指向不同形式对象(子类)。】
public class CalTax {//多态的应用 void findTax(Employee e) {//Employee是父类,传入参数为子类时依旧可以使用 System.out.println(e.salary*0.1f); }
public class Test { public static void main(String[] args) { //引用的多态(父类引用可以指向子类对象) //在创建对象时可以使用父类来创建,如以下两行 Employee emp=new Employee("zhangsan",18,1500f); Employee mng=new Manager("lisi",20,2000f,500f);//对象:Manager //在调用方法时,子类可以作为传入的参数 CalTax cal=new CalTax(); cal.findTax(emp); cal.findTax(mng); //若子类对父类的方法实现覆盖,使用父类的时候,以实际对象类型为准 System.out.println(emp1.getInfo());//emp1实际对象类型为Employee System.out.println(emp2.getInfo());//emp2实际对象类型为Manager } }
abstract只规定一个接口,当父类中有抽象方法时,子类(不是abstract)必须完成父类定义的抽象方法。
访问控制符 | 范围 |
---|---|
public | 公共,可以被任何类使用 |
protected | 可被同包中的其他类使用,可被子类继承 |
无访问限定符 | 可被同包中的其他类使用 |
private | 只限在本类中使用 |
以计算圆的面积和周长为例:
public interface CalArea {//创建一个接口,定义实现计算圆的面积的方法 double pi=3.14; double calArea(double r);//仅仅是定义一个方法体 }
public interface CalCircumference {//创建一个接口,定义实现计算圆的周长的方法 double calCircumference(double r);//仅仅是定义一个方法体 }
public class Circle implements CalArea, CalCircumference {//实现接口 //一下两个@override体现了“实现接口的类要实现接口的全部方法” //在实现接口的类中具体定义方法体 @Override public double calCircumference(double r) { return 2 * pi * r; } @Override public double calArea(double r) { return pi * r * r; } }
public class Test {//测试 public static void main(String[] args) { Circle c=new Circle(); System.out.println(c.calArea(3.0)); System.out.println(c.calCircumference(3.0)); } }
(以下部分知识点来源:菜鸟教程)
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
接口 | 接口描述 |
---|---|
Collection | 一个Collection代表一组Object,即Collection元素,Java不提供直接继承自Collection的类,只提供继承的子接口(如List、Set) |
List接口 | List接口是一个有序的Collection,能够精确地控制每个元素插入的位置通过索引来访问元素,第一个元素的索引为0,允许有相同的元素(不唯一) |
Set | 具有与Collection完全一样的接口,不保存重复的元素(唯一),无序 |
Map | 提供key→value的映射 |
类 | 类描述 |
---|---|
LinkedList | 实现了List接口,允许有空值,主要用于创建链表数据结构【增加、删除效率高,查找效率低】 |
ArrayList | 实现了List接口,实现了可变大小的数组【插入删除效率低】 |
HashSet | 实现了Set接口,不允许出现重复元素,最多包含一个NULL元素 |
HashMap | 实现了Map接口,key→value,最多允许一条记录key为空【访问速度快】 |
特点
实现了List接口
允许有空值
使用情况:
①通过循环访问列表中某些元素
②频繁地在列表各个位置进行添加、删除元素操作
public class Test { public static void main(String[] args) { LinkedList<String> linkedlist=new LinkedList<String>(); //插入元素 linkedlist.add("");//允许元素值为空 linkedlist.add("0aa"); linkedlist.add("0aa");//允许插入重复元素 linkedlist.add("1bb"); linkedlist.add("2cc"); linkedlist.add("3dd"); System.out.println(linkedlist); /*[, 0aa, 0aa, 1bb, 2cc, 3dd]*/ linkedlist.addFirst("000");//头插 linkedlist.addLast("4ee");//尾插 System.out.println(linkedlist); /*[000, , 0aa, 0aa, 1bb, 2cc, 3dd, 4ee]*/ linkedlist.removeFirst();//删除头尾元素 linkedlist.removeFirst(); linkedlist.removeLast(); System.out.println(linkedlist); /*[0aa, 0aa, 1bb, 2cc, 3dd]*/ System.out.println(linkedlist.getFirst());//输出头尾元素 System.out.println(linkedlist.getLast()); /*0aa 3dd*/ //遍历的两种方法 for(int i=0;i<linkedlist.size();i++) { System.out.print(linkedlist.get(i)+" "); } for(String str:linkedlist) { System.out.print(str+" "); } /*0aa 0aa 1bb 2cc 3dd */ linkedlist.add(1,"1aa");//指定位置插入元素 System.out.println(linkedlist); /*[0aa, 1aa, 0aa, 1bb, 2cc, 3dd]*/ //使用iterator遍历 Iterator<String> it=linkedlist.iterator(); while(it.hasNext()) { System.out.print(it.next()+" "); } /*0aa 1aa 0aa 1bb 2cc 3dd */ }
public class Test { public static void main(String[] args) { ArrayList<String> l=new ArrayList<String>(); //添加元素 l.add("000"); l.add("111"); l.add("222"); l.add("333"); System.out.println(l.size());//输出大小 System.out.println(l); /*4 [000, 111, 222, 333]*/ System.out.println(l.get(0));//获得0,3位置上的元素 System.out.println(l.get(3)); /*000 333*/ l.set(0, "00a");//在指定位置插入元素 l.remove(3);//删除指定位置的元素 System.out.println(l); /*[00a, 111, 222]*/ for(String str:l) { System.out.print(str+" "); } /*00a 111 222 */ l.add("000");//末尾添加一个元素 System.out.println(l); Collections.sort(l);//排序 System.out.println(l); /*[00a, 111, 222, 000] [000, 00a, 111, 222]*/ //使用iterator进行遍历 Iterator<String> it=l.iterator(); while(it.hasNext()) { System.out.print(it.next()+" "); } /*000 00a 111 222*/ } }
public class Test { public static void main(String[] args) { HashSet<String> hashset=new HashSet<String>(); //添加元素 hashset.add("000"); hashset.add("111"); hashset.add("222"); hashset.add("333"); hashset.add("444"); hashset.add("000"); System.out.println(hashset.size()); System.out.println(hashset); /*5 [000, 111, 222, 333, 444]*/ //判断是否包含某元素 System.out.println(hashset.contains("222")); System.out.println(hashset.contains("555")); /*true false*/ hashset.remove("444");//删除指定元素 System.out.println(hashset); /*[000, 111, 222, 333]*/ for(String str:hashset) { System.out.print(str+" "); } /*000 111 222 333 */ Iterator<String> it2 =hashset.iterator(); while(it2.hasNext()) { System.out.print(it2.next()+" "); } /*000 111 222 333*/ } }
public class Test { public static void main(String[] args) { HashMap<Integer,String> hashmap=new HashMap<Integer,String>(); //添加元素 hashmap.put(1, "aaa"); hashmap.put(1,"bbb");//唯一 hashmap.put(10, "bbb"); hashmap.put(3, "ccc"); hashmap.put(7, "ddd"); hashmap.put(6, "fff"); System.out.println(hashmap.size()); System.out.println(hashmap);//hashmap按照key的值排序 /*5 {1=bbb, 3=ccc, 6=fff, 7=ddd, 10=bbb}*/ System.out.println(hashmap.get(1));//获取key值为1、5对应的value System.out.println(hashmap.get(5));//key=5没有对应的value /*bbb null*/ hashmap.remove(6);//移除key为6的值 System.out.println(hashmap); /*{1=bbb, 3=ccc, 7=ddd, 10=bbb}*/ for(int i:hashmap.keySet()) { System.out.print(i+"→"); System.out.print(hashmap.get(i)+" "); } /*1→bbb 3→ccc 7→ddd 10→bbb */ for(String str:hashmap.values()) { System.out.print(str+" "); } /*bbb ccc ddd bbb */ Iterator<Integer>it2=hashmap.keySet().iterator(); while(it2.hasNext()) { int x=it2.next(); System.out.print(x+"→"+hashmap.get(x)+" "); } /*1→bbb 3→ccc 7→ddd 10→bbb */ } }
一个java程序只允许有一个public主类,其他类都为支持类(.class二进制字节码文件),一般情况下一个文件一个类
首先深表歉意,本篇文章不是特别地完整。我目前正在学习java,刚入门,所以阅读过程中有任何错误的地方敬请指正,非常感谢大家。CSDN是一个很好的学习平台,我在这里从各位大佬的文章中汲取知识,也用写文章的方式记录自己的学习。
文章笔记会定期更新~
欢迎各位小伙伴们来一起讨论学习~