类和对象的简单的复习,在做项目的过程中有时候不知道怎样来调用类创建的对象,简单的几个类可以看清楚,一般在项目中创建十几个类往往就不知道怎么来看
为了以后能够看清楚,现在来回顾一下类和对象的创建,对象的调用和传递(前面写过一篇)
类和对象的基础概念:
JAVA中万事万物都是类 类有字段(属性),方法,嵌套类和嵌套接口 是在其它的类或接口中声明的内部声明的类与接口
a,类的修饰符 ;public private protected 默认的
b,字段:final 最后的不可变的,修饰方法,属性,
static:静态字段:在调用的时候不需要创建对象,而是通过类名直接调用方法
,静态字段是共享的,只要改变一个全部都改变,静态字段不可以在main方法中使用
//静态字段,直接通过类名调用
public class Demo{
public static void main(String[] args){
Demo.init();
}
public static void init(){
System.out.println("我是一个静态方法");
}
}
//静态字段不可以用在main方法中
非静态字段:
类的初始化:
类除了简单的初始化之外,类还可以含有构造器,构造器是一个语句块,用来在new将对象的引用
返回之前初始化对象,
class demo{
public int count;
private static long nextID = 1;
demo(){
count = nextID ++;
}
}
初始化块
class demo{
public int count;
private static long nextID = 1;
{
count = nextID ++;
}
}
静态初始化:
class demo{
public int count;
private static long nextID = 1;
static{
count = nextID ++;
}
}
方法异常与返回;
当调用方法时,控制流从调用的方法传入被调用的方法,被调用的语句将按照它们的语义顺序执行
,当遇到下列三种请款时,方法将结束执行并返回给调用者:执行return语句,到达方法结尾,
抛出为捕获的异常
对象在A中创建 AA a = new AA() ,B类需要A类中的a ,可以直接将AA a;设置为B类的属性就可以? 看下面的代码,:
package 类和对象;
/**
*
* @author Administrator
*构造方法及this的使用
*/
public class Animal {
int legs;
String name;
//第一个构造方法
Animal(){
this("狗",4); //使用this调用Animal(String , int)构造方法;
System.out.println("不带任何参数的构造方法");
}
//第二个构造方法
Animal(String name){
this(name,4); //使用this调用Animal(String , int)构造方法;
System.out.println("需要带参数的构造函数");
}
//第三个构造方法
Animal(String name,int legs){
this.name = name;
this.legs = legs;
System.out.println("需要两个参数的构造函数");
}
void play(){
System.out.println(name +"有" + legs + "条腿");
}
}
//
主方法 启动线程
package 类和对象;
public class AnimalTest {
//主方法
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal dog = new Animal();
Animal cat = new Animal();
Animaldemo de = new Animaldemo();
de.start();
}
}
//线程类,线程没有传递参数;
package 类和对象;
//线程类
public class Animaldemo extends Thread {
private Animal dog;
private Animal cat;
private boolean islive = true;
@Override
public void run() {
try {
while (islive) {
dog.play();
cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}
}
//运行结果;
需要两个参数的构造函数
不带任何参数的构造方法
需要两个参数的构造函数
不带任何参数的构造方法
java.lang.NullPointerException
at 类和对象.Animaldemo.run(Animaldemo.java:22)
分析:在线程中创建了main方法中创建的对象,但是线程在主函数创建的时候没有将需要的对象传给线程
导致线程中的对象是null; 初学者经常会遇到这样的问题
解决方法有两个:
第一个:是通过在创建线程的时候将对象传给线程,线程启动构造函数来接收
1,创建线程的时候传递参数
package 类和对象;
public class AnimalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal dog = new Animal();
Animal cat = new Animal();
Animaldemo de = new Animaldemo(dog, cat);
de.start();
}
}
package 类和对象;
//线程类
public class Animaldemo extends Thread{
//通过线程传递
private Animal dog;
private Animal cat;
public Animaldemo(Animal dog,Animal cat){
this.dog = dog;
this.cat = cat;
}
private boolean islive = true;
@Override
public void run() {
try {
while (islive) {
dog.play();
cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}
}
运行结果;
需要两个参数的构造函数
不带任何参数的构造方法
需要两个参数的构造函数
不带任何参数的构造方法
狗有4条腿
狗有4条腿
狗有4条腿
狗有4条腿
.......
第二个:对象直接在线程中创建
//主函数
package 类和对象;
public class AnimalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animaldemo de = new Animaldemo();
de.start();
}
}
//
package 类和对象;
//线程类
public class Animaldemo extends Thread {
//在线程中创建对象
Animal dog = new Animal();
Animal cat = new Animal();
private boolean islive = true;
@Override
public void run() {
try {
while (islive) {
dog.play();
cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}
}
运行结果:
需要两个参数的构造函数
不带任何参数的构造方法
需要两个参数的构造函数
不带任何参数的构造方法
狗有4条腿
狗有4条腿
狗有4条腿
狗有4条腿
.......