@liruiyi962464
2017-03-21T01:19:54.000000Z
字数 5513
阅读 473
java
- 类:类是由同一种事物中将相同属性和方法抽取出来封装成类,类就是一个模板,用来产生对象的模板
- 类是抽象的定义,人类,电脑类,猫类.....
- 对象:万物皆对象,对象是具体的东西,例如一张桌子,一台电脑,一个人都是对象,
- 对象是由类产生的,每个对象都有自己的类型,例如一个人是属于人类,桌子属于桌子类,一台电脑是属于电脑类,用户是属于用户类
- 访问修饰符 返回值类型 方法名(参数列表){//方法体}
- 如果返回值类型是void,就表示返回值为空,不用写return语句
- 如果返回值类型是String ,就返回一个String类型的对象(return 一个String类型的对象)
- 如果返回值类型是Person, 就返回一个Person类型的对象(return 一个Person类型的对象)return语句一定要写到最后一行
- 参数的传递是属于值传递
- 局部变量和全局变量:
{
int m=10;//全局变量
public Person test(Person p){
int i=10;//局部变量
System.out.println(m);
return p;
}
public String test2(Person p){
return "姓名是"+p.getName()+",年龄是"+p.getAge();
}
}
class Person{
//Person类的三个属性:姓名 ,年龄,性别
String name;//成员属性
int age;
String sex;
//Person类的方法
public void say(){
System.out.pritnln("hello world");
}
}
- 创建对象也称为实例化
- 对象:创建对象的方法
类名 对象名=new 类名();
其中类名()是构造方法,
例子:Person p1=new Person();
Person p2=new Person();
- 类本身就属于一种封装,封装了同一类事物的属性和方法
-使用访问修饰符private来隐藏细节也是属于封装,四种访问修饰符,权限从小到大为:private < 缺省的 < protected < public
-使用private(私有)修饰的属性和方法只能在本类中访问和调用
-使用public(公开)修饰的属性和方法本类对象都可以直接访问和调用
class Student{
//使用private来隐藏细节,不让对象直接访问
private String name;
private String sex;
private int age;
}
Student stu=new Student();
stu.name;//错误,无法直接访问
- 为私有属性提供公开的getter和setter方法来间接访问属性,给属性赋值和获取属性值
class Student{
//使用private来隐藏细节,不让对象直接访问
private String name;
private String sex;
private int age;
//给私有属性name提供公开的getter和setter方法
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
....
}
Student stu=new Student();
//给name属性赋值
stu.setName("lisi");
//获取name属性值
stu.getName();
构造方法的特点:
1 构造方法和类名完全相同
2 没有返回值类型构造方法的功能:
- 创建对象时会调用构造方法
- 构造方法还可以对属性进行初始化(初始化就是给属性赋值)
- 在类中即使不声明构造方法也会有一个默认的无参构造方法
- 当显示的声明了一个有参的构造方法时,默认的无参构造方法就不存在了
class Student{
private String name;
private String sex;
private int age;
//无参的构造方法
public Student(){}
//带参数的构造方法
public Student(String name,String sex,int age){
this.name=name;
this.sex=sex;
this.age=age;
}
}
- 使用static修饰的方法和属性称为静态方法和静态属性
- 静态方法:可以直接用类名去调用静态方法,静态方法只能访问外部的静态属性和方法,静态方法中不能出现this关键字
- 主方法也是静态方法
class Person{
static int i=10;
public static void say(){
System.out.println("hello world");
}
}
可以在主方法中这样使用:Person.say();
- 静态代码块:静态代码块优先于构造方法的执行,且只执行一次,静态代码块可以用来对外部静态属性进行初始化
- 静态代码块在类加载的时候就被执行了
static{
System.out.println("这是静态代码块");
}
- 静态属性在内存中只存在一份,且被所有的对象所共享
- 普通方法中也可以使用静态属性和方法
(第125行的属性)p1.i=19;//修改了静态变量的值
System.out.println(p2.i);//这个输出的是19
- this代表的是当前对象的引用,可以避免变量重名引起的错误
- this();//调用的是本类无参的构造方法
class Student{
private String name;
public Student(){}
public Student(String name){
this();//调用的是本类无参的构造方法,就是调用的第154的构造方法
this.name=name;
}
}
- 方法的重载与访问修饰符无关
- 在Java中方法签名是唯一的,jvm是根据方法签名来判断方法是否唯一,而不是仅仅根据方法名来判断
- 在本类中,方法签名不同
- 方法签名是方法名+参数列表
- 在同一个类中实现
1 2 5 6 可以构成方法的重载
1 3和4 2和7 都不能构成方法的重载
2 和3可以实现方法的重载
1 public void say(){}
2 public void say(String str){}
3 void say(){}
4 private void say(){}
5 private void say(int i){}
6 public void say(String str2,int a){}
7 public void say(String str2){}
....
- 声明String的两种方法:
1 String str1=new String("abc");
2 String str2="abc";//"abc"保存在字符串常量池中
String str3="abc";
//str3会先从字符串常量池中去查找字符串"abc",如果存在就直接使用存在的字符串,如果没有在去创建字符串"abc"
str2==str3;//true
//str1是使用创建对象的方式去创建String类型的对象
- String类方法的使用
String str = "Made In China";
String str1 = " bach";
//返回字符串的长度
System.out.println(str.length());//结果为:13
//根据指定的索引值返回对应的单个字符
System.out.println(str.charAt(0));//结果为:m
//字符串的拼接
System.out.println(str.concat(str1));//结果为: made in china bach
//是否包含指定的字符串
System.out.println(str.contains("m"));//结果为:true
//比较字符串的大小 根据ASCII比较
System.out.println(str.compareTo(str1));//结果为:
//指定子串在字符串中第一次出现的索引值位置,默认情况是单个字符进行编号
//如果指定子串不存在则返回 -1
System.out.println(str.indexOf("m"));//结果为:0
//指定子串在字符串中最后一次出现的索引值位置,默认情况是单个字符进行编号
//如果指定子串不存在则返回 -1
System.out.println(str.lastIndexOf("a"));//结果为:12
//根据制定子串对字符串进行分割
String[] strs = str.split(" ");
System.out.println(strs[0]);//made
System.out.println(strs[1]);//in
System.out.println(strs[2]);//china
//字符串截取1个参数的截取方式
System.out.println(str.substring(3));//结果为:e in china
//字符串截取2个参数的截取方式
System.out.println(str.substring(2,6));//结果为:de i
//将字符串中的字母全部转换成小写
System.out.println(str.toLowerCase());//结果为:made in china
//将字符串中的字母全部转换成大写
System.out.println(str.toUpperCase());//结果为: MADE IN CHINA
//将字符串中的:“a”全部替换成A“”
System.out.println(str.replace("a", "A"));//结果为:MAde In ChinA
- 必须存在继承关系
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
- 重写的方法的访问权限要大于等于被重写的方法的权限
- 父类中的私有方法不能被重写
- final static修饰的方法不能被重写
- 方法的重载的实现是在同一个类中,重写是在子父类中实现的,重写首先要存在继承关系
- 方法的重载是要求方法签名不同,与访问修饰符无关
- 方法的重写必须和被重写方法具有相同的方法名称、参数列表和返回值
- 重写的方法的访问权限要大于等于被重写的方法的权限
- 私有方法不能被重写
- final,static修饰的方法不能被重写
第一种导包方式
import java.util.Date;
在每个类前面写上完整的包名
例如:java.util.Date today=new java.util.Date();
-java中只能是单继承,继承体现了 is-a 的关系
-在java中,所有的类都默认继承了Object类
-子类继承父类所有的方法和属性(私有的方法和属性不能够被继承)
-子类可以重写父类的方法(但要满足重写的规则)
class Animal{
private String name;
private int age;
....(getter and setter)
public void eat(){}
public Animal(){}
public Anima(String name,int age){
this.name=name;
this.age=age;
}
}
class Cat extends Animal{
public Cat(){
}
public Cat(Sting name,int age){
super(name,age);//这句必须写在第一行
//this();//这句也要写到第一行,会报错
}
}
-super:super代表的是父类对象的引用
-创建子类对象是,会默认会先调用父类的构造方法,在调用子类的构造方法
-父类如果只有带参的构造方法,子类必须要显示的去调用父类的构造方法,调用的时候必须要写在第一行
Object类:equals(),toString(),clone()//克隆 (自己解决)
- 多态是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
父类或者接口的引用变量可以指向子类的对象
实现多态的前提:存在继承关系,有方法的重写
李氏替换原则:凡是子类出现的地方都可以用父类去接收
Animal a=new Cat();//多态的体现对象的上下转型:再向上转型的过程中,会丢失方法,Animal a=new Cat();
- 会丢失cat独有的方法和属性,向上转型是安全的
- 向下转型:向下转型不安全, Dog dog=(Dog)a;//会报异常
- instanceof :用来判断对象是否为特定类型
- 例如 a instanceof Cat 返回boolean类型的值
- 动态绑定和静态绑定:不能被重写的方法都是静态绑定
- 多态的实现就是基于动态绑定
- 有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法
- 抽象类不能被实例化
- 抽象方法没有方法体
- 非抽象子类继承了抽象类,就必须要重写抽象方法,抽象类继承了抽象类可以不重写抽象方法
abstract class Animal{
public abstract void run();//抽象方法
}
- 抽象方法必须要通过子类去实例化
- 接口: 代表的是has-a的关系
interface InterDemo{
int a=10;//这里必须要赋初始值
public void run();//抽象方法
}
- 子类使用implements关键字去实现接口
- 接口中只能有静态常量和抽象方法
- 子类可以去实现多个接口,同时也可以继承其他的类
- 接口可以继承接口