本文共 11764 字,大约阅读时间需要 39 分钟。
Java语言在给被调用方法的参数赋值时,采用传值的方式:
//类public class PassValue{ public void change(int x){ x = 100; System.out.println("方法中x==" + x); }}//类public class Test{ public static void main(String[] args){ PassValue pv = new PassValue(); int x = 5; System.out.println("方法调用之前x=="+ x); pv.change(x); System.out.println("方法调用之后x==" + x); }}
数组、类、String(比较特殊特点:和基本类型一样)
public class PassValue2{ int x ; public void change(PassValue2 obj){ obj.x = 100; System.out.println(“方法中obj.x==” + obj.x); }}public class Test{ public static void main(String[] args){ PassValue2 p = new PassValue2(); p.x = 5; System.out.println(“方法调用之前p.x==” + p.x); p.change(p); System.out.println(“方法调用之后p.x==” + p.x); }}
基本类型返回的实际数据
引用类型返回的是对象的地址
Java语言有三大特征:
什么是封装:在类中,对于不想被类外直接访问的成员变量,进行私有化,同时对外提供一个公有的方法访问私有的成员。
封装成员变量两个步骤:
第一步: 添加private 修饰符
第二步: 添加get和set方法
使用private访问权限实现成员变量的私有化,private修饰的成员变量就是私有成员变量,只能在类内部直接访问,类外不能直接访问
get方法表示访问私有属性的方法:
语法:
public 属性类型 getXxx(){ return 属性;}
set方法表示修改私有属性的值的方法:
public void setXxx(参数类型 参数){ this.xxx = 参数;}
/** * 人类 * 属性: 姓名 年龄 性别 * 方法: eat study * * 封装:(1)把成员变量变成私有的 (2) 添加get和set方法 * @author wgy * */public class Person { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name=name; } public int getAge() { return age; } public void setAge(int age) { if(age>100||age<1) { this.age=18; }else { this.age=age; } } public String getSex() { return sex; } public void setSex(String sex) { if(sex.equals("男")||sex.equals("女")) { this.sex=sex; }else { this.sex="男"; } } public void eat() { System.out.println(name+"开始吃饭..."); } public void study() { System.out.println(name+"开始努力学习..."); } public void show() { System.out.println("姓名:"+name+" 年龄:"+age+" 性别:"+sex); }}
static关键字可以修饰类成员:修饰成员变量、方法、代码块、内部类等。
所有本类对象所共有且相同的一个属性,是类的公用变量,不会随着对象的改变而改变的属性。例如:圆周率。静态属性先于对象,不依赖于对象,可以直接通过类名直接访问(类名.属性名)。
public class Person{ String name; int age; //人口总数 static int totalCount = 1300000000;}public class DemoPerson{ public static void main(String[]args){ System.out.println(Person.totalCount);//Person类中的totalCount属性是一个静态属性,可以直接通过类名访问 }}
所有本类对象所共有且相同的一个公共方法,属于类方法,先于对象的方法,不依赖于对象,可以直接通过类名直接调用(类名.方法名())。
public class Person{ static int totalCount; public static void calcTotalCount(){ System.out.println("统计人口方法"); totalCount=1350000000; }}public class DemoPerson{ public static void main(String[]args){ Person.calcTotalCount(); }}
静态属性和方法使用原则:
1如果这个变量或方法,不属于每个对象,属于整个类,就用静态
2如果这个类是共用的,那么类中的属性和方法都用静态,一般工具类中的方法都是静态的,
如Arrays.方法名()
使用注意事项:
1 静态方法中可以直接访问静态变量,不能直接访问非静态变量。
2 非静态方法中可以直接访问静态变量和静态方法。
3 静态变量存在方法区中静态域中
代码块分为:局部代码块、动态代码块、静态代码块局部代码块:声明在方法中的代码块,使用范围与声明位置相关, 提前释放变量。(了解)动态代码块:又称构造代码块或实例代码块,声明在类体中的代码块,创建对象时自动执行一次,每创建一个对象就执行一次动态代码块,初始化对象。(了解)静态代码块:使用static关键字修饰的动态代码块,在类加载时自动执行,并只执行一次,初始化类(记住)
用import static代替import,静态导入包是JDK1.5中的新特性。一般我们导入一个类都用:import com...ClassName;而静态导入是这样:import static com...ClassName.* ;这里的多了个static,还有就是类名ClassName后面多了个.* ,意思是导入这个类里的静态方法和属性。
静态导入前
public class Demo { public static void main(String [] args){ System.out.println(Integer.MAX_VALUE); System.out.println(Integer.toHexString(36)); }}
静态导入后
import static java.lang.System.out;import static java.lang.Integer.*;public class Demo { public static void main(String [] args){ out.println(MAX_VALUE); out.println(toHexString(36)); }}
这种方法建议在有很多重复调用的时候使用,如果仅有一到两次调用,不如直接写方便。
在原有类的基础上,产生一个新的类,在新的类中可以访问原有类中的非私有成员,并且可以添加一些自己独有的成员,这个过程叫做继承,简单理解一个类继承另外一个类。
实现代码的重用和扩展
模拟现实世界的关系
使用extends关键实现两个类的继承关系
被继承的类:父类,超类,基类
继承的类:子类,派生类
继承符合: is a 关系
public class FatherClass{ //属性 //方法}public class ChildClass extends FatherClass { //属性 //方法}
编写Person类:
属性有:姓名、年龄,出生日期
方法有:showInfo();
编写Student类:
属性有:姓名、年龄,出生日期、学校
方法有:showInfo();
study();
使用继承优化Student类。
public class Person { String name; int age; String birthday; public void showInfo() { System.out.println("姓名:"+name+" 年龄:"+age+" 出生日期:"+birthday); } }public class Student extends Person{ String school; public void study() { System.out.println(name+"好好学习天天向上"); }}
编写动物类 (名字、颜色、品种),打印方法,编写狗狗类(亲密度)和猫类(爱好)继承动物类,狗狗类和猫类都有打印信息的功能,狗狗有看家方法,猫类有玩球方法。
Animal类
/** * 动物类 * (名字、颜色、品种),打印方法 * @author wgy * */public class Animal { //昵称 String name; //颜色 String color; //品种 String strain; //打印信息 public void print() { System.out.println("动物信息: 昵称:"+name+" 颜色:"+color+" 品种:"+strain) ; }}
Dog类
/** * 狗狗类 * @author wgy * */public class Dog extends Animal{ //亲密度 int love; public void lookHome() { System.out.println(name+" 正在给主人看家..........."); } }
Cat类
/** * 猫类 * @author wgy * */public class Cat extends Animal{ //爱好 String hobby; /** * 玩球 * */ public void playBall() { System.out.println(name+"正在玩球.........."); }}
1)私有成员:私有成员不能被子类继承
2)构造方法:父类中的构造方法不能被子类继承,但是会在子类的构造方法中调用(子类的构造方法中默认第一条语句是调用父类的默认构造方法)
1)单继承:一个子类只能有一个父类,一个父类可以有多个子类
2)传递性:继承具有传递性
this 表示当前对象的引用。
this用法:
用法1:调用本类的属性,可以解决成员变量名和局部变量名同名问题。
this.属性名
用法2:调用本类的方法
this.方法名
用法3 :调用本类中其他的构造方法。
this(参数);
注意:1只能用在构造方法中,必须是第一条语句
2只能调用一次
super表示当前父类对象的引用。
1)super.属性:表示访问父类中的属性,当子类中定义了与父类同名的属性时,若想在子类中访问父类的同名属性,需要使用super.属性访问
2)super.方法:表示调用父类中的方法,在子类中需要调用父类中没有被重写的方法时,需要使用super.方法调用
3)super():表示调用父类的构造方法,注意:super()必须是子类构造方法中第一条语句
子类中构造方法默认第一条语句会调用父类的无参数构造方法super(),也可以手动调用父类中带参数的构造方法
public class Animal { //属性 String nickname; String color; String strain; //默认构造方法 public Animal() { System.out.println("父类Animal的构造方法执行了.........."); } //带参构造方法() public Animal(String nickname,String color,String strain) { this.nickname=nickname; this.color=color; this.strain=strain; } //打印方法 public void print() { System.out.println("本动物 昵称:"+nickname+" 颜色:"+color+" 品种:"+strain); }}public class Dog extends Animal{ int love; //默认构造方法 public Dog() { super();//调用父类的默认构造方法 System.out.println("Dog子类的构造方法执行了"); } //带参构造方法 public Dog(String nickname,String color,String strain,int love) { super(nickname, color, strain);//调用父类的带参构造 this.love=love; } public void lookHome() { System.out.println(nickname+"正在给主人看家...."); System.out.println("昵称:"+super.nickname); System.out.println("颜色:"+super.color); System.out.println("品种:"+super.strain); System.out.println("亲密度:"+this.love); super.print(); }}public class Test { public static void main(String[] args) { Dog afu=new Dog(); afu.nickname="阿福"; afu.color="黑色"; afu.strain="哈士奇"; afu.love=100; afu.lookHome(); System.out.println("----------------------------------------"); //调用Dog的带参构造 Dog xiaohei=new Dog("小黑", "白色", "泰迪", 100); xiaohei.lookHome(); }}
this和super的区别:
(1) this表示当前对象的引用,super表示当前父类对象的引用
(2) this.属性可以调用当前对象的属性包括继承的属性,super.属性可以调用父类的属性
(3) this.方法() 可以调用当前对象的方法包括继承的方法,super.方法()可以调用父类的方法
(4) this(参数) 调用本类中其他的构造方法,super(参数) 调用父类的构造方法
(5) this(参数)和super(参数)只能用在构造方法中,必须是第一条语句,只能调用一次,不能同时使用。
为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。
在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突。
public class Employee { private String name; //姓名 private int age; //年龄 private double salary; //薪水 public Employee(){ } public Employee(String name, int age, double salary){ //构造方法 this.name = name; this.age = age; this.salary = salary; } //getter和setter省略 }
为使用定义在不同包中的Java类,需要import语句来引入所需要的类。
语法格式:
import package1[.package2…].类名
public class PackageDemo { public static void main(String args[]){ Employee employee = new Employee(); }}
注意:
要导入某个包中的所有类可以用:包名.*
例如:import java.util.*;
在同一包中的类可以直接互相引用,无需import语句。
权限\使用范围 | 本类 | 同包中类或同包子类 | 不同包子类 | 不同包类 |
---|---|---|---|---|
public | v | v | v | v |
protected | v | v | v | x |
默认[default] | v | v | x | x |
private | v | x | x | x |
package a;public class Person{ public String name; protected int age; char sex; private double sal; public Person(){} public Person(String name, int age, char sex, double sal){ this.name = name; this.age = age; this.sex = sex; this.sal = sal; } public static void main(String[]args){ Person p = new Person("张三", 12, 'm', 5000); System.out.println(p.name); System.out.println(p.age); System.out.println(p.sex); System.out.println(p.sal); }}
package a;public class Student extends Person{ public static void main(String[]args){ Person p = new Person("张三", 12, 'm', 5000); System.out.println(p.name); System.out.println(p.age); System.out.println(p.sex); //System.out.println(p.sal);//同包子类中无法访问父类中私有成员 }}package a;public class Demo{ public static void main(String[]args){ Person p = new Person("张三", 12, 'm', 5000); System.out.println(p.name); System.out.println(p.age); System.out.println(p.sex); //System.out.println(p.sal);//同包类中无法访问父类中私有成员 }}
package b;public class Student extends Person{ public static void main(String[]args){ Person p = new Person("张三", 12, 'm', 5000); System.out.println(p.name); System.out.println(p.age); //System.out.println(p.sex);//不同包中子类中无法访问默认权限成员 //System.out.println(p.sal); }}package b;public class Demo{ public static void main(String[]args){ Person p = new Person("张三", 12, 'm', 5000); System.out.println(p.name); //System.out.println(p.age);//不同包中不能访问受保护属性 //System.out.println(p.sex); //System.out.println(p.sal);//不同包类中无法访问父类中私有成员 }}
使用原则:
方法重载(overload):
1 同一个类中,方法名相同,参数列表不同(个数不同,类型不同,顺序不同)
2 和返回值,访问修饰符无关。
在继承过程中,子类中从父类继承来的方法无法满足自己的需求时,可以在子类中对父类方法进行完善,这个完善过程叫做方法重写(override),方法的重写相当于在子类中覆盖父类中的方法。
案例:
public class Animal { //属性 String nickname; String color; String strain; //默认构造方法 public Animal() { System.out.println("父类Animal的构造方法执行了.........."); } //带参构造方法() public Animal(String nickname,String color,String strain) { this.nickname=nickname; this.color=color; this.strain=strain; } //打印方法 protected Object printInfo() { System.out.println("本动物 昵称:"+nickname+" 颜色:"+color+" 品种:"+strain); return 10; }}public class Dog extends Animal{ int love; //默认构造方法 public Dog() { super();//调用父类的默认构造方法 System.out.println("Dog子类的构造方法执行了"); } //带参构造方法 public Dog(String nickname,String color,String strain,int love) { super(nickname, color, strain);//调用父类的带参构造 this.love=love; } /** * 看家 */ public void lookHome() { System.out.println(nickname+"正在给主人看家...."); } /** * 重写 :覆盖 * 1 方法名相同 * 2 方法参数 返回值类型必须相同 * 3 访问修饰符不能比父类严格 * * java特殊 1.7 返回值 可以和父类兼容就可以,必须是引用类型 */ public String printInfo() { System.out.println("狗狗信息:昵称:"+super.nickname+" 颜色:"+super.color+" 品种:"+super.strain+" 亲密度:"+this.love); return "haha"; }}
访问权限 其他修饰符 返回值 方法名(参数列表)
- 1 在继承过程中,方法名、参数列表、返回值类型必须和父类相同
- 2 访问修饰符不能比父类严格java特殊 1.7 返回值可以和父类兼容就可以,必须是引用类型
方法的重载:Overload,在同一个类中,方法名相同,参数类别不同,互为重载方法。
方法的重写:Override,在继承过程中,在子类中重写父类中继承来的方法,方法名、参数列表、返回值必须相同,访问权限不能比父类严格。
只要在子类中重写了父类的方法,通过子类对象调用该方法一定是子类重写的方法。
转载地址:http://olwfz.baihongyu.com/