- 创建类的好处
- 可以创建无数个对象
- 可以有不同数据类型的属性
- 可以有不同的方法
1 | public class Card{ |
构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47//构造函数的特点:没有返回类型,名字与类名相同
public Person(){
System.out.println("我是人");//覆盖默认的构造函数
}//一般无参默认构造函数要写上
//利用构造函数赋值
public Person(String name,int age,char sex,float h){
this.name=name;//this指的是当前对象,谁调用就是谁
this.age=age;//this在类内部使用
this.sex=sex;
this.h=h;
}
//可以有多个构造函数,但是参数列表得不同,也就是方法重载(与前面的控制符无关)
//重载:方法名相同,参数列表不同,参数个数不同或者参数类型不同
//构造函数是在new后面调用,不能用对象来调用
public class Rectangle{
Point p1;
Point p2;//对象里面包含对象
public Rectangle(Point p1, Point p2){
this.p1 = p1;
this.p2 = p2;
}
void area(Point p1, Point p2) {
p1.x++;//可以修改其他对象的成员变量,但是private的不能直接修改
//private想要自减就得在类内部创建自减函数
return (p1.x-p2.x)*(p1.y-p2.y);
}
}
public class Point{
double x;
double y;
public Point(double x, double y){
this.x = x;
this.y = y;
}
}
Rectangle rect=new Rectangle();//创建Rectangle的同时创建了Point
rect.p1.x=1;//赋值方法1
rect.p2.x=2;
rect.p1.y=1;
rect.p2.y=2;//多次.出来
rect.p1=new Point(1,1);//构造函数用在new后面
rect.p2=new Point(2,2);//法二
Rectangle rect2=new Rectangle(new Point(1,1),new Point(2,2));//法三
System.out.println(rect2.area(p1,p2));//对象之间的交互靠传递对象参数的函数封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//为了不让外部赋值出现错误,所以赋值得用get set方法先进行判断
person.age=-100;//这是错误的
//用private放在类变量前面,则该变量出了类就无法赋值了,或者任何修改操作了,除非用类内部专门进行修改的函数
private int age;
public void setAge(int age){
if(age>=0)
this.age=age;
else
System.out.println("年龄不合法");
}
//一般成员变量都是私有的
public int getAge(){
return this.age;//有set一般就有get,除非是只读或者只写
}
//在eclipse里导航栏的source里面可以快捷添加getter和setter方法
//方法也能私有,在类外部就用不了了,一般用于为类内部的其他方法所调用,成为某个方法的组件静态变量,静态方法,静态块
1 | public class Person { |
小知识点
新建包,就相当于建了文件夹,不同包里面的相同的文件名就不会冲突
如果命名为:aaa.bbb.ccc就会建三层文件夹继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class Dog extends Animal {//子类继承父类会拥有父类所有非私有的属性和方法
}
//如果要利用父类的私有属性对子类属性进行赋值,可以用
this.setName(name);//这样,因为无法直接访问父类私有属性
//显然父类不能访问子类的
//一个子类不能继承多个父类
//但是父类(子类)可以被多个子类继承
Dog d=new Dog();//在创建子类对象时,会先调用父类的无参构造函数,创造一个父类的匿名对象
//然后子类才能使用父类的非私有属性和方法
//如果要调用父类的有参构造函数来对子类属性赋值可以用super
public Dog(name)
{
super(name);
}继承中的重写问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//父类中有一个方法,子类方法的方法名相同,参数列表也相同,只是内容不同,又叫方法覆盖
//如果方法名相同但是参数列表不同,那就是方法重载
//重写的时候如果还是需要父类一部分已经写好的方法,也可以用super
public class Role{
private String name;
public void print() {
System.out.println("姓名:"+this.name);
}
}
public class Magicer extends Role{
private int level;
public void print(){
super.print();//调用父类方法
System.out.println("等级:"+this.level)
}
}
//父类还可以起到规范方法名的作用多态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24//因为方法重载需要写很多次,所以用父类来作为接收的东西
public int attack(Role r){//子类方法用父类来接收就可以接收所有子类,不用子类一个个重载
System.out.println("人物等级:"+this.level)
return hurt;
}
Role role =new Magicer();//把role称为上转型变量,可以访问从父类继承的属性和方法,但不能访问子类的;如果父类属性和方法被重写了,则只能访问子类重写的;可以转化为子类对象
Magicer magicer =(Magicer) role;//强制转换类型
//上转型变量除了能用于接收参数以外,也能用来接收对象数组
Animal[] animal=new Animal[10];
for(int i=0;i<animal.length;i++){
Random r=new Random();
switch(r.nextInt(4)+1){
case 1:animal[i]=new Cat();break;
case 2:animal[i]=new Dog();break;
case 3:animal[i]=new Cow();break;
case 4:animal[i]=new Sheep();break;
}
}
for(int i=0;i<=animal.length;i++)
{
animal[i].speak();//使用重写后的方法
}包和访问控制符
1
2
3
4
5
6
7
8
9
10//新建一个package,就能在不同package里面创建同名的类
//public 不同包以及本包都能访问,通过导包 import 包名.类名,只有不同包才要导入
//如果不加public 或者说不加访问控制符,那它就是默认的default,只能在本包里访问
//对于类来说,只能有public 和 default两种访问控制符
//对于属性和方法来说有四种访问控制符
//private 本类内部
//default 本类中,本包中
//protected 本类中,同一个包中,不同包中的子类里面(父类在不同包里面的继承)
//public 都可以面向对象三大特征
封装、继承、多态抽象类
如果一个类中有抽象方法,那么类就要定义为抽象类1
2
3
4
5
6
7
8
9
10//在class前面加上abstract
public abstract class Animal{
void abstract sing();
}
//子类必须重写抽象方法,override
//用于子类命名规范并且符合实际
//抽象类不能new对象,实例化
//重写后的访问控制符的访问不能比重写前的小接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29//虽然抽象类可以让子类方法能够统一命名,但是有些方法不是所有子类都有的,不能直接用抽象类,比如不是所有动物都能抓老鼠,这时候就要用接口
//新建一个接口类
public interface CatchMouth(){
public void catchMouth();//默认是抽象的,公共的,所以public也可以省去
int a=1;//默认是public static final 不可修改的全局变量
}
//让相应的对象实现接口
public class Cat extends Animal implements CatchMouth{//这下必须重写(方法名相同,参数列表相同)
}
//接口类实现多态效果
CatchMouth c=new Cat();
CatchMouth d=new Dog();
c.catchMouth();
d.catchMouth();//接口引用可以指向实现类对象
//接口也可以作为参数实现多态
public class Person{
void Catch(CatchMouth c){
c.catchMouth;
}
}
Person p=new Person();
p.Catch(new Cat());
p.Catch(new Dog());
//接口可以实现多继承的问题
//一个类可以实现多个接口,用逗号隔开final 关键字
1
2
3
4
5
6
7final int a=3;//该变量值不能修改
final void test(){//子类不能重写该方法(方法名相同参数列表相同)
}
final public A{//final修饰类,则该类不能被继承
}