面向对象有三大特征:
一、封装的概念
struct Student
{
int age; //类似与java中的属性 特征
char* name;
void (*introduce)(int age,int name,int score); //函数 = 行为
void (*testFunc)();
};
二、类的封装以及使用:
//封装一个类
class Student //写规范来,第一个字母大写
{
int age; //属性
String name;
double score;
void introduce(){ // 方法 = C语言中的函数
System.out.println("my name is"+name + "age:"+age + "score"+score);
} //面向对象的特性就是方法可以访问本类的特征属性,不需要额外的去传参
void testFunc(){
System.out.println("testFunc");
}
}
//怎么使用这个类呢?
public class Demo1 {
public static void main(String[] args) {
Student stu1 = new Student();
//这操作叫实例化一个对象
//类 = 模板,类不能直接使用,不能直接访问变量,需要先实例化,申请一个空间。
//改成Student stu1 = null,好比C语言的指针使用前不malloc开辟空间
/*这操作就等同于在c语言中,我们对结构体指针的定义及访问
struct Student* p;
p = malloc(sizeof(struct Student));
*/
stu1.age = 18;
stu1.score = 99.5;
stu1.name = "ajie"; //不需要像C语言中strcpy赋值
stu1.introduce();
}
}
三、访问修饰符
位置 | private | 默认 | protected | public |
---|---|---|---|---|
同一个类 | 是 | 是 | 是 | 是 |
同一个包内的类 | 否 | 是 | 是 | 是 |
不同包内的子类 | 否 | 否 | 是 | 是 |
不同包且不是子类 | 否 | 否 | 否 | 是 |
四、属性封装的实现
class Student
{
private int sex;//可以通过下面的方法间接访问隐私属性
public void setsex(int finalsex)
{
sex = finalsex;
}
public int getsex()
{
return sex;
}
}
public class Demo2 {
public static void main(String[] args) {
Student stu1 = new Student();
stu1.setsex(10);
System.out.println("sex="+stu1.getsex());
}
}
五、方法封装的实现
class Age//注意这个类的名字第一个大写(好习惯),不能跟下面的age一样
{
private int age;
void setAge(int realAge){
age = realAge;
}
private void tellAlie(int falseAge)//“封装的”不对外公开的方法
{
age = falseAge;
}
void askMyAge()//当别人问我的姓名
{
tellAlie(18); //外部不知道这个方法的存在
System.out.println("别人问我我就说我永远"+age);
}
void resumeAge()
{
System.out.println("简历上是真实年龄:"+age);
}
}
public class Demo3 {
public static void main(String[] args) {
Age a1 = new Age();
a1.setAge(36);
a1.resumeAge();//通过这个方法访问到的是真实年龄
a1.askMyAge(); //不对外公开的方法修改了真实年龄
}
}
六、UML类图
七、类的构造方法与可重载
class Student
{
private int age;
int momAge;
String name;
float score;
//方法名字与类名相同
//构造方法在实例化对象new时会被调用,到时候再传递参数
//如果不写,系统自动实现,无参无内容
Student(int newAge,String newName,float newScore)
{
System.out.println("构造方法一被调用");
age = newAge;
name = newName;
score = newScore;
}
//java中,方法是可重载的,即为函数名一样,参数列表不同即可
Student(String newName)
{
System.out.println("构造方法二被调用");
name = newName;
}
Student(String newName,float newScore)
{
System.out.println("构造方法三被调用");
name = newName;
score = newScore;
}
//传入参数类型不同,调换顺序就成为新的构造方法
Student(float newScore,String newName)
{
System.out.println("构造方法四被调用");
name = newName;
score = newScore;
}
/* 不能同时有两个int int类似的构造方法,否则数据混淆,IDEA不给你用
Student(int newAge,int newMomAge)
{
System.out.println("构造方法五被调用");
age = newAge;
momAge = newMomAge;
}
*/
}
public class Demo1 {
public static void main(String[] args) {
//使用哪种构造方法,根据传入的参数而定(不仅是靠个数判断)
Student stu1 = new Student(20,"ajie",100);
Student stu2 = new Student("ajie");
Student stu3 = new Student("ajie",100);
Student stu4 = new Student(100,"ajie");
//Student stu5 = new Student(100,100);
System.out.println(stu1.name + stu1.score);
}
}
八、this关键字
class student
{
String name;
int age;
void thisTest()
{
//第一种使用方法示例:
System.out.println(this.name);
}
//第四种使用方法示例:构造方法中又调用另一个构造方法
student(String name){
System.out.println("构造方法2被调用了");
this.name = name;
}
}
public class Demo1 {
public static void main(String[] args) {
student stu1 = new student("ajie");//被指定了使用这个构造方法
stu1.thisTest();//thisTest是一种方法,而stu1是调用这个方法的对象
//this就是对这个对象的一种引用,引用他的特征,所以
//会输出stu1对象的信息
}
}
class student
{
String name;
int age;
void thisTest()
{
//第二种使用方法示例:
student stuTemp = null;//临时的对象,太像结构体指针了
stuTemp = this; //把当前对象赋给stuTemp.当前对象:如果是对象stu1,那么就是stu1对象赋给它
System.out.println(stuTemp.name);//必须开辟空间(有对象)
}
//第四种使用方法示例:构造方法中又调用另一个构造方法
student(String name){
System.out.println("构造方法2被调用了");
this.name = name;
}
}
public class Demo1 {
public static void main(String[] args) {
student stu1 = new student("ajie");//被指定了使用这个构造方法
stu1.thisTest();//thisTest是一种方法,而stu1是调用这个方法的对象
//this就是对这个对象的一种引用,引用他的特征,所以
//会输出stu1对象的信息
}
}
class student
{
String name;
int age;
//第三种使用方法示例:最常用的解决同名问题
/*student(String name,int age){
name = name;
age = age;
} */
student(String name,int age){
System.out.println("构造方法1被调用了");
this.name = name; //name传给当前对象的name
this.age = age;
}
}
public class Demo1 {
public static void main(String[] args) {
student stu1 = new student("ajie",18);//被指定了使用这个构造方法
}
}
class student
{
String name;
int age;
//第三种使用方法示例:最常用的解决同名问题
/*student(String name,int age){
name = name;
age = age;
} */
student(String name,int age){
System.out.println("构造方法1被调用了");
this.name = name; //name传给当前对象的name
this.age = age;
}
//第四种使用方法示例:构造方法中又调用另一个构造方法
student(String name){
this("ajie",21); //this构造方法只能放在第一句!!!
System.out.println("构造方法2被调用了");
this.name = name;
}
}
public class Demo1 {
public static void main(String[] args) {
student stu1 = new student("ajie");
}
}
九、static关键字
class Student
{
int age;
String name;
double score;
static int data;//(1)类变量(静态变量)
Student(int age,String name,double score){ //构造方法
System.out.println("构造方法");
this.age = age;
this.name = name;
this.score = score;
}
void introduce(){
System.out.println("名字:"+name + " 年龄:"+age + " 分数:"+score);
}
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(18,"ajie",99.5);//实例化
//通过对象访问类的属性(成员),可以
stu1.age = 10;
//不实例化,通过类名访问类的属性(成员),会报错
//Student.agt = 10;
//(1)非要通过类名访问类的特征属性(成员),该成员变量就要定义为类变量(静态变量)
Student.data = 10;
}
}
public class Test {
public static void main(String[] args) {
//(2)
System.out.println("ret = "+add(1,1));//不通过对象,直接访问类的方法
}
//(2)脱离对象,直接使用方法
static int add(int a,int b){ //脱离对象,直接使用方法
return a + b;
}
}
class Student
{
int age;
String name;
double score;
static int data;//(1)类变量(静态变量)
Student(int age,String name,double score){ //构造方法
System.out.println("构造方法");
this.age = age;
this.name = name;
this.score = score;
}
static { //(4)静态代码块的格式要求
System.out.println("静态代码块"); //静态代码块优先于构造方法执行
data = 5; //并且只执行一次,因为静态变量同类一起,一开始就存在了(相对于需要创建的对象)
} //但构造方法每次在实例化一个对象都会执行
//static void test(){
// System.out.println(this.age);//会报错 静态方法中不能出现this关键字
// System.out.println(age);//会报错 静态方法中只能访问外部的静态成员 比如data
//}
void introduce(){
System.out.println("名字:"+name + " 年龄:"+age + " 分数:"+score);
}
}
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(18,"ajie",99.5);//实例化
Student stu2 = new Student(18,"ajie",99.5);//验证静态代码块只执行一次
}
}
static关键字的注意事项
class Student
{
int age;
String name;
double score;
static int data;//(1)类变量(静态变量)
static void test(){
System.out.println(this.age);//会报错 静态方法中不能出现this关键字
System.out.println(age);//会报错 静态方法中只能访问外部的静态成员 比如data
}
void introduce(){
System.out.println("名字:"+name + " 年龄:"+age + " 分数:"+score);
}
}
十、方法重载:overload
十一、包:package
打包的意义:
package —— 声明包
怎样使用其他包中的公开类?
java.util.Data today = new java.util.Date();
import java.util.Date
实际地去做一个包
一个类可以使用同一个包中的所有类
一个类可以使用其他包中的所有公开类
评论(0)
您还未登录,请登录后发表或查看评论